JOptionPane - InitialValue

Status
Nicht offen für weitere Antworten.

Stinner

Mitglied
Hallo,
habe noch ein zweites Problem, welches ich gerne dem Forum stellen würde.

Habe mir ein StandardDialog gebaut, der ein JOptionPane beinhaltet, mit dem ich alles mögiliche Abfragen kann (alla "Wollen sie das wirklich löschen").

Habe als Option, dass der StandardDialog optionen bekommt, oder halt nicht.
Im ersten Fall bekommt er ein Object Array und ich wähle den InitialValue wie in der API beschrieben im Konstruktor des JOptionPane's.

Java:
optionPane = new JOptionPane(displayPane,
						JOptionPane.QUESTION_MESSAGE,
						JOptionPane.YES_NO_OPTION, null, options, options[1]);

Wenn keine Optioinen übergeben werden, will ich das Standard YES , NO OptionPane wählen und dann hat immer die YES_Option den Fokus. das will ich abstellen. So machen ich es momentan, klappt aber nicht.

Java:
optionPane = new JOptionPane(displayPane,
					JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_OPTION);
			optionPane.setInitialValue(JOptionPane.NO_OPTION);
...
optionPane.selectInitialValue();
setVisible(true);
optionPane.selectInitialValue();


Habe das selectInitialValue vor und nach setVisible (aufgerufen auf den JDialog). Klappt beides nicht. Wie kann ich den Fokus auf die No Option setzen, ohne explizit die Options anzugeben?
Gruß
 

André Uhres

Top Contributor
Wir müssen die Button Labels und Werte explizit übergeben, über die showOptionDialog() Methode (oder Konstruktor). Wenn wir das tun, dann ist die automatische Übersetzung der YES/NO Labels nicht mehr gegeben. Wir müssen uns selbst darum kümmern.
Java:
int selection = JOptionPane.showOptionDialog(this,
        "Wirklich löschen?",
        "Löschen bestätigen", JOptionPane.YES_NO_OPTION,
        JOptionPane.QUESTION_MESSAGE, null,
        new String[]{"Ja", "Nein"}, "Nein");
if (selection == JOptionPane.YES_OPTION) {
    System.out.println("Ja...");
}
 

Stinner

Mitglied
Morgen,
heiß das, dass ich bei den Standard Yes/NO - OptionPane den InitialValue nicht ändern kann?
Wenn ich die Werte explizit übergebe klappt es, das hatte ich ja schon. Wobei das Beispiel imho nicht klappt.

Java:
JOptionPane.showOptionDialog(this,
        "Wirklich löschen?",
        "Löschen bestätigen", JOptionPane.YES_NO_OPTION,
        JOptionPane.QUESTION_MESSAGE, null,
        new String[]{"Ja", "Nein"}, "Nein");
Der Value des OptionPane ist hier ja ein String und der kann nicht in ein int geparsed werden. Bei mir klappt aber über einen String vergleich.
Aber wie gesagt, will es eigentlich nicht (immer) mit einer expliziten Optionsangabe lösen.
GRuß
 

Stinner

Mitglied
Hi,
will nochmal das Problem klarstellen, da ich echt nicht weiter komme und es sich bisschen verändert hat.

Habe eine eigene Klasse die von JDialog erbt. Diese will ich als mein Standarddialog verwenden. Ich kann der Klasse Optionen mitgeben die angezeigt werden auf den Buttons z.b. {"Yes","No"}; {"Ok","Cancel"} usw.
Ich übergebe dieses Optionen-Array dem Konstruktur vom JOptionPane, dass auf meinem Dialog angzeigt wird.
Jetzt will ich, dass immer die zweite Option (No, Cancel etc.) den Fokus hat.
Mache das auch über den Konstruktur des JOptionPane, da kann man den InitialValue angeben, wenn die Optionen konkret mitgegeben werden.
ALLERDINGS: Es gibt anscheind 2 Fokusse. Wenn ich enter drücke wird mein InitialValue ausgewählt. Drücke ich die Leertaste, dann die andere Option. Mein InitialValue ist mit einem blauen Kastenumrandet, bei der anderen ist die Caption mit einem gestrichelten Kasten umrandet.
Wie kann ich das abstellen, ohne die Reihenfolge der Optionen zu ändern?
Gruß
 

André Uhres

Top Contributor
Das Problem mit 2 Fokussen kann ich nicht bestätigen. Wie gesagt, wir müssen die Button Labels und Werte explizit übergeben, entweder über die showOptionDialog() Methode oder über den Konstruktor. Mein Beispiel funktioniert bei mir: bei showOptionDialog ist der Rüchgabewert ein int, JOptionPane.YES_OPTION ist auch ein int.
 

KrokoDiehl

Top Contributor
Hallo.
Ja es stimmt, es gibt zusagen zwei Foki (oder Fokusse?). Das eine ist der so genannte default button (reagiert auf Enter, zu setzen mit
Code:
myDialog.getRootPane().setDefaultButton(JButton)
), das andere der normale Fokus (reagiert auf Leertaste).
Es gibt über den
Code:
UIManager
die Eigenschaft
Java:
UIManager.put("Button.defaultButtonFollowsFocus", Boolean.TRUE);
aber ich denke dass das bei dir bewirkt, dass der
Code:
initialValue
auch noch seinen 'Enter'-Fokus verliert. Damit kann man höchstens mal herumprobieren.

Dein Problem ist aber, wenn ich es richtig verstehe, dass der falsche Button (nicht
Code:
initialValue
) den (Tastatur)Fokus hat. Spontan kenne ich keine Methode/Konstruktur um diesen Fokus gleich korrekt zu setzen, außer eben über
Code:
JButton.requestFocus()
...dafür braucht man aber den Button. Daher mein Vorschlag: Anstatt der
Code:
JOptionPane
ein Array von Strings zu übergeben, übergib ihr direkt JButtons. Dann kannst du auch von außen den Fokus setzen.

Ich kann mir gut vorstellen, dass es auch elegantere Methoden gibt, aber habe bisher noch keine entdeckt (und auch nicht ausgiebig gesucht ;) ).
 

André Uhres

Top Contributor
Dies funktioniert bei mir (Enter und Leertaste -> Nein):
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class NewJFrame extends JFrame {

    private JButton jButton1;
    private JToolBar jToolBar1;

    public NewJFrame() {
        super("NewJFrame");
        jToolBar1 = new JToolBar();
        jButton1 = new JButton();
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jButton1.setText("New JDialog");
        jButton1.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton1);
        getContentPane().add(jToolBar1, BorderLayout.PAGE_START);
        setSize(400, 300);
        setLocationRelativeTo(null);
    }

    private void jButton1ActionPerformed(ActionEvent evt) {
        JDialog d = new JDialog(this, "Title");
        d.setSize(300, 200);
        d.setLocationRelativeTo(this);
        JButton b = new JButton("New JOptionPane");
        d.add(b, BorderLayout.NORTH);
        b.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                String[] options = new String[]{"Ja", "Nein"};
                JOptionPane pane = new JOptionPane("Title",
                        JOptionPane.QUESTION_MESSAGE,
                        JOptionPane.YES_NO_OPTION, null, options, options[1]);
                JDialog dialog = pane.createDialog(NewJFrame.this, "title");
                dialog.setVisible(true);
                Object selectedValue = pane.getValue();
                System.out.println(selectedValue);

            }
        });
        d.setVisible(true);
    }

    public static void main(final String[] args) {
        Runnable gui = new Runnable() {

            public void run() {
                new NewJFrame().setVisible(true);
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }
}
 

Stinner

Mitglied
Ja,
keine Ahnung woran es liegt. Jedenfalls nutzte ich den StandardDialog an vielen Stellen.
Schätzungsweise funzt mit dem String array bei der Hälfte ( Da ist der TastaturFokus nirgendwo) und bei der anderen Hälfte nicht
 
Zuletzt bearbeitet:

Stinner

Mitglied
Hallo,
will dieses Thema nochmal kurz aufgreifen, da ich es jetzt eine Lösung habe.

Das Problem war, dass mein JOptionPane zwar den InitialValue gesetzt hat, wenn ich die Optionen explizit angegeben habe (Beim Standard Yes/NO OptionPane konnte ich diesen nicht setzen), aber der Tastaur Fokus nicht richtig gesetzt wurde.
Wollte, dass immer die zweite Option desfault ausgewählt ist.

Habe zu dem Problem folgenden Artikel gefunden, wo das Problem auch besprochen wurde:
[JavaSpecialists 012] - Setting focus to second component of modal dialog

Habe es jetzt so gemacht, dass ich als Optionen JButtons übergebe, und dann an den ersten JButton einen FocusListener hänge. Dort wird der Fokus auf den zweiten Button gesetzt und der FocusListener dann wieder entfernt, da dieses Verhalten nur einmal gebraucht wird. Diese Lösung wird in dem Artikel besprochen (Solution 1)
Dort wird auch besprochen, warum ein requestFocus() nicht klappt. Wobei der Artikel veraltet (show()) ist, diese Passagen sidn aber noch aktuell.

Problem an dieser Lösung ist, dass man für die JButtons ActionListener schreiben muss, wo man den Dialog schließt und den Value des JOptionPanes setzten muss. Bei der Übergabe von Strings hat dies das JOtpionPane noch gemacht. Warum dass so ist, weiß ich nicht. Ich erinnere mich, dass in der API stand, dass die toString() methode, der Objekte im Objects Array genutzt wird um den Text der Buttons anzuzeigen, die dargestellten Buttons aber immer vom JOtpionPane kommen.
Egal, so klappt es jedenfalls.
Gruß, Stinner
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G JOptionPane zeigt nicht an was ich will AWT, Swing, JavaFX & SWT 2
A JOptionPane OK ohne Eingabe abfangen AWT, Swing, JavaFX & SWT 10
senol JOptionPane hilfe!!! :(((( AWT, Swing, JavaFX & SWT 32
J JOptionPane ruft sich selbst immer wieder neu auf AWT, Swing, JavaFX & SWT 3
J JOptionPane return bei "Abbrechen" AWT, Swing, JavaFX & SWT 13
R JOptionPane schließt sich nicht wieder AWT, Swing, JavaFX & SWT 2
O Swing JOptionPane.showOptionDialog - Wie kann ich Buttons größer machen AWT, Swing, JavaFX & SWT 10
O Timer in JOptionPane anzeigen AWT, Swing, JavaFX & SWT 2
Z Swing JOptionPane import AWT, Swing, JavaFX & SWT 5
R Swing JOptionPane Sprache Ändern AWT, Swing, JavaFX & SWT 4
O JOptionPane mit JFileDialog AWT, Swing, JavaFX & SWT 5
dereki2000 JPanel mit Rückgbe wie bei JOptionPane AWT, Swing, JavaFX & SWT 3
T JavaFX JFrame verhalten wie JOptionPane (ErrorMessage) AWT, Swing, JavaFX & SWT 1
I JOptionPane maximale Zeichen einstellen AWT, Swing, JavaFX & SWT 2
N Swing Mocken von JOptionPane im JUnit-Test AWT, Swing, JavaFX & SWT 3
R Ausgabe über JOptionPane.showMessageDialog funktioniert nicht AWT, Swing, JavaFX & SWT 2
W JOptionPane AWT, Swing, JavaFX & SWT 1
T JOptionPane Dialog plus Rechnung ausgeben AWT, Swing, JavaFX & SWT 1
snipesss Hintergrundbild in JOptionPane.showInputDialog? AWT, Swing, JavaFX & SWT 4
R Swing JOptionPane Fehlermeldung- bitte um Hilfe! AWT, Swing, JavaFX & SWT 4
J Event Handling JOptionPane ActionListener setzen. AWT, Swing, JavaFX & SWT 3
A Swing JOptionPane.showConfirmDialog, EventQueue wird weiter abgearbeitet AWT, Swing, JavaFX & SWT 2
C JOptionPane.showConfirmDialog() -> Focus auf NEIN -> Enter gibt YES_OPTION zurück AWT, Swing, JavaFX & SWT 6
T JOptionPane Enter = Okay AWT, Swing, JavaFX & SWT 3
OnDemand JOptionPane AWT, Swing, JavaFX & SWT 2
B JFrame wie JOptionPane.showMessageDialog() AWT, Swing, JavaFX & SWT 2
D Swing JOptionPane verschwindet beim 2. Aufruf einfach so?? AWT, Swing, JavaFX & SWT 2
L Swing JOptionPane Verwirrung AWT, Swing, JavaFX & SWT 13
P JOptionPane input und show Message Dialog AWT, Swing, JavaFX & SWT 5
I javascript in javaprogramm JOptionpane -> haengt (embedded Interpreter) AWT, Swing, JavaFX & SWT 2
S JOptionPane sinnvoll benutzen AWT, Swing, JavaFX & SWT 7
J JOptionPane mit zwei Buttons?! AWT, Swing, JavaFX & SWT 3
D JOptionPane.QUESTION_MESSAGE Fett darstellen AWT, Swing, JavaFX & SWT 4
N JOptionPane als JWindow AWT, Swing, JavaFX & SWT 2
M Swing Änderungen eines TextFelds und JOptionPane AWT, Swing, JavaFX & SWT 5
O JOptionPane.showMessageDialog mit automatischem Zeilenumbruch AWT, Swing, JavaFX & SWT 9
E Swing setCaretPosition für ein JTextField in einem JOptionPane AWT, Swing, JavaFX & SWT 3
H Swing JOptionPane.showConfirmMessage() wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
R JOptionPane.YES_NO_CANCEL_OPTION im SaveDialog verwenden AWT, Swing, JavaFX & SWT 6
U JFrame minimiert nach JDialog, JOptionPane AWT, Swing, JavaFX & SWT 3
R Eingegebenen Text in JOptionPane in andere Klasse weitergeben AWT, Swing, JavaFX & SWT 2
M JOptionPane.showInputDialog abbrechen abfangen? AWT, Swing, JavaFX & SWT 2
Weiti JOptionPane aus einer von JPanel abgeleiteten Klasse aufrufen AWT, Swing, JavaFX & SWT 3
N OK-Button in JOptionPane ansprechen AWT, Swing, JavaFX & SWT 5
D Swing JOptionPane + FileChooser .. Reihenfolge wichtig!? AWT, Swing, JavaFX & SWT 7
G Swing Meldung mit joptionpane information message AWT, Swing, JavaFX & SWT 22
B Swing JOptionPane ohne beep AWT, Swing, JavaFX & SWT 6
A Swing \t im JOptionPane AWT, Swing, JavaFX & SWT 2
G JOptionPane.showConfirmDialog size problem AWT, Swing, JavaFX & SWT 3
S JOptionPane resultat kriegen AWT, Swing, JavaFX & SWT 7
ABstraCT JOptionPane setSize ? AWT, Swing, JavaFX & SWT 6
S JOptionPane.showInputDialog JList erzwingen? AWT, Swing, JavaFX & SWT 4
SebSnake JFrame "Focus" erzwingen (wie JOptionPane) AWT, Swing, JavaFX & SWT 3
G JOptionPane.showInputDialog(): Texteingabe und Fokus AWT, Swing, JavaFX & SWT 3
A Array wird im JOptionPane mehrfach ausgegeben AWT, Swing, JavaFX & SWT 3
A JOptionPane soll auf Enter reagieren AWT, Swing, JavaFX & SWT 4
F JOptionPane.showMessageDialog AWT, Swing, JavaFX & SWT 2
M JOptionPane.showMessageDialog() mit printStackTace() ? AWT, Swing, JavaFX & SWT 7
QDog JTabbedPane JOptionPane AWT, Swing, JavaFX & SWT 2
K Tabelle nach JOptionPane updaten AWT, Swing, JavaFX & SWT 5
A JOptionPane; CLOSED_OPTION ausschalten AWT, Swing, JavaFX & SWT 5
A Probleme mit einer JOptionPane in einem jar-File AWT, Swing, JavaFX & SWT 14
Z JOptionPane mit einer Methode in dem Vordergrund setzen? AWT, Swing, JavaFX & SWT 6
J JOptionPane Tabs AWT, Swing, JavaFX & SWT 3
G JOptionPane mit andere Farbe AWT, Swing, JavaFX & SWT 8
B Ein JOptionPane.showMessageDialog(.) AWT, Swing, JavaFX & SWT 6
G komplexes JOptionPane (oder doch JFrame?) AWT, Swing, JavaFX & SWT 2
G JOptionPane mit link zum anklicken AWT, Swing, JavaFX & SWT 4
G JOptionPane AWT, Swing, JavaFX & SWT 6
N Probleme mit eigenem JOptionPane AWT, Swing, JavaFX & SWT 2
A Schließen eines JOptionPane.showConfirmDialog AWT, Swing, JavaFX & SWT 6
B JOptionPane.showInputDialog mit drei ComboBoxen nebeneinande AWT, Swing, JavaFX & SWT 2
S JTextField und JOptionPane - Zeicheneingabe beschränken AWT, Swing, JavaFX & SWT 3
G JOptionPane AWT, Swing, JavaFX & SWT 3
eskimo328 JOptionPane ohne CANCEL Button AWT, Swing, JavaFX & SWT 2
M JOptionPane.showConfirmDialog. Frage zur Cancel_Option AWT, Swing, JavaFX & SWT 2
L JOptionPane AWT, Swing, JavaFX & SWT 4
P JComboBox.addItem erzeugt Layoutproblem mit JOptionPane AWT, Swing, JavaFX & SWT 2
J eigenes JOptionPane ? AWT, Swing, JavaFX & SWT 2
J JOptionPane Buttons AWT, Swing, JavaFX & SWT 4
G Eingabe auslesen mit JOptionPane AWT, Swing, JavaFX & SWT 2
vogella JOptionPane in den Vordergrund bringen AWT, Swing, JavaFX & SWT 2
padde479 JOptionPane AWT, Swing, JavaFX & SWT 3
C Probleme beim Serialisieren mit JOptionPane AWT, Swing, JavaFX & SWT 12
S JOptionPane: methode ShowConfirmDialog ist undefiniert AWT, Swing, JavaFX & SWT 2
S JOptionPane und eine feste Zeilenbreite. AWT, Swing, JavaFX & SWT 4
S JProgressBar zu JOptionPane hinzufügen. AWT, Swing, JavaFX & SWT 8
G JOptionPane AWT, Swing, JavaFX & SWT 3
B Eingabeüberprüfung beim JOptionPane.showInputDialog() AWT, Swing, JavaFX & SWT 3
D Mit JOptionPane einen Link darstellen AWT, Swing, JavaFX & SWT 10
S JOptionPane.showMessageDialog(.) AWT, Swing, JavaFX & SWT 23
S Ein frage zu JOptionPane AWT, Swing, JavaFX & SWT 2
H wie frage ich mehrere buttons von joptionpane ab AWT, Swing, JavaFX & SWT 4
G Link in JoptionPane? AWT, Swing, JavaFX & SWT 3
N JOptionPane mit Html Tags AWT, Swing, JavaFX & SWT 5
B Focus in JOptionPane AWT, Swing, JavaFX & SWT 2
M Ausgabe mit JOptionPane AWT, Swing, JavaFX & SWT 6
U kleiner-Zeichen JEditorPanel (war: JOptionPane) AWT, Swing, JavaFX & SWT 5
S JOptionPane in den Bildschirmvordergrund bringen AWT, Swing, JavaFX & SWT 3
F JOptionPane soll nicht auf ENTER reagieren AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben