gpt4 book ai didi

java - mousePressed 方法不会响应

转载 作者:太空宇宙 更新时间:2023-11-04 13:38:57 25 4
gpt4 key购买 nike

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

我有这些类(class):

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);
}

}

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

最佳答案

布局管理器的工作是确定添加到框架的组件的大小/位置。

面板大小为 (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);
}

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

关于java - mousePressed 方法不会响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31410507/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com