Java JPanel repaint() 问题?
Posted
技术标签:
【中文标题】Java JPanel repaint() 问题?【英文标题】:Java JPanel repaint() issue? 【发布时间】:2014-08-14 07:40:15 【问题描述】:我对 GUI 有点陌生。我创建了这个简单的应用程序,每次按下按钮时都会用不同的颜色绘制一个椭圆形。但是,当我调用JPanel
的repaint()
时,它不仅仅是重新绘制面板的框架部分(椭圆形)。相反,它会重新绘制整个框架,并且还会绘制我在框架顶部(北部边界)单击的按钮。我知道我可以简单地调用JFrame
的repaint()
来解决这个问题,但我只是想知道为什么会这样。我认为repaint()
所做的只是简单地调用对象的paintComponent()
。
有人可以解释为什么它会这样吗?
谢谢!!
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Jbutton extends JFrame implements ActionListener
JFrame frame;
JButton b;
panel p;
public void go()
frame = new JFrame();
b = new JButton("click me");
p = new panel();
b.addActionListener(this);
frame.add(BorderLayout.CENTER, p);
frame.add(BorderLayout.SOUTH, b);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
frame.setSize(250, 250);
frame.setVisible(true);
class panel extends JPanel
public void paintComponent(Graphics g)
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
g.setColor(new Color(red, blue, green));
g.fillOval(20, 30, 50, 50);
@Override
public void actionPerformed(ActionEvent arg0)
p.repaint();
【问题讨论】:
【参考方案1】:确保您正在调用 super.paintComponent
以准备 Graphics
绘制上下文
@Override
protected void paintComponent(Graphics g)
super.paintComponent(g)
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
g.setColor(new Color(red, blue, green));
g.fillOval(20, 30, 50, 50);
总而言之,Graphics
上下文是共享资源。在绘制周期中绘制的每个组件都将共享相同的Graphics
上下文,这意味着之前绘制的内容仍然存在。每次调用 paintComponent
时,您都需要清除/准备 Graphics
上下文。
这基本上就是paintComponent
所做的......
【讨论】:
以上是关于Java JPanel repaint() 问题?的主要内容,如果未能解决你的问题,请参考以下文章
如果在 JFrame 代码中调用 repaint(),JPanel 不会重新绘制