1

我有一个问题,当我打电话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);
                 }*/
            }
        }
    }
}
4

2 回答 2

3

这是我一段时间以来见过的最奇怪的代码,但是。你是即时的问题是你的mouseClicked事件......

将您的p.repaint调用替换为对 dialogsrevalidate方法的调用。

P p = new P(e.getX(), e.getY());
dialog.add(p);
dialog.revalidate();

你的 repaint 方法不会做任何事情,它在你的面板被实现之前被调用(连接到屏幕)

于 2013-06-09T06:45:55.220 回答
2

似乎您需要研究您坚持的编码风格。不过,把它留到后面的部分,只需将此方法添加到您的 M Class

public void setValues(int x, int y)
{
    this.x = x;
    this.y = y;
    repaint();
}

并成为pInstance VariableDialog班级。在您的mouseClicked()方法中,只需调用此方法即可。并删除构造函数部分,因为您JPanel为每个绘图初始化一个新的,我认为这在任何意义上都不好。当你简单地可以在同一个东西上画新东西时JPanel

于 2013-06-09T06:51:26.000 回答