我有一个问题,当我在JDialog
上调用repaint()
时,我在屏幕上看不到任何东西,但是当我自己移动JDialog
时,我看到了我想要画的东西。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class dude extends JFrame {
private static int cnt = 0;
public dude() {
super("ff");
makeFrame();
}
public void makeFrame() {
new Dialog(this);
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setSize(400, 400);
setVisible(true);
}
private class Dialog extends JDialog {
public Dialog(JFrame frame) {
super(frame, "ff", true);
makeFrame();
}
public void makeFrame() {
getContentPane().addMouseListener(new M(this));
setDefaultCloseOperation(HIDE_ON_CLOSE);
pack();
setLocation(200, 200);
setSize(400, 400);
setVisible(true);
}
private class M extends MouseAdapter {
private JDialog dialog;
public M(JDialog dialog) {
this.dialog = dialog;
}
public void mouseClicked(MouseEvent e) {
P p = new P(e.getX(), e.getY());
p.repaint();
dialog.add(p);
}
private class P extends JPanel {
private int x, y;
public P(int x, int y) {
this.x = x;
this.y = y;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.black);
g.drawOval(x, y, 10, 10);
}
/*public void paint(Graphics g)
{
g.setColor(Color.black);
g.drawOval(x,y,10,10);
}*/
}
}
}
}
这是我最近看到的最奇怪的一段代码,但是。你的问题是你的mouseClicked
事件……
将p.repaint
调用替换为对dialog的revalidate
方法的调用。
P p = new P(e.getX(), e.getY());
dialog.add(p);
dialog.revalidate();
你的重绘方法无论如何都不会做任何事情,它在你的面板被实现(连接到屏幕)之前被调用
似乎你需要看看你坚持的编码风格。不过,请将此留到后面的部分,只需将此方法添加到您的M类
public void setValues(int x, int y)
{
this.x = x;
this.y = y;
repaint();
}
并使p
和Instance Variable
的Dialog
类。在mouseClicked()
方法中,只需调用这个方法。并删除构造函数部分,因为你初始化一个新的JPanel
为每个图纸,我想在任何意义上都不好。当你可以简单地绘制新的东西在相同的JPanel