1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Deutsch
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

JButton mit PNG Icon und Alpha Kanal auf JPanel mit Background und Alpha Kanal

  • Nicholas1991
  • 3. Januar 2010 um 20:46
  • Unerledigt
  • Nicholas1991
    9
    Nicholas1991
    Mitglied
    Punkte
    770
    Beiträge
    122
    • 3. Januar 2010 um 20:46
    • #1

    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?

  • java-girl
    14
    java-girl
    Mitglied
    Reaktionen
    7
    Punkte
    2.037
    Beiträge
    357
    • 3. Januar 2010 um 21:18
    • #2

    Ich hab schon einmal Buttons mit transparenten PNGs versehen und hatte nie Probleme - kannst du mal den Code posten?

    There's no better place than 127.0.0.1!

  • Nicholas1991
    9
    Nicholas1991
    Mitglied
    Punkte
    770
    Beiträge
    122
    • 3. Januar 2010 um 21:43
    • #3

    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
    import 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 ();
        } 
    }
    Alles anzeigen




    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.

    Einmal editiert, zuletzt von Nicholas1991 (3. Januar 2010 um 21:50)

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung

  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  • Deutsch
  • English
Zitat speichern