2017-02-24 3 views
0

私はメニューバーを持つ簡単なアプリを持っています。メニューバーには、ファイルを開くためのボタン(JMenu)があります。Java:Windows 7のルック・アンド・フィール(またはMouseListener?)ではJOptionPaneを2回クリックする必要があります

このボタンをクリックすると、入力フィールドと「OK」および「キャンセル」ボタンがあるJOptionPaneが開きます。

ただし、コンポーネント(ボタンまたは入力フィールド)と(マウスで)対話するには、JOptionPaneを少なくとも1回クリックする必要があります。パスを入力すると、「OK」ボタンを2回クリックする必要があります。

私はそれが焦点問題だと思うが、キーボード入力はうまく動作する。

デフォルトのUIのルック・アンド・フィールでこのバグは発生しませんが、私のJOptionPaneは以前よりうまく動作していました。(システムUIのルック・アンド・フィールとMouseListenerもありました。私は正直なところ、このバグの原因を知らない。

コードはここにある:

import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JOptionPane; 
import javax.swing.UIManager; 

public class Classe1 { 

public static void main(String[] args) throws Exception { 

    JFrame jf = new JFrame(); 

    //Commenting this line makes it behave correctly 
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 

    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    jf.setSize(new Dimension(400, 200)); 
    jf.setVisible(true); 
    jf.setLocationRelativeTo(null); 

    JMenuBar mb = new JMenuBar(); 
    JMenu test = new JMenu("Open file"); 
    test.addMouseListener(new MouseListener() { 
     @Override 
     public void mousePressed(MouseEvent arg0) { 

      JOptionPane jop = new JOptionPane(); 
      jop.requestFocus(); 

      //There is a warning, but if you do "JOptionPane.showInputDialog(...)" it doesn't do anything. 
      Object input = jop.showInputDialog(jf, "Enter path", "Title", JOptionPane.PLAIN_MESSAGE, null, null, ""); 

     } 
     @Override 
     public void mouseEntered(MouseEvent arg0) { 
     } 
     @Override 
     public void mouseExited(MouseEvent arg0) { 
     } 
     @Override 
     public void mouseClicked(MouseEvent arg0) { 
     } 
     @Override 
     public void mouseReleased(MouseEvent arg0) { 
     } 
    }); 
    mb.add(test); 
    jf.add(mb); 

} 
} 

答えて

4

JMenuは、マウスがリリースされるまでフォーカスを持っているが、ダイアログが押されたマウスで開きます。

ActionListener(推奨)を使用するか、マウスをリリースしてロジックを実行してください。


いずれにしても、マウスを押したときの行動をとることは、通常、悪い使用経験があります。ユーザーは、マウスボタンが押されている間にマウスをボタンから離した場合(「間違って押した」のようなもの)、何も起こらないと予想しています。 This postは、マウスイベントのUXの詳細を説明します。

+0

をクリックしてシングルのために試すことができ、JMenuにはまっすぐにそれとAを無視し

public void mouseClicked(MouseEvent arg0) { if(arg0.getClickCount() == 2) { // your code to execute } } 

をクリックしてダブルについて を働くと思い、これを試してくださいMenuListenerは、私が望むように振る舞いません(複数の項目がある場合は、項目をクリックした後にその項目をホバリングします)。 JOptionPaneをmain()に置き、 'mouseReleased()'に 'jop.requestFocus()'を置いても何もしません。 – Zezombye

+1

* "私のように振る舞いません" *このGUIは、ユーザーが望むように動作しないようです。 GUIの良い一般的なルールは、「最小の驚きのパス」に従うことです。 –

+0

@ Zezombyeまず、JMenuとのユーザーのやり取りに基づいて何もしないでください。 JMenuItemをJMenuに追加し、そのJMenuItemにActionListenerを追加します。または、JMenuItemで[アクションを設定](http://docs.oracle.com/javase/8/docs/api/javax/swing/AbstractButton.html#setAction-javax.swing.Action-)を実行することもできます。 – VGR

0

私は、それは同様にあなたが私はActionListenerを使用することはできません

public void mouseClicked(MouseEvent arg0) 
    { 
     if(arg0.getClickCount() == 1) 
     { 
      // your code to execute 
     } 
    } 
関連する問題