【问题标题】:mouseEntered and mouseExited method questionsmouseEntered 和 mouseExited 方法问题
【发布时间】:2014-07-31 23:19:48
【问题描述】:

在做家庭作业时,在使用 MouseListener 界面时,当鼠标光标进入和退出某个颜色区域(在本例中称为面板的 JPanel)时,我无法弄清楚如何打印一行文本。

我从底部面板中选择一种颜色(红色、蓝色或黄色),然后当我移动到顶部面板时,它应该能够打印鼠标在面板中时鼠标输入的颜色,并且当我的鼠标发现自己在所述面板之外时,我退出了哪种颜色...

希望这是有道理的。这是到目前为止我所拥有的代码sn-p。这是红色的:

class RedButtonListener implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {
            panel.setBackground(Color.RED); 
            class RedMouseListener implements MouseListener
            {

                public void mouseEntered(MouseEvent event) 
                { 

                }

                public void mouseExited(MouseEvent event) 
                { 

                }

                public void mousePressed(MouseEvent event) { }

                public void mouseReleased(MouseEvent event) { }

                public void mouseClicked(MouseEvent event) { }
            }
        }
    }
    ActionListener redListener = new RedButtonListener();
    bRed.addActionListener(redListener);

【问题讨论】:

  • 你永远不会将鼠标监听器添加到任何东西......
  • 欢迎来到 Stack Overflow!考虑提供一个实际的runnable example that demonstrates your problem 将涉及更少的猜测工作和更好的响应
  • addMouseListener,对吗?我是加在课内还是课外?
  • 没有更多上下文,很难知道应该在何处或何时添加它

标签: java swing mouselistener


【解决方案1】:

这是来自 Stack Overflow Mouse moved event within JPanel 的一个相关问题

我建议您确保正确监听触发器(尝试打印“Hello World”)从那里您需要在鼠标事件中获取颜色状态的通信。如果一切都在同一个实例中,您可以访问事件侦听器中所需的变量。

这里是 MouseEvent http://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseEvent.html的文档

确保您添加了鼠标侦听器尝试以下操作

panel.addMouseListener(new RedMouseListener());

开始简单的做以下工作

public void mouseEntered(MouseEvent event) 
{ 
    System.out.println("Hello World!");
}

如果您需要在事件侦听器中访问面板的颜色,请尝试以下 sn-p

panel.getBackground();

这将返回一个 Color 对象。

值得一提的是,使用匿名内部类可以避免额外的类声明。见How are Anonymous (inner) classes used in Java? 这些被覆盖的方法本质上是 MouseListener 的子类,但我们不需要通过名称来调用它。

panel.addMouseListener(new MouseListener(){ 
    @Override
    public void mouseReleased(MouseEvent e) {}

    @Override
    public void mousePressed(MouseEvent e) {}

    @Override
    public void mouseExited(MouseEvent e) {}

    @Override
    public void mouseEntered(MouseEvent e) {}

    @Override
    public void mouseClicked(MouseEvent e) {}
});

【讨论】:

  • 编译没有问题,但没有任何显示。无论我把 addMouseListener 放在哪里,它都会给我一个错误并且无法编译。我确实需要,对吧?
  • @Hunter 我正在做一个匿名类的例子,这会有所帮助。您是否与编写自己的 RedMouseListener 相关?
  • 啊,好吧,所以 addMouseListener 最终决定在那之后编译,但是当我将鼠标悬停在 RED 区域上时,仍然没有显示任何文本。我不确定你的意思,但我必须为三种颜色中的每一种制作一个 MouseListener。例如,我将单击红色按钮,JPanel 将变为红色。当我将鼠标悬停在该区域上时,它将打印“鼠标已进入红色区域”。当它移出 JPanel 时,它会说“鼠标已退出 RED 区域”。这将适用于所有三种颜色。
  • @Hunter 你能在其中一个听众或一堆 if 中做一个切换
  • 对不起,我不确定我会怎么做。我对 Java 还很陌生。
【解决方案2】:

简介

由于这是一个老问题,我想我应该整理一个简单的 Swing GUI 来说明 MouseListener 的工作原理。

这是我做任何事情之前的 GUI。

当鼠标移动到选择区域时,中心的主面板将呈现选择器颜色。当鼠标移出选择区域时,主面板将恢复原来的颜色。

这是我的鼠标位于蓝色选择区域时的 GUI。

说明

如果您不熟悉 Java Swing,Oracle 提供了一个有用的教程,Creating a GUI With Swing。跳过使用 NetBeans IDE 学习摇摆部分。密切关注Concurrency in SwingLaying Out Components Within a Container 部分。

创建 Swing GUI 时,我使用 model/view/controller (MVC) 模式。这种模式使我能够分离我的关注点并一次专注于应用程序的一个部分。

MVC 模式意味着您首先创建模型,然后是视图,然后是控制器。这更像是一个迭代过程而不是瀑布。

在 Java Swing 中,MVC 模式意味着:

  1. 视图从模型中读取信息。
  2. 视图可能不会更新模型。
  3. 控制器更新模型并重新绘制/重新验证视图。

该模型由一个或多个普通 Java getter/setter 类组成。

视图由JFrame 和创建GUI 所需的JPanels 组成。

通常没有一个控制器来“统治他们所有人”。每个侦听器都充当独立的控制器来管理其模型和视图部分。

这是一个简单的应用程序,因此它由两个模型类、一个视图类和一个控制器类组成。在这个例子中模型根本没有更新。

我不是一次编写整个应用程序的代码。我写了几行代码并运行了测试。在对代码的工作方式感到满意之前,我对代码进行了很多更改。

型号

ColorSelection 类是一个普通的 Java getter/setter 类,它包含颜色名称、背景颜色和前景色。

MouseMovementModel 类是一个普通的 Java getter/setter 类,它包含 ColorSelection 实例。 GUI 基于此信息构建选择 JPanel。如果要添加其他选择颜色,请在此处添加。

查看

视图由JFrame、选择JPanel和主JPanel组成。

JFrame 有一个默认的BorderLayout。选择JPanel 进入NORTH 部分,主JPanel 进入CENTER 部分。一个部分中只能放置一个组件。该组件通常是JPanel

选择JPanel 使用FlowLayout 来保存颜色选择JPanels。颜色选择JPanels 是根据应用程序模型中ColorSelection 实例的数量创建的。

颜色选择JPanel 是一个简单的JPanel,用于使用来自ColorSelection 实例的信息。

主要的JPanel 是一个简单的JPanel,它将显示背景颜色。控制器将负责更改背景颜色。

控制器

ColorListener 类扩展了 MouseAdapterMouseAdapter 类实现了MouseListenerMouseMotionListenerMouseWheelListener 接口。使用MouseAdapter 类允许我只实现我正在为其编写代码的鼠标侦听器方法。

mouseEntered 方法将主要的JPanel 设置为ColorSelection 颜色。代码真的很简单。它使用ColorSelection 背景颜色更新视图。

mouseExited 方法将主 JPanel 设置回其原始颜色。

代码

这是完整的可运行代码。我将附加类设为内部类,以便将代码作为一个块发布。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class MouseMovementExample implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new MouseMovementExample());
    }
    
    private final JPanel mainPanel;
    private final JPanel[] colorPanel;
    
    private final MouseMovementModel model;
    
    public MouseMovementExample() {
        this.model = new MouseMovementModel();
        this.mainPanel = createMainPanel();
        this.colorPanel = new JPanel[model.getSelections().length];
    }

    @Override
    public void run() {
        JFrame frame = new JFrame("Mouse Movement Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        frame.add(createSelectionPanel(), BorderLayout.NORTH);
        frame.add(mainPanel, BorderLayout.CENTER);
        
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
    
    private JPanel createSelectionPanel() {
        JPanel panel = new JPanel(new FlowLayout());
        panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        
        ColorSelection[] selections = model.getSelections();
        
        for (int index = 0; index < selections.length; index++) {
            ColorSelection selection = selections[index];
            ColorListener listener = new ColorListener(this, selection);
            colorPanel[index] = createColorPanel(selection, listener);
            panel.add(colorPanel[index]);
        }
        
        return panel;
    }
    
    private JPanel createColorPanel(ColorSelection selection, ColorListener listener) {
        JPanel panel = new JPanel(new BorderLayout());
        panel.setBackground(selection.getBackgroundColor());
        panel.addMouseListener(listener);
        panel.setPreferredSize(new Dimension(200, 100));
        
        JLabel label = new JLabel(selection.getColorName());
        label.setFont(panel.getFont().deriveFont(Font.BOLD, 36f));
        label.setForeground(selection.getForegroundColor());
        label.setHorizontalAlignment(JLabel.CENTER);
        panel.add(label, BorderLayout.CENTER);
        
        return panel;
    }
    
    private JPanel createMainPanel() {
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(200, 200));
        
        return panel;
    }
    
    public Color getMainPanelBackground() {
        return this.mainPanel.getBackground();
    }
    
    public void setMainPanelBackground(Color color) {
        this.mainPanel.setBackground(color);
    }
    
    public class ColorListener extends MouseAdapter {
        
        private final Color originalBackgroundColor;
        
        private final ColorSelection selection;
        
        private final MouseMovementExample view;

        public ColorListener(MouseMovementExample view, ColorSelection selection) {
            this.view = view;
            this.selection = selection;
            this.originalBackgroundColor = view.getMainPanelBackground();
        }

        @Override
        public void mouseEntered(MouseEvent e) {
            view.setMainPanelBackground(selection.getBackgroundColor());
        }

        @Override
        public void mouseExited(MouseEvent e) {
            view.setMainPanelBackground(originalBackgroundColor);
        }
        
    }
    
    public class MouseMovementModel {
        
        private final ColorSelection[] selections;
        
        public MouseMovementModel() {
            this.selections = new ColorSelection[3];
            
            this.selections[0] = new ColorSelection("Red", Color.RED, Color.WHITE);
            this.selections[1] = new ColorSelection("Green", Color.GREEN, Color.BLACK);
            this.selections[2] = new ColorSelection("Blue", Color.BLUE, Color.WHITE);
        }

        public ColorSelection[] getSelections() {
            return selections;
        }
        
    }
    
    public class ColorSelection {
        
        private final Color backgroundColor, foregroundColor;
        
        private final String colorName;

        public ColorSelection(String colorName, Color backgroundColor, Color foregroundColor) {
            this.colorName = colorName;
            this.backgroundColor = backgroundColor;
            this.foregroundColor = foregroundColor;
        }

        public Color getBackgroundColor() {
            return backgroundColor;
        }

        public Color getForegroundColor() {
            return foregroundColor;
        }

        public String getColorName() {
            return colorName;
        }
        
    }

}

【讨论】:

    猜你喜欢
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 2015-05-12
    • 1970-01-01
    相关资源
    最近更新 更多