Swing - метод paintComponent не вызывается - PullRequest
5 голосов
/ 13 сентября 2011

я просто реализовал класс, который наследует JPanel, как показано ниже

public class Orpanel extends JPanel {

....
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g;
        g2d.setPaint(tpaint);
        g2d.fill(rect); 
    }
....
}

класс Orpanel загружает изображение и настраивает его собственный размер.

вот вопрос.

Вызов setContentpane из JFrame (экземпляр Orpanel) делает его работоспособным но когда я присоединяю Orpanel к JFrame, вызывая метод add () вместо setContentpane (я знаю, что setcontentpane не означает присоединение .. в любом случае), это не работает.

наконец понял, когда я использовал метод add (), компонент, который был добавлен в JFrame, не вызывает метод paintComponent (). хотя я вызываю метод repaint () вручную, метод paintComponent () по-прежнему не вызывается.

я что-то пропустил? любая помощь будет оценена!

спасибо заранее. Jaeyong Син.


я добавил дополнительный код.

public Test(OwPanel op) 
{
    super();
    Dimension monitor = Toolkit.getDefaultToolkit().getScreenSize();
    op.setBackground(Color.white);
    this.setBackground(Color.white);        
    this.setBounds(monitor.width / 2 - 200 , monitor.height / 2 - 200, 400, 400);       
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.setTitle("test");      
    this.setLayout(null);
    this.getContentPane().add(op);
    //this.setContentPane(op);
    this.setVisible(true);
    this.validate();
}

    public static void main(String[] args) {
    // TODO Auto-generated method stub

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            OwPanel op = new OwPanel("d:\\java_workplace\\img\\img1.jpg", 100, 100);
            OwLabel ol = new OwLabel("d:\\java_workplace\\img\\img2.jpg", 300, 50);
            Test tst =  new Test(op);
            tst.add(ol);
        }
    });

по-прежнему не работает, если метод setContentpane () заменен на getContentpane (). Add (). не путайся Owpanel и Orpanel это то же самое:)

Ответы [ 2 ]

5 голосов
/ 13 сентября 2011

В вашем примере кода я вижу, что вы выбрали НЕ использовать LayoutManager, это очень плохая идея, но в любом случае, если вы идете по этому пути, я вижу одну причину, по которой ваш Orpanel.paintComponent() не вызывается: это, вероятно, внутри кадра не видно!

Если у вас нет LayoutManager, то вы должны явно установить размер и расположение (через setBounds()) всех компонентов, добавляемых в фрейм.

Вероятно, вы этого не делали, поэтому размер экземпляра Orpanel, вероятно, равен 0, поэтому он никогда не будет окрашен.

0 голосов
/ 13 сентября 2011

Похоже, вы просто используете неправильные методы. Вы должны делать это при добавлении панели к фрейму:

frame.getContentPane().add(panel) ;
...