repaint()不能处理JDialog

时间:2013-06-09 06:36:09

标签: java swing jpanel mouseevent mouse-listeners

我遇到问题,当我在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);
                 }*/
            }
        }
    }
}

2 个答案:

答案 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

上绘制新东西时