【发布时间】:2010-11-26 02:31:22
【问题描述】:
我已经使用 Netbeans 编写 Java 代码大约一年了,并且已经编写了很多数据操作代码,这些代码可以在屏幕上绘制图形。我一般在我的主窗口中植入一个JPanel对象,编写自定义绘画代码,根据需要调用repaint()方法。
但是今天,我第一次尝试从包含面板的类(对象)调用面板上的重绘。虽然编译器并没有发现任何问题,并且在调试模式下,它正确地单步执行了对repaint的外部调用,实际上并没有发生repaint,代码也没有真正进入repaint方法。
我写了一个极简程序来演示这个问题,如下所示(Main 被省略,因为它只包含设置两个屏幕面板的代码。)
---类的描述,首先包含绘图表面,其他重绘调用---
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Panel1 extends JComponent
{
GraphPnl graphPnl;
boolean colorFlag;
public Panel1()
{
setLayout(null);
colorFlag = true;
graphPnl = new GraphPnl();
graphPnl.setBounds(10, 10, 110, 110);
graphPnl.setBackground(Color.black);
add(graphPnl);
}//Panel1()
public class GraphPnl extends JPanel
{
//just draws a line segment, toggling color
@Override
public void paint(Graphics g)
{
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
if (colorFlag) {g2.setColor(Color.red);} else {g2.setColor(Color.green);}
g2.drawLine(10, 10, 50, 50);
}//paint
}//GraphPnl
}//Panel1
import javax.swing.*;
import java.awt.event.*;
public class Panel2 extends JComponent
{
JButton testBtn;
TestAction testAction;
Panel1 p1;
public Panel2()
{
p1 = new Panel1();
testBtn = new JButton("Click");
testBtn.setBounds(10, 10, 80, 30);
add(testBtn);
testAction = new TestAction();
testBtn.addActionListener(testAction);
}//Panel2()
public class TestAction implements ActionListener
{
public void actionPerformed(ActionEvent evt)
{
p1.colorFlag = ! p1.colorFlag;
p1.graphPnl.repaint();
}
}//TestAction
}//Panel2
如果有人对此有任何见解,或者知道解决方法,我会很高兴听到 从你那里。
提前感谢您提供任何见解。
约翰·多纳
【问题讨论】:
-
当然,窗口 1 的 repaint() 方法将在窗口 2 获得焦点时起作用。多线程与此无关,实际上与您想要的完全相反。所有 Swing 更新都应在 EDT 上完成。您接受的答案中的 cmets 毫无意义。提供的其他答案为您提供了问题的真正解决方案(基于您提供的有限代码,因为您尚未发布 SSCCE)。祝你好运。
标签: java swing methods repaint