Swing DefaultButton

Status
Nicht offen für weitere Antworten.

leaves

Mitglied
Hallo zusammen,

wir haben eine grafischen Oberfläche mit einem Textfeld.
Der Text soll nicht nur verschickt werden, wenn ich mit der Maus auf senden klicke, sondern auch, wenn ich die Eingabetaste auf der Tastatur betätige.

Mit der Zeile ist das möglich:
frame.getRootPane().setDefaultButton(jButton1);

Was mache ich aber, wenn ich einen Container statt Frame habe??


Java:
jButton1.setBounds(48, 248, 121, 33);
    jButton1.setText("Senden");
    jButton1.setToolTipText("<html>Sendet die Nachricht an ...</html>");
    
  cp.getRootPane().setDefaultButton(jButton1);    // Geht nicht

    jButton1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton1_ActionPerformed(evt);

Vielen Dank für die Hilfe :)
 
G

Gast2

Gast
Hallo zusammen,

wir haben eine grafischen Oberfläche mit einem Textfeld.
Der Text soll nicht nur verschickt werden, wenn ich mit der Maus auf senden klicke, sondern auch, wenn ich die Eingabetaste auf der Tastatur betätige.

Mit der Zeile ist das möglich:
frame.getRootPane().setDefaultButton(jButton1);

Was mache ich aber, wenn ich einen Container statt Frame habe??


Java:
jButton1.setBounds(48, 248, 121, 33);
    jButton1.setText("Senden");
    jButton1.setToolTipText("<html>Sendet die Nachricht an ...</html>");
    
  cp.getRootPane().setDefaultButton(jButton1);    // Geht nicht

    jButton1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton1_ActionPerformed(evt);

Vielen Dank für die Hilfe :)

beim container einfach add?

und bei dem button dann die actionmap übeschreiben wenn die eingabetaste funktionieren soll
 

Ebenius

Top Contributor
Was mache ich aber, wenn ich einen Container statt Frame habe??
Du suchst Dir zum richtigen Zeitpunkt (displayable) das zugehörige JRootPane raus. Eine andere Möglichkeit gibt's nicht. So oder so ähnlich könnte es gehen:
Java:
jButton1.addAncestorListener(new AncestorListener() {
  public void ancestorAdded(AncestorEvent event) {
    final JButton button = (JButton) event.getSource();
    final JRootPane root = SwingUtilities.getRootPane(button);
    if (root != null && root.getDefaultButton() == null) {
      root.setDefaultButton(button);
    }
  }

  public void ancestorRemoved(AncestorEvent event) {
    final JButton button = (JButton) event.getSource();
    final JRootPane root = SwingUtilities.getRootPane(event.getAncestorParent());
    if (root != null && root.getDefaultButton() == null) {
      root.setDefaultButton(button);
    }
  }

  public void ancestorMoved(AncestorEvent event) {}
});
[size=-1]Code im Browser getippt[/size]
Ebenius
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
und bei dem button dann die actionmap übeschreiben wenn die eingabetaste funktionieren soll
Der DefaultButton ist ein besonderer Button, der nicht nur auf die Eingabetaste reagiert. Zum Beispiel reagiert er auch auf CTRL+ENTER (ENTER ist ja oft schon belegt, zum Beispiel für den Zeilenumbruch in mehrzeiligen Textfeldern). Außerdem wird der DefaultButton in fast jedem LookAndFeel optisch hervorgehoben; zum Beispiel in typischen OK_CANCEL-Nachrichtenfenstern (eigentlich in fast allen Dialogen). Einfach so nur die ActionMap zu modifizieren ist also eher suboptimal.

Bzgl. meines Quelltext oben: Man kann das sicher so oder ähnlich tun, ich rate trotzdem davon ab. Nur derjenige der das gesamte Fenster aufbaut, weiß auch, was sich im ganzen Fenster so alles befindet. Der DefaultButton ist ein Highlander (kann nur einen geben) und die Kinderchen des Fensters können nicht wirklich wissen in welchem Kontext sie sich selbst befinden. Also lieber eine Methode [c]public JButton getDefaultButton()[/c] in die Kinderkomponente einbauen und an der Stelle wo das Fenster zusammengebaut wird den Button holen und zum DefaultButton machen.

Ebenius
 

leaves

Mitglied
Java:
cp.add(getRootPane().setDefaultButton(jButton1);
bleibt ohne Erfolg.
 

leaves

Mitglied
OK. Das heißt in meinem Fall auf dem Textfeld - wenn wir den Container nehmen, wo alle "Objekte" enthalten sind.

Danke für die Hilfe
 

Ebenius

Top Contributor
Wenn Du einen Button auf ein Panel legst, so ist der Button ein Kind des Panels. Wenn das Panel wieder auf einem anderen Panel liegt, ist das erstere Kind des zweiten, usw.

Nein, das JRootPane ist nicht Dein Textfeld. Das JRootPane liegt direkt auf dem Fenster und nur dort. Siehe die Graphik in API-Doc: JRootPane. Kann auch nichts schaden mal im Sun Java™ Tutorial: How to Use Buttons über Default Buttons nachzulesen.

Grüße, Sebastian
 
G

Gast2

Gast
Also wenn ich das richtig verstanden hab sieht man den Default Button nicht, er regelt das Verhalten der anderen Buttons? z.B. bei Windows wenn Enter geklickt wurde, dass der Button betätigt wird
 

Ebenius

Top Contributor
Also wenn ich das richtig verstanden hab sieht man den Default Button nicht
Das hast Du nicht richtig verstanden. Im folgenden Bild ist der "Set"-Button der DefaultButton und man sieht (in den meisten LookAndFeels) einen unterschied; hier ein fetterer Rand:

NameChooserMetal.png


[Edit] Meinst Du mit "man sieht den Default Button nicht", dass er nicht angezeigt wird? Der Default Button muss ein Button sein, der in der GUI irgendwo vorhanden ist. Man teilt dem JRootPane nur mit, dass es sich zum Beispiel beim "OK"-Button um den Button handelt, den man aus Faulheit auch mal ohne Maus, ohne TAB-Taste und ohne Mnemonic bedienen möchte. Meistens schließt der DefaultButton einen Dialog; meistens mit positivem Resultat (also nicht Abbrechen). Und immer ist er auch noch irgendwo im Dialog/Fenster vorhanden.

er regelt das Verhalten der anderen Buttons?
Nö. Er "regelt" gar nix. Die JRootPane regelt. Der Default-Button wird bei ENTER aktiviert, wenn keine andere Komponente den ENTER-Event verspeist. Selbiges gilt bei CTRL+ENTER (zumindest in Windows und Linux).

Ebenius
 
Zuletzt bearbeitet:
G

Gast2

Gast
Mhm ok ist mir bei Windows noch nie aufgefallen das es in einem Dialog einen Button gibt der anders dargestellt wird...
Also setz ich der Rootpane einen Button der was "besonderes" ist und der hat besondere funktionionen, wie ich ihn aktivieren kann... Und jede Rootpane kann einen haben verstanden
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben