0

私が書いたこの単純なプログラムが、マウスがトラッキング エリア (白い 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();
        }

    }

}
4

3 に答える 3

2

Concurrency in Swingチュートリアルをご覧ください。ループで初期 スレッドを完全に占有し、 Event Dispatch Threadwhile(true)の外部でユーザー インターフェイスを更新しています。

イベント リスナーの概要を参照して、Swing イベント モデルに慣れ、特にマウス モーション リスナーの例については、マウス モーションリスナーの作成方法を参照してください。

于 2012-09-04T23:55:30.020 に答える
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);
    }
}
于 2012-09-04T23:54:46.573 に答える
1

coorPanel.getMousePosition()null でないかどうかを確認しますが、 (this.) を参照しgetMouseLocation()ます。チェックで getMousePosition とだけ言うように変更して、印刷を追加してみてください。

if( this.getMousePosition() != null ){
    System.out.println(getMousePosition());
    coorLabel.setText("Mouse Coordinates: "+getMousePosition().x+", "+getMousePosition().y);
    coorLabel.repaint();
}
于 2012-09-04T23:45:15.013 に答える