mousePressed 方法不会响应

mousePressed method won't respond

我正在尝试做一些非常基本的事情:编写程序在两点之间的框架上画一条线:按下鼠标的点和释放鼠标的点。

我有这些 类:

import java.awt.Graphics;

public class Line implements Drawable{
    private int x1,x2,y1,y2;
    public Line( int x1,int x2,int y1,int y2){
        this.x1=x1;
        this.x2=x2;
        this.y1=y1;
        this.y2=y2;
    }
    public void draw(Graphics g){
        g.drawLine(x1, y1, x2, y2);
    }
}

import java.awt.Graphics;

public interface Drawable {
    public void draw(Graphics g);
}

import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;

import javax.swing.JPanel;

@SuppressWarnings("serial")
public class LinePanel extends JPanel {
    ArrayList<Line> lines = new ArrayList<Line>();

    public LinePanel() {
        addMouseListener(new MouseAdapter() {
            Point p1, p2;

            @Override
            public void mousePressed(MouseEvent e) {
                p1 = e.getPoint();
                System.out.println("pressed");
            }

            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub
                System.out.println("clicked");

            }
            @Override
            public void mouseReleased(MouseEvent e) {
                p2 = e.getPoint();
                lines.add(new Line(p1.x, p1.y, p2.x, p2.y));
            }

        });
        System.out.println("after add mouselistener");
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (Line l : lines) {
            l.draw(g);
        }
    }
}

import javax.swing.JFrame;

public class LaunchLinesGui {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        JFrame frame=new JFrame();
        frame.setSize(500, 500);
        frame.setVisible(true);

        LinePanel panel=new LinePanel();
        frame.add(panel);
    }

}

问题是,当我在框架上的任何地方按下鼠标时,我没有任何反应,甚至 System.out.printlnmousePressed 方法也没有打印在控制台上。 我做错了什么?

问题是我没有设置面板的大小,frame 内的点击没有在 panel[=18= 内捕捉到].

解决方法是在 LinePanel 构造函数中添加 setSize(500, 500);

布局管理器的工作是确定添加到框架的组件 size/location。

您的面板大小为 (0, 0) 的原因是您在使框架可见后将面板添加到框架,因此永远不会调用布局管理器。

此外,您不应该设置框架的大小,您应该让布局管理器通过调用框架上的 pack() 方法来完成它的工作。

代码的正确顺序应该是:

    LinePanel panel=new LinePanel();

    JFrame frame=new JFrame();
    frame.add(panel);
    //frame.setSize(500, 500);
    frame.pack();
    frame.setVisible(true);

此外,当您进行自定义绘制时,面板负责确定自己的尺寸,因此您还需要重写面板的 getPreferredSize() 方法:

@Override
public Dimension getPreferredSize()
{
    return new Dimension(500, 500);
}

现在布局管理器可以正常工作了。