我实际上是在用 Java 学习图形。我无法理解这个JFrame对象如何调用extends的paintComponent方法。MyDrawpanelJPanel在frame.repaint()再次调用paintComponent但如何?为什么我不能使用like 的drawPanel对象;MyDrawPaneldrawPanel.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 回答
慕工程0101907
TA贡献1887条经验 获得超5个赞
为什么我不能像 drawPanel.repaint() 那样使用 MyDrawPanel 的 drawPanel 对象;
当前,您的frame
变量被定义为instance
变量,因此可以在类的任何方法中引用它。
但是,您的drawPanel
变量被定义为local
变量,因此只能在定义它的方法中引用。
更改drawPanel
变量,使其定义为instance
变量,而不是local
变量。然后就可以drawPanel.repaint()
在actionPerformed(...)
方法中使用了。
在面板上调用 repaint() 会更有效,因为只会重绘面板,而不是框架和按钮。
此外,您使用的是旧版本的 add(...) 方法。
frame.getContentPane().add(BorderLayout.SOUTH, button);
你应该使用:
frame.getContentPane().add(button, BorderLayout.SOUTH);
并且框架现在会将 add(...) 请求转发到内容窗格,因此您实际上可以使用:
frame.add(button, BorderLayout.SOUTH);
为自己节省一些打字时间。
添加回答
举报
0/150
提交
取消