我无法弄清楚为什么我写的这个简单程序在鼠标离开跟踪区域(白色JPanel)时尝试更新鼠标坐标时会得到一个IndexOutOfBounds异常。我认为第38行的检查会照顾它。有什么建议?谢谢!
import java.awt.*;
import javax.swing.JFrame;
public class MainFrame extends JFrame {
private static final long serialVersionUID = 1L;
Label coorLabel;
Panel coorPanel, content;
public MainFrame(String s){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container cont = getContentPane();
coorLabel = new Label("Mouse Coordinates: ");
coorPanel = new Panel();
coorPanel.setPreferredSize(new Dimension(400,400));
coorPanel.setBackground(Color.WHITE);
/**
content = new Panel();
content.add(coorPanel, BorderLayout.PAGE_START);
content.add(coorLabel, BorderLayout.PAGE_END);
**/
cont.add(coorPanel, BorderLayout.PAGE_START);
cont.add(coorLabel, BorderLayout.PAGE_END);
pack();
setVisible(true);
}
public void updateCoor(){
if(coorPanel.getMousePosition()!=null){
coorLabel.setText("Mouse Coordinates: "+getMousePosition().x+", "+getMousePosition().y);
coorLabel.repaint();
}
}
public static void main(String[]args){
MainFrame frame = new MainFrame("Coor App");
while(true){
frame.updateCoor();
}
}
}
答案 0 :(得分:2)
查看Concurrency in Swing教程。你正在完全占据初始
带有while(true)
循环的线程并更新事件调度线程之外的用户界面。
请参阅Introduction to Event Listeners以熟悉Swing事件模型,特别是How to Write a Mouse-Motion Listener以了解鼠标移动侦听器示例。
答案 1 :(得分:1)
您检查coorPanel.getMousePosition()
是否为空,然后引用(此。)getMouseLocation()
;尝试将其改为仅在支票中说出getMousePosition,并添加一个打印:
if( this.getMousePosition() != null ){
System.out.println(getMousePosition());
coorLabel.setText("Mouse Coordinates: "+getMousePosition().x+", "+getMousePosition().y);
coorLabel.repaint();
}
答案 2 :(得分:1)
这是你应该做的:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.*;
public class Stack extends JFrame implements MouseMotionListener{
int x;
int y;
JPanel p = new JPanel();
JPanel detectPanel = new JPanel();
JTextField t = new JTextField(10);
JLabel l = new JLabel("Position's inside of bordered panel: ");
public Stack(){
setLayout(new BorderLayout());
t.setEditable(false);
p.add(l);
p.add(t);
detectPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
add(p,BorderLayout.NORTH);
add(detectPanel,BorderLayout.CENTER);
detectPanel.addMouseMotionListener(this);
}
public static void main(String[] a){
SwingUtilities.invokeLater(new Runnable(){
public void run(){
Stack s = new Stack();
s.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
s.setLocationByPlatform(true);
s.setPreferredSize(new Dimension(640,480));
s.pack();
s.setVisible(true);
}
});
}
public void mouseDragged(MouseEvent e) {
}
public void mouseMoved(MouseEvent e) {
x= e.getX();
y= e.getY();
t.setText(x+", "+y);
}
}