我试图掌握在 Swing 中做图形的技巧(画线等)。到目前为止,我看到的所有教程都声明了一个覆盖的类paintComponent
,并且所有paintComponent
方法都做了一些设置的、特定的事情,比如绘制一个红色方块(尽管他们可能每次都在不同的位置绘制它)。或者,也许他们画了许多线条和形状,但该paintComponent
方法一次完成了所有事情。
我试图弄清楚:假设我想在一个组件中绘制一个东西,然后在它上面绘制其他东西,而不擦除我之前绘制的东西。我的第一个想法是让我的
paintComponent
覆盖调用回调。
import java.awt.*;
import javax.swing.*;
public class DrawTest {
private interface GraphicsAction {
public void action (Graphics g);
}
private static class TestPanel extends JPanel {
private GraphicsAction paintAction;
public void draw (GraphicsAction action) {
paintAction = action;
repaint();
}
@Override
public void paintComponent (Graphics g) {
super.paintComponent (g);
if (paintAction != null)
paintAction.action(g);
}
}
private static void createAndShowGui() {
JFrame frame = new JFrame ("DrawTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setPreferredSize(new Dimension(500,500));
TestPanel p = new TestPanel ();
frame.getContentPane().add(p);
frame.pack();
frame.setVisible(true);
p.repaint();
p.draw (new GraphicsAction () {
public void action (Graphics g) {
g.setColor(Color.RED);
g.drawLine(5, 30, 100, 50);
}
});
// in real life, we would do some other stuff and then
// later something would want to add a blue line to the
// diagram
p.draw (new GraphicsAction () {
public void action (Graphics g) {
g.setColor(Color.BLUE);
g.drawLine(5, 30, 150, 40);
}
});
}
public static void main (String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowGui();
}
});
}
}
这行不通。出现蓝线,但没有红线。我猜这是因为当我画蓝线时repaint()
indraw
会导致一切重新开始,但我不确定;无论如何,我不知道怎么
paintComponent
才能被调用。
另外,如果我Thread.sleep(1000)
在两个p.draw
电话之间加上一个,我什至一秒钟都看不到红线。所以我完全不清楚如何让我的图形在我想要的时候显示出来。
我在 Swing 中对“增量图形”进行了一些搜索,但没有任何帮助找到解决方案。我找到了一篇 Oracle 文章“在 AWT 和 Swing 中绘画”,其中讨论了覆盖update()
实现增量图形的方法,但我还没有找到任何实际示例。
那么我怎么才能让它做我想做的事呢?这似乎是一项足够常见的任务,应该有一种简单的方法来完成它,但我还没有找到。我假设它应该在不调用的情况下是可行
getGraphics
的,根据其他 StackOverflow 响应,这充其量只是一种粗略。