私はメニューバーを持つ簡単なアプリを持っています。メニューバーには、ファイルを開くためのボタン(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);
}
}
をクリックしてシングルのために試すことができ、JMenuにはまっすぐにそれとAを無視し
をクリックしてダブルについて を働くと思い、これを試してくださいMenuListenerは、私が望むように振る舞いません(複数の項目がある場合は、項目をクリックした後にその項目をホバリングします)。 JOptionPaneをmain()に置き、 'mouseReleased()'に 'jop.requestFocus()'を置いても何もしません。 – Zezombye
* "私のように振る舞いません" *このGUIは、ユーザーが望むように動作しないようです。 GUIの良い一般的なルールは、「最小の驚きのパス」に従うことです。 –
@ Zezombyeまず、JMenuとのユーザーのやり取りに基づいて何もしないでください。 JMenuItemをJMenuに追加し、そのJMenuItemにActionListenerを追加します。または、JMenuItemで[アクションを設定](http://docs.oracle.com/javase/8/docs/api/javax/swing/AbstractButton.html#setAction-javax.swing.Action-)を実行することもできます。 – VGR