Java 为什么在Linux中,JButton、JLabel鼠标单击会丢失或被忽略?这不是程序应该做的
我有一个SSCCE,其中Jbutton被按下,它什么也不做,而且如果我在JLabel中单击,它也会失败,它不可靠,许多单击都会丢失。但是其他发行版我检查了相同的代码,并且它工作正常。仅在戴尔Inspiron触摸屏PC中,它不工作Java 为什么在Linux中,JButton、JLabel鼠标单击会丢失或被忽略?这不是程序应该做的,java,linux,swing,ubuntu,jbutton,Java,Linux,Swing,Ubuntu,Jbutton,我有一个SSCCE,其中Jbutton被按下,它什么也不做,而且如果我在JLabel中单击,它也会失败,它不可靠,许多单击都会丢失。但是其他发行版我检查了相同的代码,并且它工作正常。仅在戴尔Inspiron触摸屏PC中,它不工作 我已经点击JButton 100次了,但是它显示了2次 我已单击JLabel 100次,但它显示了0次 我也在JFrame中点击了100次,但它显示0次被按下 运行: 复制和粘贴: package UnitTest; import java.awt.FlowLay
- 我已经点击JButton 100次了,但是它显示了2次
- 我已单击JLabel 100次,但它显示了0次
- 我也在JFrame中点击了100次,但它显示0次被按下
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对象应仅在上构造和操作
- 考虑
扩展到将MouseAdapter
实现MouseListener
- 对按钮使用
,例如ActionListener
,而不是Action
MouseListener
- 框架内容窗格上的侦听器触发final
子句else
mouseClicked()
可能需要特定的平台相关驱动程序和控制面板设置,例如双击计时和鼠标按钮反弹跳。改为覆盖mousePressed()
或mouseereleased()
$ 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)
我尝试了每个侦听器的每个组件,但它也不起作用。 $ 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)
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();
}
});
}
}