回调和听众;的MouseListener

时间:2014-10-18 01:54:16

标签: java swing callback awt listeners

我试图与听众一起编写一个项目,我已经让我的按钮在他们改变颜色的地方工作,现在我需要我的mouseLIsteners来打印鼠标正在做什么的文本。例如:"鼠标已进入黄色区域,鼠标已退出黄色区域,鼠标已点击/释放黄色区域等" 我实现了它们,但没有任何工作要打印文本。这是我的代码:

          import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

 import javax.swing.JButton;
 import javax.swing.JFrame;
 import javax.swing.JPanel;

import java.awt.GridLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;

import javax.swing.JComponent;

public class SwingLab
{

 // frame properties
 private static final int FRAME_WIDTH = 400; private static final int FRAME_HEIGHT = 400;

 public static void main(String[] args)
 {
 // Instantiate a frame (the main window)
 JFrame frame = new JFrame();

 // The buttons (one for each color)
 final JButton bRed = new JButton("Red");
 JButton bYellow = new JButton("Yellow");
 JButton bBlue = new JButton("Blue");


 // Here we create a panel consisting of other panels (layed out in a
 // Grid) to support the buttons and "Art" instance

 final JPanel container = new JPanel(new GridLayout(2,1));
 final JPanel panel = new JPanel(new GridLayout(1,1));
 final JPanel buttonPanel = new JPanel( new GridLayout(3,1) );

 // An instance of a special class for you to play with (Art is defined
 // below)
 Art artBox=new Art();
 panel.add(artBox);

 // add the buttons to the panel
 buttonPanel.add(bRed);
 buttonPanel.add(bYellow);
 buttonPanel.add(bBlue);

 // put the panels together and add them to the frame
 container.add(panel);
 container.add(buttonPanel);
 frame.add(container);


 /* YOUR CODE GOES HERE */

 // declare your listener classes and add them to the buttons
 // here.
 // you are going to call addActionListener and
 // addMouseListener for each button
 // you want to deal with the JPanel named "panel" declared
 // above


 /*  END YOUR CODE */
 class RedButtonListener implements ActionListener, MouseListener

 {

 public void actionPerformed(ActionEvent event)

 {
 panel.setBackground(Color.RED);  
}


@Override
public void mouseClicked(MouseEvent e) {
    bRed.addMouseListener(this);
     addMouseListener(this);
    // TODO Auto-generated method stub

}

3 个答案:

答案 0 :(得分:6)

XxxxListener除非你把它添加到某个东西,否则不会工作,除非它实际上听某事。要使MouseListener做出反应,需要通过someComponent.addMouseListener(myMouseListener)将其添加到已侦听的组件中。您将需要阅读有关侦听器的教程以获取详细信息。第一次Google点击Java Swing MouseListener TutorialMouseListener Tutorial

我对你的问题的主要批评是,你在没有先尝试的情况下询问如何做某事,对不起,但这不是你将如何学习编程。有可用的教程,您可以轻松获得计算机编程实验室,因此请使用它。试验,玩耍,编写代码,运行它,更改它,将其推到极限然后超越,找出哪些方法无效。相信我,你不会炸毁你的电脑,你不会从努力中带来厄运和诅咒。对于可以通过测试回答的简单问题,请不要在这里问我们 - 自己找出答案。这就是学习和编程的全部内容。


修改

好的,您正在添加MouseListener的MouseListener ,但这不会起作用。为什么不将它添加到类的构造函数或其他一些init或set方法中呢?此外,您的编译器会抱怨,因为实现MouseListener的类没有实现MouseListener接口的所有方法,并且不允许这样做(除非该类是抽象的,这不是你的意思想)。所以给它剩下的MouseListener方法。

例如:

public class Foo extends JPanel {
   private JButton button = new JButton("Button");

   public Foo() {
      MyListener myListener = new MyListener();
      button.addActionListener(myListener);
      button.addMouseListener(myListener);

      add(button);
   }

其中

class MyListener implements MouseListener, ActionListener { 
     //.....  bunch of code here
}

答案 1 :(得分:3)

您只是将侦听器添加为ActionListener,因此从该接口实现的方法正在运行,但您尚未将其添加为MouseListener,因此它不会接收回调事件。但是我同意HoverCraft的说法,你将从你的教授那里学到任何东西来处理你的代码以及我们为你做的事情。实际上,如果你想学习Swing,你应该自己实现整个程序。

答案 2 :(得分:0)

你的程序有很多问题。首先,你没有从EDT更新小部件,你需要将main()的全部内容放入一个可运行的invokeLater中。

其次,您需要定义侦听器,然后将它们安装到按钮上,然后才能在屏幕上显示,而不是在侦听器本身内部。单击按钮时,以下程序将切换颜色,并在鼠标退出并进入按钮时更改按钮文本。

我使用了MouseAdapter而不是mouseListener,因为它已经为MouseListener的所有必需方法定义了默认的,无操作的方法。所以代码变得不那么混乱了:

    package swing;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class testFrame {

    public static void showFrame() {
        JFrame frame = new JFrame();
        frame.setLocation(500, 500);
        frame.setSize(100, 100);
        final JButton button = new JButton("Test");
        button.setMaximumSize(new Dimension(80, 30));
        button.setSize(80, 20);
        frame.getContentPane().add(button);
        button.addMouseListener(new MouseAdapter() {

            boolean colourToggle = false;

            @Override
            public void mouseExited(MouseEvent e) {
                button.setText("Mouse Out");
            }

            @Override
            public void mouseEntered(MouseEvent e) {
                button.setText("Mouse In");
            }

            @Override
            public void mouseClicked(MouseEvent e) {
                if (colourToggle) {
                    button.setBackground(new Color(100, 200, 100));
                } else {
                    button.setBackground(new Color(255, 0, 150));
                }
                colourToggle = !colourToggle;
            }
        });
        frame.setVisible(true);
    }

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

            @Override
            public void run() {
                showFrame();
            }
        });
    }
}