ICo*_*mer 2 java swing paintcomponent
我正在用 Java 开发一个简单的绘画应用程序,但 Swing 不想合作。起初,我尝试制作一个包含DrawArea设置面板的 JTabbedPane,但由于某些奇怪的原因,触发了第二个mouseDragged()(以及扩展的 drawArea.repaint() 方法),JTabbedPane 似乎是重复的。想象一下两个相同的选项卡窗格垂直堆叠。我以为这只是 JTabbedPane 中的一些错误,但我使用面板上的 JButtons 将所有内容重写为一个非常简单的自定义菜单,并且发生了完全相同的事情。GUI 并没有真正复制顶部区域;它无法使用,我可以在上面绘画。一探究竟:

编辑:我发现了类似的问题。如果我调用 super.paintComponent(g),问题就会消失(并且 drawArea.setBackground(color) 实际上有效!),但是调用的函数super(对我来说是一个新关键字)基本上会重新绘制 drawArea,因此不再保存绘制轨迹。
如果我绘制一个矩形来填充绘图区域,即使 mouseDragged 仍然被触发,它也会覆盖问题。这是渲染代码:
@Override
public void mouseDragged(MouseEvent e) {
x = e.getX(); y = e.getY();
drawArea.repaint();
}
// (subclass):
class DrawArea extends JPanel {
public void paintComponent(Graphics g) {
g.setColor(Color.WHITE);
g.fillOval(x-3, y-3, 7, 7);
}
}
Run Code Online (Sandbox Code Playgroud)
这是 GUI 代码:
frame = new JFrame("Jadra");
frame.setSize(650, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
menu = new JPanel();
settingsButton = new JButton("Settings");
clearButton = new JButton("Clear");
exitButton = new JButton("Quit");
menu.setLayout(new FlowLayout());
menu.add(settingsButton);
menu.add(clearButton);
menu.add(exitButton);
menu.setBackground(new Color(30, 90, 60));
drawArea = new DrawArea();
drawArea.setBackground(Color.red);
drawArea.setOpaque(true);
drawArea.addMouseMotionListener(this);
frame.getContentPane().add(menu, BorderLayout.NORTH);
frame.getContentPane().add(drawArea, BorderLayout.CENTER);
Thread pt = new Thread(new Painter());
frame.setVisible(true);
pt.start();
Run Code Online (Sandbox Code Playgroud)
请告诉我我做了一些非常愚蠢的事情。否则这看起来像是一个非常烦人的错误。我真的很感谢你的帮助。谢谢!
您的DrawPanel.paintComponent()方法应该向上链接到它所覆盖的方法JPanel,以允许发生默认绘制。只需添加
super.paintComponent(g);
Run Code Online (Sandbox Code Playgroud)
作为此方法的第一行。