当前位置: 首页 > 知识库问答 >
问题:

不同JPanel的鼠标侦听器事件

娄嘉石
2023-03-14

是否可能有一个全局鼠标运动监听器,根据点击的JPanel的内容而具有不同的效果(仅使用一个鼠标运动监听器)?

例如:我有一个JFrame,其中添加了两个JPanel,并在JFrame中添加了一个鼠标运动监听器。当我点击一个JPanel时,我希望屏幕能够调整大小,但当我点击另一个JPanel时,我希望JFrame能够被拖动。我认为这可以通过使用JLabel来完成,使用JLabel的文本进行检查,与JButton一样。

编辑:是的,这绝对不是做事情的正确方式,只是想知道这是否可能,如果可能,怎么做?

编辑:只是为了让事情更清楚一点,我有一个扩展ActionListener、MouseMotionListener、MouseListener的类。是否有可能让这个类处理JFrame的所有事件,该JFrame有许多不同的JPanels附加到它,并根据按压的JPanel做一些不同的事情?(例如附加到JPanels的ID,我可以比较event.getSource())

共有3个答案

连俊智
2023-03-14

编辑2

这应该是你的答案,我在调试时注意到,当我点击框架上的空白区域时,我得到了一个名为"null.content窗格"的组件,所以我把它放在条件下,它工作了!,我希望我有所帮助。

public class PanelsListener extends JFrame {

public static void main(String[] args) {
    PanelsListener pl = new PanelsListener();
    pl.setSize(700, 700);
    pl.setLayout(new FlowLayout());
    JPanel fp = new JPanel();

    fp.setName("First");
    fp.setSize(200, 200);
    fp.setBorder(new LineBorder(Color.red));
    JPanel sp = new JPanel();
    sp.setName("Second");
    sp.setSize(200, 200);
    sp.setBorder(new LineBorder(Color.blue));
    pl.add(fp);
    pl.add(sp);

    pl.addMouseListener(new MouseListener() {
        @Override
        public void mouseClicked(MouseEvent e) {
            JPanel pnl = (JPanel) javax.swing.SwingUtilities
                    .getDeepestComponentAt((PanelsListener) e.getSource(),
                            e.getX(), e.getY());
            if (pnl != null && (!pnl.getName().equals("null.contentPane"))) {
                String name = pnl.getName();
                if (name != null) {
                    if (name.equals("First")) {
                        pl.setSize(500, 500);
                    } else if (name.equals("Second")) {
                        pl.setSize(800, 800);
                    }
                    pl.repaint();
                }
            }

        }

        @Override
        public void mouseEntered(MouseEvent e) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseExited(MouseEvent e) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mousePressed(MouseEvent e) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseReleased(MouseEvent e) {
            // TODO Auto-generated method stub

        }
    });

    pl.setVisible(true);
}

}

编辑1

据我从你的评论中了解,请尝试以下方法:

public class PanelsListener extends JFrame{

public static int  panel_identifier=0;

public static void main(String[] args) {
    PanelsListener pl = new PanelsListener();
    pl.setSize(700, 700);
    pl.setLayout(new FlowLayout());
    JPanel fp=new JPanel();
    fp.setSize(200,200);
    fp.setBorder(new LineBorder(Color.red));
    JPanel sp=new JPanel();
    sp.setSize(200,200);
    sp.setBorder(new LineBorder(Color.blue));

    pl.add(fp);
    pl.add(sp);

    //panel_identifier is used to specify which panel has been clicked.

    fp.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent me) {
           pl.panel_identifier=1;
           pl.mouseClicked(me);
        }
    });
    sp.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent me) {
            pl.panel_identifier=2;
             pl.mouseClicked(me);
        }
    });

    pl.setVisible(true);
}
protected void mouseClicked(MouseEvent me) {
    if(panel_identifier==1)
    {
        this.setSize(500, 500);
        panel_identifier=0;
    }
    else if(panel_identifier==2)
    {
        this.setSize(800, 800);
        panel_identifier=0;
    }

}
}

正常溶液

公共类PanelsListener扩展了JFrame{

public static void main(String[] args) {
    PanelsListener pl = new PanelsListener();
    pl.setSize(700, 700);
    pl.setLayout(new FlowLayout());
    pl.add(new FirstPanel(pl));
    pl.add(new SecondPanel(pl));
    pl.setVisible(true);
}
}

class FirstPanel extends JPanel {

public FirstPanel(Frame frm) {
    setBorder(new LineBorder(Color.red));
    setSize(200, 200);
    addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            frm.setSize(500, 500);
            frm.repaint();
        }
    });
    addMouseMotionListener(new MouseAdapter() {
        @Override
        public void mouseDragged(MouseEvent e) {
            // do some action when mouse dragged over this panel
        }
    });
 }
 }

 class SecondPanel extends JPanel {

 public SecondPanel(Frame frm) {
    setBorder(new LineBorder(Color.blue));
    setSize(200, 200);
     addMouseListener(new MouseAdapter() {
     @Override
     public void mouseClicked(MouseEvent e) {
     frm.setSize(800,800);
     frm.repaint();
     }
     });

    addMouseMotionListener(new MouseAdapter() {
        @Override
        public void mouseDragged(MouseEvent e) {
            // do some action when mouse dragged over this panel
        }
    });
 }
 }
裴欣荣
2023-03-14

我不确定这是否是最好的方法,但我只是测试了它,它确实有效,至少就我的代码测试而言。当鼠标被按下时,找出它在哪个盒子上,并相应地做一些事情。

public static void main(String[] args) {
    JFrame main = new JFrame("test");
    JPanel first = new JPanel();
    JPanel second = new JPanel();
    first.setSize(400, 500);
    first.setBackground(Color.BLUE);
    second.setBackground(Color.RED);
    second.setSize(400,500);
    main.setSize(800, 500);
    main.add(first);
    first.setLocation(0,0);
    second.setLocation(400, 500);
    main.add(second);
    main.pack();
    main.setVisible(true);
    main.setSize(800, 500);
    main.addMouseListener(new MouseListener() {

        @Override
        public void mousePressed(MouseEvent e) {
            if(first.getBounds().contains(new Point(e.getX(), e.getY())))
            {
                System.out.println("first box");
            }else if(second.getBounds().contains(new Point(e.getX(), e.getY())))
            {
                System.out.println("Second box");
            }
        }
    });
}
章嘉致
2023-03-14

首先,“全局”侦听器对不同的组件执行不同的操作,这是一个坏主意,它在单个组件中放置了太多逻辑,将代码耦合起来,成为维护的噩梦。

话虽如此,您可以使用单个MouseListener添加到每个组件,例如...

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JPanel left = new TestPane();
                JPanel right = new TestPane();

                left.setBackground(Color.RED);
                right.setBackground(Color.BLUE);

                left.setName("left");
                right.setName("right");

                MouseListener listener = new MouseAdapter() {
                    @Override
                    public void mouseClicked(MouseEvent e) {
                        System.out.println(((JPanel)e.getSource()).getName());
                    }
                };

                left.addMouseListener(listener);
                right.addMouseListener(listener);

                JFrame frame = new JFrame("Testing");
                frame.setLayout(new GridLayout(0, 2));
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(left);
                frame.add(right);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }

}

然后,您可以简单地使用MouseEvent#getSource来确定触发事件的组件。为了简单起见,我为每个面板提供了一个名称,并展示了这一点,在决定做什么之前,我会使用其他方法来识别组件

更好的解决方案是提供一个特定的MouseListener,它根据需要对每个面板执行特定的工作,这变得更容易管理、隔离责任、解耦代码并变得更容易维护和管理

 类似资料:
  • 女士们先生们晚上好, 我有一个Java Swing的问题,我无法解决,也许你可以帮助我。在这里: 我有一个使用BorderLayout的JFrame和许多JPanel 每次我需要设置一个新屏幕(即,从主菜单,当单击搜索按钮时,转到搜索菜单),我只需删除位于中心的组件(JPanel),并将新屏幕(新JPanel)放在中心 这样,我不会在每次我想显示新屏幕时调用所有的页眉和页脚对象 这个系统一切正常,

  • 问题内容: 我正在尝试添加一个包含一个的键侦听器。 当收到ctrl + tab时,应该切换标签。 但是按键事件从未发送过,我尝试将其添加到面板和选项卡式对象中,但是没有成功。 这是我的代码 问题答案: 通常,正确的Swing组件不会拦截您的按键事件。您必须了解,光标下方的第一个组件将收到键盘事件。如果您使用键盘选择一个按钮,则将是这个JButton接收按键事件。 为了确保获得所有这些事件,您不必在

  • 问题内容: 我正在尝试将鼠标侦听器添加到MapMarker,以便当鼠标将鼠标悬停在MapMarker上时,我可以对事件做出反应。 我实现了mouseListener,但是我不能真正添加​​一个监听器。问题是由于没有层次结构实现JPanel,所以我没有找到MapMarker添加addMouseListener的方法。 任何帮助表示赞赏 问题答案: 如前所述这里,默认的构造函数使用了“这实现了Map按

  • 我有一个应用程序,其中不同的用户监听服务器发送的事件源以获得定期响应。我打算从服务器发送响应,并以json格式发送相应的Id和数据。在客户端,当数据到达时,每个客户端都会检查匹配的Id,如果发现,则处理数据,否则忽略它。但这种方法的缺陷在于,每个用户都从定期更新中获得数据,即使这些数据不是为他们准备的。我读了一些关于sse的文章,但找不到任何关于这方面的信息 我的问题是使用服务器端事件是否有任何方

  • 单击选择元素显示此警告: [违规]将非被动事件侦听器添加到滚动阻止“鼠标滚轮”事件。将事件处理程序标记为“被动”以使页面更加响应。 问题是,这也扩大了谷歌浏览器中HTML页面的高度。在Chrome版本59.0中测试。3071.86(官方版本)(64位)在firefox中不会出现这种情况。 简单代码:https://jsfiddle.net/gurigraphics/2399mnyb 如果自定义滚动

  • 我的代码使用jQuery。我有一个密码输入框,我想要得到输入的密码任何时候。 下面是我的代码: 我确信这是一个正确的代码,因为当我在浏览器的控制台中输入它时,它可以工作,但当我重新加载页面时,它就不工作了 我能做什么?