如何从MouseListener中访问值

时间:2016-11-10 14:07:03

标签: java swing vector mouselistener

我正在尝试更新变量' dest'按下鼠标位置。 但每当检查值是否已更新(在运行方法中)时,我发现它还没有。我哪里错了?

public class Boid extends JPanel implements Runnable{   
    private Vector2D dest = new Vector2D(300,300);

    public Boid ()          
        addMouseListener (new MouseAdapter() {          
            public void mousePressed (MouseEvent e) {           
                Boid.this.dest = new Vector2D(e.getX(), e.getY());
                System.out.println("mouse "+Boid.this.squareX);
            }
        });
    }


    public void run(){                      
        System.out.println(dest);       
    }

    public void drawBoid(Graphics g) {
        g.setColor(Color.red);
        g.drawLine((int)pos.getX(), (int)pos.getY(), (int)dest.getX(), (int)dest.getY());
    }

}

(编辑)的 我用以下方式调用run方法。不确定这是正确的方法,我从处理中走出来,所以这就是我认为它可能有用的方式......

public class GUI{
    private static Boid b = new Boid();
    private static Timer TT;    

    public static void main(String[] args) {    
            JFrame mainFrame = new JFrame("Boid GUI");
            mainFrame.setLocationRelativeTo(null);
            mainFrame.setResizable(false);
            mainFrame.setSize(640,480);
            mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            JPanel contentPanel = new JPanel();
            contentPanel.setPreferredSize(new Dimension(640,480)); 
            contentPanel.setBackground(Color.BLACK);

            mainFrame.add(contentPanel);
            mainFrame.setVisible(true);  

            ActionListener updateDrawing = new ActionListener() {
                public void actionPerformed(ActionEvent e) {                    
                    b.run();                       
                    b.drawBoid(contentPanel.getGraphics());

                }
            };

            TT = new Timer(50, updateDrawing);
            TT.start();
    }
}

也尝试了以下主要内容,但似乎只有boid.run方法才能运行'一旦:

public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

        public void run() {
            JFrame mainFrame = new JFrame("Boid GUI");
            mainFrame.setLocationRelativeTo(null);
            mainFrame.setResizable(false);
            mainFrame.setSize(640,480);
            mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            JPanel contentPanel = new JPanel();
            contentPanel.setPreferredSize(new Dimension(640,480)); 
            contentPanel.setBackground(Color.BLACK);

            mainFrame.add(contentPanel);
            setWindow(mainFrame);
            mainFrame.setVisible(true);  

            b.run();
        }
        });
}

2 个答案:

答案 0 :(得分:0)

您的整个设计不正确。这不是你自定义绘画的方式。

  1. 不需要定时器。
  2. 您不使用getGraphics()
  3.   

    我正在尝试更新变量' dest'按下鼠标位置

    一些绘画基础知识:

    1. 您需要覆盖面板的paintComponent(...)方法才能进行绘画。
    2. 在您的情况下,您需要在课堂上绘制一些属性。所以你需要像mouseX和mouseY这样的变量。然后,您需要一个像setMouseLocation(x, y)这样的方法来允许您更改这些变量。
    3. 当鼠标点击发生时,您使用新值调用面板的setMouseLocation(...)方法,然后在面板上调用repaint()
    4. 查看Custom Painting上Swing教程中的部分,了解更多信息和工作示例。

答案 1 :(得分:0)

将变量声明为“公共静态”将使其可以从项目的任何位置访问。