【问题标题】:Callbacks and listeners ; MouseListener回调和监听器;鼠标监听器
【发布时间】:2014-12-13 15:50:20
【问题描述】:

我正在尝试编写一个带有监听器的项目,我的按钮在它们改变颜色的地方工作,现在我需要我的 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

}

【问题讨论】:

  • 你的代码没有显示你的问题,除了你有很多不必要的冗余,但同样,这不是你的错误的原因。为了让我们提供帮助,您需要展示足够多的代码以便我们理解您的问题,但不要显示太多代码,以免过多与手头问题无关的代码让我们不知所措。如果您能花时间创建和发布minimal example program,那就最好不过了
  • 我是 java 新手,所以这可能就是冗余的原因。问题是我已经实现了侦听器和事件,但是当我在输入的事件中写 System.out.println("The mouse has enter the yellow area") 时,我没有 texg
  • 如果我们看不到您如何使用您的听众,您如何将它们添加到您的 GUI 中,我们如何猜测可能是什么问题?例如,我在任何地方都看不到addMouseListener(...)。那么它在哪里呢?事实上,你添加任何 MouseListeners 到任何东西?
  • 我实现了类的鼠标监听器,那么我要为每个类添加MouseListener吗?
  • 别问——试试吧!你有一个触手可及的计算机编程实验室,所以使用它。实验、玩耍、编写代码、运行、更改、将其推向极限然后超越,找出有效的方法和无效的方法。相信我,你不会炸毁你的电脑,你不会因为努力而带来厄运和诅咒。对于可以通过测试回答的简单问题,不要在这里问我们——自己去寻找。这就是学习和编程的意义所在!

标签: java swing callback awt listeners


【解决方案1】:

除非您将 XxxxListener 添加到某些内容中,否则 XxxxListener 将无法工作,除非它确实在侦听某些内容。为了让 MouseListener 做出反应,需要通过someComponent.addMouseListener(myMouseListener) 将其添加到已侦听的组件中。您将需要阅读有关侦听器的教程以获取详细信息。第一个谷歌点击Java Swing MouseListener TutorialMouseListener Tutorial

我对你的问题的主要批评是,你问的是如何在没有先尝试的情况下做某事,很抱歉,但这不是你学习编程的方式。有可用的教程,并且您有一个触手可及的计算机编程实验室,所以使用它。实验、玩耍、编写代码、运行、更改、将其推向极限然后超越,找出有效的方法和无效的方法。相信我,你不会炸毁你的电脑,你不会因为努力而带来厄运和诅咒。对于可以通过测试回答的简单问题,不要在这里问我们——自己去寻找。这就是学习和编程的意义所在。


编辑

好的,您将 MouseListener 添加到 MouseListener inside 中,这将不起作用。为什么不将它添加到您的类的构造函数或其他一些初始化或设置方法中?此外,您的编译器会抱怨,因为实现 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
}

【讨论】:

  • 我一整天都在尝试它,而且我越来越接近它了,这是我不能完全得到的最后一件事。我之前阅读了教程,并且通过尝试事情已经走到了这一步,但我只是卡住了。我似乎找不到要添加的正确位置。Mouselistener。每次我都会收到一个错误,即使我像教程一样表达它,我也没有文字
  • @ThomasNorman:如果您在尝试中遇到错误,您不应该向我们展示这个吗?否则我们怎么能猜出你可能做错了什么?
  • @ThomasNorman:请发布一个可编译和可运行的小型程序,或者最接近此的程序,正如我在对您的问题的第一条评论中提到的那样,mcve
  • @ThomasNorman:好的,您将 MouseListener 添加到 MouseListener inside 中,这是行不通的。为什么不将它添加到您的类的构造函数或其他一些初始化或设置方法中?此外,您的编译器会抱怨,因为实现 MouseListener 的类没有实现 MouseListener 接口的所有方法,这是不允许的(除非该类是抽象的,这不是您想要的)。所以给它剩下的 MouseListener 方法。
  • @ThomasNorman:chit,你的导师的代码cmets 告诉你应该在哪里添加你的听众! 批判性地阅读这些 cmets 是个好主意,不要忽视它们。
【解决方案2】:

您仅将侦听器添加为ActionListener,因此从该接口实现的方法正常工作,但您尚未将其添加为MouseListener,因此它不会接收这些事件的回调。但我同意 HoverCraft 的观点,你不会从你的教授那里学到任何东西来调整代码,而我们会为你做这件事。实际上,如果你想学习 Swing,你应该自己实现整个程序。

【讨论】:

    【解决方案3】:

    您的程序有很多问题。首先,您不是从 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();
                }
            });
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-02-21
      • 2015-11-30
      • 2013-07-20
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多