最大化,最小化或调整JFrame大小时,圆圈消失.

Har*_*Joy 2 java geometry swing paintcomponent

这是我的代码:

    JFrame frame = new JFrame();
    frame.setSize(400, 400);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    final JPanel panel1 = new JPanel(){
        @Override
        protected void paintComponent(Graphics g) {
            int w = getWidth();
            int h = getHeight();
            for (int i = 0; i < w; i+=100) {
                g.drawLine(i, 0, i, h);
            }
        }
    };
    panel1.addMouseListener(new MouseListener() {
        @Override
        public void mouseReleased(MouseEvent arg0) {
        }
        @Override
        public void mousePressed(MouseEvent arg0) {
        }
        @Override
        public void mouseExited(MouseEvent arg0) {
        }
        @Override
        public void mouseEntered(MouseEvent arg0) {
        }
        @Override
        public void mouseClicked(MouseEvent arg0) {
            int x = arg0.getX();
            int y = arg0.getY();
            Graphics g = (Graphics) panel1.getGraphics();
            g.setColor(Color.black);
            g.fillOval(x, y, 100, 100);
        }
    });
    frame.add(panel1);
    frame.setVisible(true);
Run Code Online (Sandbox Code Playgroud)

它的作用是当我点击框架时,绘制一个圆圈.绘制一些圆圈后,当我最大化或最小化或调整框架大小时,圆圈消失.我怎么解决呢?

Sta*_*avL 7

您应该覆盖面板的paintComponent()方法.圆圈应添加到列表中.在paintComponent()中调用super,然后遍历列表绘制每个圆圈.

  • @mark:没有人提到*为什么*你的错误发生了,你需要了解你在组件重新绘制时通过调用组件上的`getGraphics()`获得的Graphics对象将被销毁,从而破坏任何绘图你已经完成了它.因此,通常您不希望以这种方式获取Graphics对象,而是希望使用JVM传递给paintComponent方法的Graphics对象.请注意,此Graphics对象也不是永久性的,但是没关系,因为当发生这种情况时,您的绘图将使用新的Graphics对象重做 (2认同)