Hallo Leute
habe ein Problem mit meinen JButtons. Habe alle Effekte von Swing soweit entfernt und nur noch die Icons pressed etc. drauf. Die Icons sind aber nicht rechteckig. Deshalb hab ich png Bilder mit alpha Kanal genommen. Klappt soweit auch super gut.
Wenn ich jetzt allerdings auf den Button draufklicke, zeichnet der den neu (mit dem Pressed-Icon). Er zeichnet allerdings die Pixel nicht vollkommen neu (von der untersten Schicht angefangen), sondern nur ab dem Component, auf dem er ist. Da meint JPanel, auf dem der JButton drauf ist allerdings ebenfalls einen Background mit alpha Kanal hat, zeichnet der sich immer wieder einfach drüber, sodass nach und nach der alpha effekt vom Background an der Stelle des JPanels verschwindet (100% Alpha Wert).
Jetzt will ich natürlich nicht jedesmal repaint aufrufen müssen, nachdem ein Button geklickt wurde und das ganze Window neu zeichnen lassen (was doch recht aufwendig wäre).
Gibt es da ein geschicktes Vorgehen?
JButton mit PNG Icon und Alpha Kanal auf JPanel mit Background und Alpha Kanal
-
-
Ich hab schon einmal Buttons mit transparenten PNGs versehen und hatte nie Probleme - kannst du mal den Code posten?
-
Das Problem ist ja nicht die Combo JButton plus transparentes PNG sondern JButton plus transparentes PNG plus transparentes JPanel.
Hier mal der Code dazu:Java
Alles anzeigenimport java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import javax.swing.event.*; public class GeradeAusgedachtMitCodeAusschnitten extends JFrame { private JPanel pn_Background = new JPanel(null); private JPanel pn_Status = new JPanel(null); private JButton bt_BauStr = new JButton(); private ImageIcon[] buttonIcons = new ImageIcon[]{ new ImageIcon("pic_norm.png"), new ImageIcon("pic_press.png") }; public GeradeAusgedachtMitCodeAusschnitten () { super("Hallo"); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setSize(300, 300); Container cp = getContentPane(); cp.setLayout(null); pn_Background.setOpaque(true); pn_Background.setBounds(0, 0, 300, 300); pn_Background.setBackground(Color.BLUE); cp.add(pn_Background); pn_Status.setOpaque(true); pn_Status.setBackground(new Color(200, 200, 200, 50)); pn_Status.setBounds(0, 100, 300, 200); pn_Background.add(pn_Status); bt_BauStr.setBounds(10, 5, pn_Status.getHeight()-10, pn_Status.getHeight()-10); bt_BauStr.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { //bisher noch nichts } }); bt_BauStr.setOpaque(false); bt_BauStr.setBorderPainted(false); bt_BauStr.setContentAreaFilled(false); bt_BauStr.setFocusPainted(false); bt_BauStr.setMargin(new Insets(0,0,0,0)); bt_BauStr.setPressedIcon(buttonIcons[1]); bt_BauStr.setIcon(buttonIcons[0]); pn_Status.add(bt_BauStr); setResizable(false); setVisible(true); } public static void main(String[] args) { new GeradeAusgedachtMitCodeAusschnitten (); } }
Ich hoffe der funktioniert auch bei euch ^^. Demonstriert denke ich ganz gut was ich meine.
Momentan ist es so, dass ich zwar nicht das ganze Window neu zeichne, aber den gesamten bereich des Panels, auf dem der Button drauf ist, indem ich in der paintComponents methode vom JPanel, die paintComponent Methode vom JPanel aufrufe in der ich dann über getParent().paintComponent(g); (Wobei g ja noch den Clip vom JPanel hat oder?) den entscheidenden Teil des darunterliegenden Panels neu zeichne.
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!