我遇到问题,当我在repaint()
上拨打JDialog
时,我在屏幕上看不到任何内容,但当我移动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);
}*/
}
}
}
}
答案 0 :(得分:2)
这是我见过一段时间的最奇怪的代码,但是。你的问题是mouseClicked
事件......
通过调用对话框p.repaint
方法替换您的revalidate
来电。
P p = new P(e.getX(), e.getY());
dialog.add(p);
dialog.revalidate();
你的重绘方法没有做任何事情,在面板实现之前被调用(连接到屏幕)
答案 1 :(得分:2)
似乎你需要研究你所遵循的编码风格。但是,对于后一部分,只需将此方法添加到M类
public void setValues(int x, int y)
{
this.x = x;
this.y = y;
repaint();
}
让p
成为Instance Variable
班级的Dialog
。在mouseClicked()
方法中,只需调用此方法即可。并删除构造函数部分,因为您为每个绘图初始化一个新的JPanel
,我认为这在任何意义上都不好。当你可以在同一JPanel