repaint()在JDialog上不起作用



我有一个问题,当我在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();
}

并使pInstance VariableDialog类。在mouseClicked()方法中,只需调用这个方法。并删除构造函数部分,因为你初始化一个新的JPanel为每个图纸,我想在任何意义上都不好。当你可以简单地绘制新的东西在相同的JPanel

最新更新