3

Jbutton が押されているこのSSCCEは何もしません。また、JLabel をクリックしても失敗し、信頼性が低く、多くのクリックが失われています。しかし、他のディストリビューションで同じコードをチェックしたところ、動作しました。Dell 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
4

2 に答える 2

7

Ubuntu 12.04/OpenJDK で期待どおりに動作します。

ノート:

  • Swing GUI オブジェクトは、イベント ディスパッチ スレッド上でのみ構築および操作する必要があります。

  • extends MouseAdapter以上をご検討くださいimplements MouseListener

  • ActionListenerボタンには などの をAction使用しMouseListenerます。

  • elseフレームのコンテンツ ペインのリスナーが最終節をトリガーします。

補遺: オーバーライドmouseClicked()には、ダブルクリックのタイミングやマウス ボタンのデバウンスなど、特定のプラットフォームに依存するドライバーとコントロール パネルの設定が必要になる場合があることに注意してください。mousePressed()orをオーバーライドmouseReleased()します。

$ ウナメ -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
LSB モジュールはありません。
ディストリビューター ID: Ubuntu
説明: Ubuntu 12.04.1 LTS
リリース: 12.04
コードネーム:正確
$ java -バージョン
Java バージョン「1.6.0_24」
OpenJDK ランタイム環境 (IcedTea6 1.11.5) (6b24-1.11.5-0ubuntu1~12.04.1)
OpenJDK クライアント VM (ビルド 20.0-b12、混合モード、共有)

コード:

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();
            }
        });
    }
}
于 2012-11-22T21:46:55.097 に答える
3

クラス自体にリスナーを実装しないことをお勧めします。各コンポーネントには独自のリスナーが必要だと思います(ソースによる分岐はおそらく最良のアイデアではありません)...

また、すべてのメソッドを実装する必要がない場合は、MouseAdapterを拡張することをお勧めします

于 2012-11-22T21:31:33.500 に答える