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.println
的 mousePressed
方法也没有打印在控制台上。
我做错了什么?
问题是我没有设置面板的大小,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);
}
现在布局管理器可以正常工作了。
我正在尝试做一些非常基本的事情:编写程序在两点之间的框架上画一条线:按下鼠标的点和释放鼠标的点。
我有这些 类:
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.println
的 mousePressed
方法也没有打印在控制台上。
我做错了什么?
问题是我没有设置面板的大小,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);
}
现在布局管理器可以正常工作了。