我有这个 SSCCE ,其中 Jbutton 被它按下不会做任何事情,而且如果我在 JLabel 中单击它也会失败,它不可靠,很多点击都被错过了。但是其他一些发行版我检查了相同的代码,并且可以正常工作。仅在戴尔 Inspiron 触摸屏 PC 中,无法正常工作。

  • 我已经点击了 JButton 100 次,但它显示了 2 次
  • 我已经点击了 JLabel 100 次,但它显示了 0 次
  • 我还在 JFrame 中单击了 100 次,但显示按下了 0 次

  • 运行:
    $ uname -a
    Linux sun-Inspiron-One-2320 3.2.0-29-generic #46-Ubuntu SMP Fri Jul 27 17:03:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
    
    $ lsb_release -a
    No LSB modules are available.
    Distributor ID: Ubuntu
    Description:    Ubuntu 12.04.1 LTS
    Release:    12.04
    Codename:   precise
    
    $ java -version
    java version "1.6.0_24"
    OpenJDK Runtime Environment (IcedTea6 1.11.5) (6b24-1.11.5-0ubuntu1~12.04.1)
    OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
    
    $ export DISPLAY=:0.0 && java -cp YumYumYum.jar UnitTest.MouseMethods
    The JButton was clicked...
    The JButton was clicked...
    

    复制粘贴:
    package UnitTest;
    
    import java.awt.FlowLayout;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    
    public class MouseMethods implements MouseListener {
    
      private JLabel label = new JLabel("This is a JLabel");
      private JButton button = new JButton("This is a JButton");
    
      public MouseMethods() {
        JFrame frame = new JFrame("MouseMethods");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout());
    
        label.addMouseListener(this);
        button.addMouseListener(this);
    
        frame.add(label);
        frame.add(button);
        frame.setVisible(true);
        frame.pack();
      }
    
      public void mouseClicked(MouseEvent e) {
        if (e.getSource().equals(button)) {
          System.out.println("The JButton was clicked...");
        } else if (e.getSource().equals(label)) {
          System.out.println("The JLabel was clicked...");
        } else {
          System.out.println("Something else was clicked...");
        }
      }
    
      public void mouseEntered(MouseEvent e) {
      }
    
      public void mouseExited(MouseEvent e) {
      }
    
      public void mousePressed(MouseEvent e) {
      }
    
      public void mouseReleased(MouseEvent e) {
      }
    
      public static void main(String args[]) {
        new MouseMethods();
      }
    }
    

    跟进:
    $ uname -a
    Linux sun-Inspiron-One-2320 3.2.0-29-generic #46-Ubuntu SMP Fri Jul 27 17:03:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
    
    $ apt-cache search linux-image
    alsa-base - ALSA driver configuration files
    linux-image - Generic Linux kernel image.
    linux-image-3.2.0-23-generic - Linux kernel image for version 3.2.0 on 64 bit x86 SMP
    linux-image-3.2.0-23-virtual - Linux kernel image for version 3.2.0 on 64 bit x86 Virtual Guests
    linux-image-extra-3.2.0-23-virtual - Linux kernel image for version 3.2.0 on 64 bit x86 Virtual Guests
    linux-image-extra-virtual - Linux kernel extra modules for virtual machines
    linux-image-generic - Generic Linux kernel image
    linux-image-server - Linux kernel image on Server Equipment.
    linux-image-virtual - Linux kernel image for virtual machines
    linux-virtual - Complete Linux kernel for virtual machines
    linux-image-3.2.0-23-generic-pae - Linux kernel image for version 3.2.0 on 64 bit x86 SMP
    linux-image-generic-pae - Generic Linux kernel image
    linux-image-3.2.0-23-lowlatency - Linux kernel image for version 3.2.0 on x86/x86_64
    linux-image-lowlatency - lowlatency Linux kernel image
    linux-image-3.2.0-23-lowlatency-pae - Linux kernel image for version 3.2.0 on x86
    linux-image-lowlatency-pae - lowlatency Linux kernel image
    linux-image-3.2.0-24-generic - Linux kernel image for version 3.2.0 on 64 bit x86 SMP
    linux-image-3.2.0-24-virtual - Linux kernel image for version 3.2.0 on 64 bit x86 Virtual Guests
    linux-image-3.2.0-25-generic - Linux kernel image for version 3.2.0 on 64 bit x86 SMP
    linux-image-3.2.0-25-virtual - Linux kernel image for version 3.2.0 on 64 bit x86 Virtual Guests
    linux-image-3.2.0-26-generic - Linux kernel image for version 3.2.0 on 64 bit x86 SMP
    linux-image-3.2.0-26-virtual - Linux kernel image for version 3.2.0 on 64 bit x86 Virtual Guests
    linux-image-3.2.0-27-generic - Linux kernel image for version 3.2.0 on 64 bit x86 SMP
    linux-image-3.2.0-27-virtual - Linux kernel image for version 3.2.0 on 64 bit x86 Virtual Guests
    linux-image-3.2.0-29-generic - Linux kernel image for version 3.2.0 on 64 bit x86 SMP
    linux-image-3.2.0-29-virtual - Linux kernel image for version 3.2.0 on 64 bit x86 Virtual Guests
    linux-image-3.2.0-30-generic - Linux kernel image for version 3.2.0 on 64 bit x86 SMP
    linux-image-3.2.0-30-virtual - Linux kernel image for version 3.2.0 on 64 bit x86 Virtual Guests
    linux-image-3.2.0-31-generic - Linux kernel image for version 3.2.0 on 64 bit x86 SMP
    linux-image-3.2.0-31-virtual - Linux kernel image for version 3.2.0 on 64 bit x86 Virtual Guests
    linux-image-3.2.0-32-generic - Linux kernel image for version 3.2.0 on 64 bit x86 SMP
    linux-image-3.2.0-32-virtual - Linux kernel image for version 3.2.0 on 64 bit x86 Virtual Guests
    linux-image-3.2.0-33-generic - Linux kernel image for version 3.2.0 on 64 bit x86 SMP
    linux-image-3.2.0-33-virtual - Linux kernel image for version 3.2.0 on 64 bit x86 Virtual Guests
    linux-image-3.5.0-18-generic - Linux kernel image for version 3.5.0 on 64 bit x86 SMP
    linux-image-current-generic - Depends on the most recently released generic kernel image and headers.
    linux-image-extra-3.2.0-24-virtual - Linux kernel image for version 3.2.0 on 64 bit x86 Virtual Guests
    linux-image-extra-3.2.0-25-virtual - Linux kernel image for version 3.2.0 on 64 bit x86 Virtual Guests
    linux-image-extra-3.2.0-26-virtual - Linux kernel image for version 3.2.0 on 64 bit x86 Virtual Guests
    linux-image-extra-3.2.0-27-virtual - Linux kernel image for version 3.2.0 on 64 bit x86 Virtual Guests
    linux-image-extra-3.2.0-29-virtual - Linux kernel image for version 3.2.0 on 64 bit x86 Virtual Guests
    linux-image-extra-3.2.0-30-virtual - Linux kernel image for version 3.2.0 on 64 bit x86 Virtual Guests
    linux-image-extra-3.2.0-31-virtual - Linux kernel image for version 3.2.0 on 64 bit x86 Virtual Guests
    linux-image-extra-3.2.0-32-virtual - Linux kernel image for version 3.2.0 on 64 bit x86 Virtual Guests
    linux-image-extra-3.2.0-33-virtual - Linux kernel image for version 3.2.0 on 64 bit x86 Virtual Guests
    linux-image-generic-lts-quantal - Generic Linux kernel image
    linux-image-hwe-generic - Depends on the generic hardware enablement kernel image and headers.
    linux-image-3.2.0-24-generic-pae - Linux kernel image for version 3.2.0 on 64 bit x86 SMP
    linux-image-3.2.0-25-generic-pae - Linux kernel image for version 3.2.0 on 32 bit x86 SMP
    linux-image-3.2.0-26-generic-pae - Linux kernel image for version 3.2.0 on 32 bit x86 SMP
    linux-image-3.2.0-27-generic-pae - Linux kernel image for version 3.2.0 on 32 bit x86 SMP
    linux-image-3.2.0-29-generic-pae - Linux kernel image for version 3.2.0 on 32 bit x86 SMP
    linux-image-3.2.0-30-generic-pae - Linux kernel image for version 3.2.0 on 32 bit x86 SMP
    linux-image-3.2.0-31-generic-pae - Linux kernel image for version 3.2.0 on 32 bit x86 SMP
    linux-image-3.2.0-32-generic-pae - Linux kernel image for version 3.2.0 on 32 bit x86 SMP
    linux-image-3.2.0-33-generic-pae - Linux kernel image for version 3.2.0 on 32 bit x86 SMP
    linux-image-3.2.0-33-lowlatency - Linux kernel image for version 3.2.0 on x86/x86_64
    linux-image-3.2.0-33-lowlatency-pae - Linux kernel image for version 3.2.0 on x86
    
    
    $ apt-get install linux-image-3.2.0-33-generic
    $ init 6
    $ uname -a
    Linux sun-Inspiron-One-2320 3.2.0-33-generic #52-Ubuntu SMP Thu Oct 18 16:29:15 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
    

    最佳答案

    在 Ubuntu 12.04/OpenJDK 上按预期工作。

    笔记:

  • Swing GUI 对象应该只在 event dispatch thread 上构建和操作。
  • 考虑 extends MouseAdapter 而不是 implements MouseListener
  • 对按钮使用 ActionListener ,例如 Action ,而不是 MouseListener
  • 框架内容 Pane 上的监听器触发最终的 else 子句。

  • 附录:请注意,覆盖 mouseClicked() 可能需要某些依赖于平台的驱动程序和控制面板设置,例如双击计时和鼠标按钮去弹跳。改写 mousePressed()mouseReleased()
    $ uname -a
    Linux vm 3.2.0-33-generic-pae #52-Ubuntu SMP
        Thu Oct 18 16:39:21 UTC 2012 i686 i686 i386 GNU/Linux
    $ lsb_release -a
    No LSB modules are available.
    Distributor ID: Ubuntu
    Description:    Ubuntu 12.04.1 LTS
    Release:    12.04
    Codename:   precise
    $ java -version
    java version "1.6.0_24"
    OpenJDK Runtime Environment (IcedTea6 1.11.5) (6b24-1.11.5-0ubuntu1~12.04.1)
    OpenJDK Client VM (build 20.0-b12, mixed mode, sharing)

    Code:

    import java.awt.EventQueue;
    import java.awt.FlowLayout;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    
    public class MouseMethods extends MouseAdapter {
    
        private JLabel label = new JLabel("This is a JLabel");
        private JButton button = new JButton("This is a JButton");
    
        public MouseMethods() {
            JFrame frame = new JFrame("MouseMethods");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new FlowLayout());
    
            label.addMouseListener(this);
            button.addMouseListener(this);
            frame.getContentPane().addMouseListener(this);
    
            frame.add(label);
            frame.add(button);
            frame.pack();
            frame.setVisible(true);
        }
    
        @Override
        public void mousePressed(MouseEvent e) {
            if (e.getSource().equals(button)) {
                System.out.println("The JButton was clicked...");
            } else if (e.getSource().equals(label)) {
                System.out.println("The JLabel was clicked...");
            } else {
                System.out.println("Something else was clicked...");
            }
        }
    
        public static void main(String args[]) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new MouseMethods();
                }
            });
        }
    }
    

    关于java - 为什么在 Linux 中,JButton、JLabel 鼠标点击丢失或被忽略?它没有做程序应该做的事情,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13520209/

    10-10 01:01
    查看更多