showOptionMessage von JOptionPane

Sebastian29

Erfahrenes Mitglied
Hi!

Code:
Object[] options = { "Starten", "Abbrechen" };

int n = JOptionPane.showOptionMessage( this, "Hallo World", "Test", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0] );

if( n == JOptionPane.YES_OPTION )
      System.out.println( "Starten gewählt!" );

In diesem Fall sind 2 Buttons zu sehen, die nicht fokussiert sind, wo man auch mit Tab die Buttons hin und her springen kann.

Muss ich das selber bauen, in dem ich einen eigenen Container baue und damit dann in JDialog übergeben oder was meint ihr?

Gruß
Sebastian
 
Hallo,

In diesem Fall sind 2 Buttons zu sehen, die nicht fokussiert sind, wo man auch mit Tab die Buttons hin und her springen kann.

Muss ich das selber bauen, in dem ich einen eigenen Container baue und damit dann in JDialog übergeben oder was meint ihr?

was willst du selber bauen

MFG

zEriX
 
Hi!

Das war nur eine Überlegung, wie ich an die Buttons rankomme, so dass man mit der TAB-Taste die Buttons in der Meldung "showOptionMessage" hin und her wechseln kann und auch eine Möglichkeit geben kann, mit Tastenkombination die Buttons zu wählen, z.B. Button-Name "Starten" und "Abbrechen" mit ShortCut "STRG + S" wäre für Starten oder "STRG + A" wäre für Abbrechen!

Da liege ich im Moment das Problem und mir fällt keine Idee ein, wie ich das ganze aufbaue!

Gruß
Sebastian
 
Moin, moin!

Entschuldigung, dass ich das Problem nicht genauer erklären konnte bzw. mein Minimalbeispiel geben konnte!

Also, ich habe nochmal kräftig geprüft bzw. gesucht, warum der Focus der Buttons nicht zum Nächsten springt!

Ich habe soweit den Fehler gefunden. Hier ist der Code von meinem eigenen FocusManager:

Code:
public class CustomFocusManager extends FocusManager implements Protokoll {
		
	public CustomFocusManager() {
		super();
	}
	
	public void processKeyEvent( Component component, KeyEvent event ) {
		if( component instanceof CustomFocusManagerSupport )
		{
			if( event.getKeyCode() == KeyEvent.VK_ENTER || 
			    event.getKeyCode() == KeyEvent.VK_TAB ||
			    event.getKeyChar() == '\t' ) 
			{                
				if(event.getID() == KeyEvent.KEY_PRESSED)
                                {
                                      if ((event.getModifiers()
                                          & ActionEvent.SHIFT_MASK) == ActionEvent.SHIFT_MASK) 
                                      {
                                             focusPreviousComponent(component);
                                      }
                                      else 
                                      {
                                             focusNextComponent(component);
                                      }
                                 }
                
                                 event.consume();
			}
		}			
	}
    
    public void focusNextComponent(Component component) {
        if(component instanceof CustomFocusManagerSupport) {
            CustomFocusManagerSupport focusedComponent = (CustomFocusManagerSupport) component;
            if (focusedComponent.getNextFocus() != null ) 
            {            	
            	focusedComponent.getNextFocus().grabFocus();
            }
        }
    }
    
    public void focusPreviousComponent(Component component) {
        if(component instanceof CustomFocusManagerSupport) {
            CustomFocusManagerSupport focusedComponent = (CustomFocusManagerSupport) component;
            if (focusedComponent.getPreviousFocus() != null) 
            {
            	focusedComponent.getPreviousFocus().grabFocus();
            }
        }
    }
}

Wenn ich in der Meldung showOptionDialog mit der Tab-Taste zum nächsten Button springe, reagiert der FocusManager sofort und beim Debuggen sehe ich in der Methode processKeyEvent bei der Variable component, die sich in der if-Abfrage befindet, eine Instanz von JButton! Ab da habe ich keinen Plan, dass der FocusManager nicht auf die Buttons der Meldung reagieren darf! Mit return; funktioniert das nicht!

Natürlich funktioniert es sonst mit dem Focusspringen bei JOptionPane.showOptionDialog(..) , wenn ich keinen FocusManager genommen hätte! Ich habe aber ein riesen großes Programm, wo ich mit FocusManager verwenden muss! Deshalb kann ich das nicht drauf verzichten.

Ich hoffe, ihr könnt mir dann weiterhelfen, wo mein Problem liegt!

Gruß
Sebastian
 
Zurück