3 Stimmen

Benutzerdefinierte Malerei von JPanel

Ich bin nicht sehr gut darin, und ich hoffe, dass ich Hilfe von Leuten bekomme, die das Thema viel besser verstehen als ich.

Es geht also um Folgendes. In meiner Anwendung gibt es einen JPanel-Hintergrund mit einem darüber gezeichneten Bild. Dann gibt es eine kleine JPanel, die ich versuche, benutzerdefinierte Malerei für erstellen. Ich wollte JPanel mit abgerundeten Ecken und halbtransparentem Hintergrund haben, so dass ich paintComponent Methode modifiziert, um halbtransparentes abgerundetes Rechteck zu füllen. Aber wenn ich Komponenten innerhalb wie sagen JComboBox platzieren, die Liste der Elemente erscheint und ich irgendwo anders klicken, um es zu schließen JPanel malt sich in ursprüngliche Weise machen es halbtransparent rund um aber mit kleinen Rechteck mit ursprünglichen grauen Hintergrundfarbe gemalt. Ich sehe, dass es etwas mit dem Aufrufen von paintComponent auf seine parrent oder paintChildren zu tun hat, aber ich weiß nicht, wie man diese Methoden zu organisieren oder wo sie zu setzen. Ich habe auch Probleme mit transparenten Farben, die sich gegenseitig überlagern.

Hier ist ein Beispiel-Quellcode:

public class RoundedPanel extends JPanel {

   private final int radius;

   public RoundedPanel(int cornerRadius) {
      radius=cornerRadius;
   }

   public void paintComponent(Graphics g) {
        Color bg = getBackground();
        g.setColor(new Color(bg.getRed(),bg.getGreen(),bg.getBlue(),40));
        g.fillRoundRect(0,0, getWidth()-1, getHeight()-1, radius, radius);
        g.setColor(new Color(0,0,0,70));
        g.drawRoundRect(0,0, getWidth()-1, getHeight()-1, radius, radius);
   }

   public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setSize(400, 300);
        frame.setLocation(400, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel content = new JPanel();
        JPanel wl = new JPanel();
        JPanel el = new JPanel();
        JPanel sl = new JPanel();
        JPanel nl = new JPanel();
        RoundedPanel rp = new RoundedPanel(50);
        JComboBox combobox = new JComboBox();

        frame.setContentPane(content);
        content.setBackground(Color.red);
        content.setLayout(new BorderLayout());
        wl.add(new JButton("west"));
        el.add(new JButton("east"));
        sl.add(new JButton("south"));
        nl.add(new JButton("north"));
        content.add(wl,BorderLayout.WEST);
        content.add(el,BorderLayout.EAST);
        content.add(nl,BorderLayout.NORTH);
        content.add(sl,BorderLayout.SOUTH);

        content.add(rp,BorderLayout.CENTER);
        rp.setBackground(Color.BLACK);

        combobox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Trída 1.B", "Trída 1.C", "Trída 2.C" }));
        rp.add(combobox);
        frame.setVisible(true);
    }
}

Ich hoffe, dass mir jemand helfen kann :-) danke

EDIT: Ich habe herausgefunden, dass JComboBox (und sein Popup-Menü) korrekt gezeichnet wird, wenn das Popup-Menü außerhalb des JPanels überlappt, das JComboBox enthält und die benutzerdefinierte paintComponent-Methode hat.

2voto

Ash Punkte 9056

Versuchen Sie dies:

RoundedPanel rp = new RoundedPanel(50);
rp.setOpaque(false);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X