2010-09-17 6 views
3

Je ne suis pas très bon dans ce domaine et j'espère obtenir de l'aide de personnes qui comprennent le problème beaucoup plus que moi.Peinture personnalisée de JPanel

Alors, voici l'affaire. Dans mon application, il y a un fond JPanel avec Image dessiné dessus. Ensuite, il y a un petit JPanel pour lequel je suis en train de créer une peinture personnalisée. Je voulais avoir JPanel avec des coins arrondis et un fond semi-transparent, donc j'ai modifié la méthode paintComponent pour remplir le rectangle arrondi semi-transparent. Mais quand je place des composants à l'intérieur comme JComboBox, la liste des éléments apparaît et je clique ailleurs pour la fermer JPanel se peint de façon originale en le faisant translucide tout autour mais avec un petit rectangle peint avec la couleur de fond grise originale. Je vois qu'il doit faire quelque chose en invoquant paintComponent sur son parrent ou paintChildren mais je ne sais pas comment organiser ces méthodes ni où les mettre. J'ai aussi des problèmes avec des couleurs transparentes qui se chevauchent.

Voici un code source exemple:

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[] { "Třída 1.B", "Třída 1.C", "Třída 2.C" })); 
     rp.add(combobox); 
     frame.setVisible(true); 
    } 
} 

J'espère que certains seront me aider :-) Merci

EDIT: Je trouve que JComboBox (et son menu contextuel) TIRAGE correctement si le menu contextuel chevauche en dehors du JPanel qui contient JComboBox et a la méthode paintComponent personnalisée.

Répondre

2

Essayez ceci:

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

Jésus, je n'ai pas essayé parce que je pensais que le RoundedPanel ne serait pas la peinture du tout, je ne vois pas ce fait :-) merci beaucoup monsieur! – Martin