Ich habe eine einfache App mit einer Menüleiste. In der Menüleiste befindet sich eine Schaltfläche (JMenu) zum Öffnen einer Datei.Java: Windows 7 Look-and-Feel (oder MouseListener?) Erfordert zweimal klicken auf JOptionPane
Durch Klicken auf diese Schaltfläche wird ein JOptionPane mit einem Eingabefeld und den Schaltflächen "OK" und "Abbrechen" geöffnet.
Sie müssen jedoch mindestens einmal auf den JOptionPane klicken, um (mit der Maus) mit einer beliebigen Komponente (den Schaltflächen oder dem Eingabefeld) zu interagieren. Wenn Sie den Pfad eingeben, müssen Sie zweimal auf die Schaltfläche "OK" klicken.
Ich denke, es ist ein Fokusproblem, aber Tastatureingabe funktioniert gut.
Was seltsam ist, ist, dass das Standard-UI-Look-and-Feel diesen Fehler nicht verursacht, aber mein JOptionPane funktionierte vorher gut (und ich hatte die System-UI Look-and-Feel, sowie der MouseListener) Ich weiß ehrlich gesagt überhaupt nicht, was diesen Fehler verursacht.
-Code ist hier:
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);
}
}
ich nicht Action verwenden können, JMenu gerade ignoriert bis es und ein MenuListener verhält sich nicht so, wie ich es möchte (mit mehreren Elementen, die sich auf einem Element befinden, nachdem Sie eines ausgewählt haben). Das Einfügen des JOptionPane in main() und das Setzen von 'jop.requestFocus()' in 'mouseReleased()' macht nichts. – Zezombye
* "verhält sich nicht wie ich will" * Scheint, dass sich diese GUI nicht so verhält, wie der Benutzer es möchte. Eine gute allgemeine Regel für GUIs ist, dem Pfad der geringsten Überraschung zu folgen. –
@Zezombye Sie sollten nichts auf Grund der Interaktion des Benutzers mit einem JMenu an erster Stelle tun. Fügen Sie Ihrem JMenu ein JMenuItem hinzu, und fügen Sie Ihrem JMenuItem Ihren ActionListener hinzu. Oder, noch besser, [setze eine Aktion] (http://docs.oracle.com/javase/8/docs/api/javax/swing/AbstractButton.html#setAction-javax.swing.Action-) für das JMenuItem. – VGR