2010-09-17 1 views
3

Я не очень хорош в этом, и я надеюсь получить помощь от людей, которые понимают проблему намного больше, чем я.Пользовательская покраска JPanel

Так вот сделка. В моей заявке есть фон JPanel с изображением, нарисованным над ним. Тогда есть небольшая JPanel, которую я пытаюсь создать для пользовательской картины. Я хотел иметь JPanel с закругленными углами и полупрозрачным фоном, поэтому я модифицировал метод paintComponent для заполнения полупрозрачного закругленного прямоугольника. Но когда я размещаю компоненты внутри, например, JComboBox, появляется список элементов, и я нажимаю на другое место, чтобы закрыть его. JPanel красит себя оригинальным способом, делая его полупрозрачным вокруг, но с маленьким прямоугольником, окрашенным в серый цвет фона. Я вижу, что он должен что-то делать с вызовом paintComponent на его parrent или paintChildren, но я не знаю, как организовать эти методы или куда их поместить. У меня также есть провал с прозрачными цветами, наложенными друг на друга.

Ниже приведен пример исходного кода:

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); 
    } 
} 

Я надеюсь, что некоторые будут помочь мне :-) спасибо

EDIT: Я обнаружил, что JComboBox (и всплывающее меню) рисует правильно, если всплывающее меню перекрывается за пределами JPanel, которое содержит JComboBox, и имеет собственный метод paintComponent.

ответ

2

Попробуйте это:

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

Иисус, я не пробовал это, потому что я думал, что RoundedPanel не красить вообще, я не вижу, что делает :-) большое спасибо, сэр! – Martin