Кадр JFrame вызывает JPanel paintComponent - PullRequest
0 голосов
/ 30 августа 2018

Я на самом деле изучаю графику на Java. Я не могу понять, как этот JFrame объект вызывает метод paintComponent в MyDrawpanel, который расширяет JPanel.

frame.repaint() снова вызвать paintComponent, но как? Почему я не могу использовать drawPanel объект MyDrawPanel как drawPanel.repaint();

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class SimpleGui3C implements ActionListener
{
    JFrame frame;

    public static void main(String[] args)
    {
        SimpleGui3C gui = new SimpleGui3C();
        gui.go();
    }

    public void go() 
    {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JButton button = new JButton("Change Colors");
        button.addActionListener(this);

        MyDrawPanel drawPanel = new MyDrawPanel();

        frame.getContentPane().add(BorderLayout.SOUTH, button);
        frame.getContentPane().add(BorderLayout.CENTER, drawPanel);
        frame.setSize(300,300);
        frame.setVisible(true);
    }

    public void actionPerformed(ActionEvent event)
    {
        frame.repaint();
    }
}

class MyDrawPanel extends JPanel
{
    public void paintComponent(Graphics g)
    {
        g.fillRect(0,0,this.getWidth(), this.getHeight());

        int red = (int)(Math.random() * 255);
        int green = (int)(Math.random() * 255);
        int blue = (int)(Math.random() * 255);

        Color randomColor = new Color(red,green,blue);
        g.setColor(randomColor);
        g.fillOval(70,70,100,100);
    }
}

1 Ответ

0 голосов
/ 30 августа 2018

Почему я не могу использовать объект drawPanel MyDrawPanel, например drawPanel.repaint ();

В настоящее время ваша переменная frame определена как переменная instance, поэтому на нее можно ссылаться в любом методе класса.

Однако ваша переменная drawPanel определяется как переменная local, поэтому на нее можно ссылаться только в методе, в котором она определена.

Измените переменную drawPanel, чтобы она определялась как переменная instance, а не local. Тогда вы можете использовать drawPanel.repaint() в методе actionPerformed(...).

Вызов repaint () на панели будет более эффективным, поскольку будет перекрашиваться только панель, а не рамка и кнопка.

Кроме того, вы используете старую версию метода add (...).

frame.getContentPane().add(BorderLayout.SOUTH, button);

Вы должны использовать:

frame.getContentPane().add(button, BorderLayout.SOUTH);

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

frame.add(button, BorderLayout.SOUTH);

чтобы сэкономить при печати. ​​

...