【问题标题】:Regarding adding of Rectangle when mouse is clicked on JFrame关于在 JFrame 上单击鼠标时添加 Rectangle
【发布时间】:2017-03-09 16:26:35
【问题描述】:

我是初学者。我正在尝试使用多个内部类在 JFrame 上添加填充矩形或任何其他图形。我收到调试错误。这里有什么问题?如果这是错误的方法。请告诉我如何仅使用 JFrame 和 JPanel 来做同样的事情。

import java.util.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
import java.io.*;

public class RainBow{

    JFrame frame;

    public static void main(String[] args){
        RainBow bow = new RainBow();
        bow.go();
    }

    public class Paint extends JPanel{
        public void paintComponent(Graphics g){
            g.setColor(Color.red);
            g.fillRect(100, 100, 100, 100);

        }
    }

    public void go(){
        frame.addMouseListener(new ListenMouse());
        frame.setSize(400, 400);
        frame.setVisible(true);
    }

    public class ListenMouse implements MouseListener{
        public void mosueClicked(MouseEvent a){
            Paint p = new Paint();
            frame.getContentPane().add(p);
            frame.setVisible(true);
        }

        @Override
        public void mouseClicked(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseEntered(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseExited(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mousePressed(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseReleased(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

}

}

【问题讨论】:

  • 发生了哪些“调试错误”?您是如何尝试修复它们的?

标签: java swing graphics mouse frame


【解决方案1】:

发布的代码有多个问题。请参阅此工作示例,并在 cmets 中进行解释。

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

public class RainBow {

    JFrame frame;
    boolean paintRectangle = false;

    public static void main(String[] args) {
        RainBow bow = new RainBow();
        bow.go();
    }

    public class Paint extends JPanel {

        public void paintComponent(Graphics g) {
            super.paintComponent(g); // should always be done
            if (paintRectangle) {
                g.setColor(Color.red);
                g.fillRect(100, 100, 100, 100);
            }
        }
    }

    public void go() {
        frame = new JFrame(); // otherwise NPE
        Paint paint = new Paint();
        paint.addMouseListener(new ListenMouse()); // add listner to paint
        frame.add(paint); // add paint at start-up
        frame.setSize(400, 400);
        frame.setVisible(true);
        // ensures JVM shuts down when frame is closed.
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }

    public class ListenMouse extends MouseAdapter {

        // this method is incorrectly spelled!
        public void mosueClicked(MouseEvent a) {
        }

        @Override
        public void mouseClicked(MouseEvent arg0) {
            /* requires special handling to add components on the fly */
            //Paint p = new Paint(); 
            paintRectangle = true;
            frame.repaint(); // forces the Paint to be painted as well.
        }
    }
}

【讨论】:

  • 很高兴覆盖getPreferredSize,但由于他们使用的是BorderLayout而不是pack,他们不会看到这样做的效果
  • @MadProgrammer 是的。不过,我决定在此之前停止,以解决代码的主要问题(包括发布的代码,它没有超过NPE!)。
  • 是的,最好不要在过去的传球中压倒他们:P
  • 为什么有两个mousClicked方法?
  • "..为什么有两个 mousClicked 方法?" 伙计,你需要三重检查你的拼写。没有mousClicked 方法,一个mosueClicked 方法(就像你最初拼写的那样)& 有一个被覆盖的mouseClicked 方法。尝试将所有这 3 个文件复制到单个文本文档中的单独行,然后逐个比较它们。另请注意,如果您在拼写错误的方法上使用了@Override 表示法,编译器会警告它拼写错误(通过显示编译错误)。
猜你喜欢
  • 2022-10-06
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多