JFrame 框架调用 JPanel paintComponent
JFrame frame calls JPanel paintComponent
我实际上是在 Java 学习图形学。我无法理解此 JFrame
对象如何调用扩展 JPanel
的 MyDrawpanel
中的 paintComponent
方法。
frame.repaint()
再次调用 paintComponent
但是如何呢?为什么我不能像 drawPanel.repaint()
;
这样使用 MyDrawPanel
的 drawPanel
对象
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);
}
}
Why I cannot use drawPanel object of MyDrawPanel like drawPanel.repaint();
目前您的 frame
变量被定义为 instance
变量,因此可以在 class.
的任何方法中引用它
然而,您的 drawPanel
变量被定义为 local
变量,因此它只能在定义它的方法中被引用。
更改 drawPanel
变量,使其定义为 instance
变量,而不是 local
变量。然后就可以在actionPerformed(...)
方法中使用drawPanel.repaint()
了。
在面板上调用 repaint() 会更有效,因为只会重绘面板,而不是框架和按钮。
此外,您使用的是旧版本的 add(...) 方法。
frame.getContentPane().add(BorderLayout.SOUTH, button);
你应该使用:
frame.getContentPane().add(button, BorderLayout.SOUTH);
框架现在会将 add(...) 请求转发到内容窗格,因此您实际上可以使用:
frame.add(button, BorderLayout.SOUTH);
省去打字的时间。
我实际上是在 Java 学习图形学。我无法理解此 JFrame
对象如何调用扩展 JPanel
的 MyDrawpanel
中的 paintComponent
方法。
frame.repaint()
再次调用 paintComponent
但是如何呢?为什么我不能像 drawPanel.repaint()
;
MyDrawPanel
的 drawPanel
对象
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);
}
}
Why I cannot use drawPanel object of MyDrawPanel like drawPanel.repaint();
目前您的 frame
变量被定义为 instance
变量,因此可以在 class.
然而,您的 drawPanel
变量被定义为 local
变量,因此它只能在定义它的方法中被引用。
更改 drawPanel
变量,使其定义为 instance
变量,而不是 local
变量。然后就可以在actionPerformed(...)
方法中使用drawPanel.repaint()
了。
在面板上调用 repaint() 会更有效,因为只会重绘面板,而不是框架和按钮。
此外,您使用的是旧版本的 add(...) 方法。
frame.getContentPane().add(BorderLayout.SOUTH, button);
你应该使用:
frame.getContentPane().add(button, BorderLayout.SOUTH);
框架现在会将 add(...) 请求转发到内容窗格,因此您实际上可以使用:
frame.add(button, BorderLayout.SOUTH);
省去打字的时间。