2016-04-26 16 views
0

Ich habe ein Problem mit einem Stück Code. Wenn ich es in meiner GUI anklicke, öffnet es sich wieder, sobald ich Text eingegeben habe. Kann mir jemand erklären, was mit dem Code nicht stimmt? Ich bin mit dieser einen Namen in einem JLabel in meiner GUI wie dasBenutzereingabe für JLabel

setNameButton.addActionListener((ActionEvent e) -> { 

    String usernameinput; 
    String defaultUsername = "dom" + "baker"; 

    usernameinput = JOptionPane.showInputDialog(
     setNameButton, "Enter a username", 
     "Set username", JOptionPane.OK_CANCEL_OPTION); 
    { 
     username.setText(String.valueOf(usernameinput));  
    } 
}); 
+0

Ihre Frage ist unklar. Könnten Sie bitte etwas Code und ein bisschen mehr Information hinzufügen? –

Antwort

0

Ich habe eine einfache GUI erstellt, um Ihren Code zu testen, und der Dialog wird nur einmal geöffnet. Ich habe ein bisschen Ihren Hörer aufgeräumt, aber im Grunde ist es der gleiche Code. Ihr Problem könnte in einem anderen Teil Ihres Codes sein.

import java.awt.Component; 
    import java.awt.Dimension; 
    import java.awt.event.ActionEvent; 

    import javax.swing.Box; 
    import javax.swing.BoxLayout; 
    import javax.swing.JButton; 
    import javax.swing.JFrame; 
    import javax.swing.JLabel; 
    import javax.swing.JOptionPane; 
    import javax.swing.JPanel; 
    import javax.swing.SwingUtilities; 

    public class SimpleFrameTest extends JFrame { 

    JLabel username = new JLabel("Press button to enter your name here"); 

    public SimpleFrameTest() { 

     setSize(300, 300); 
     setTitle("Test"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 
     setResizable(true); 

     initComponents(); 

     setVisible(true); 

    } 

    private void initComponents() { 

     JPanel panel = new JPanel(); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 

     username.setAlignmentX(Component.CENTER_ALIGNMENT); 

     JButton setNameButton = new JButton("Set name"); 
     setNameButton.setAlignmentX(Component.CENTER_ALIGNMENT); 

     setNameButton.addActionListener((ActionEvent e) -> { 
      String usernameinput = JOptionPane.showInputDialog(setNameButton, "Enter a username", "Set username", JOptionPane.OK_CANCEL_OPTION); 

      if (usernameinput != null) { 
       username.setText(String.valueOf(usernameinput)); 
      } 
     }); 

     panel.add(Box.createRigidArea(new Dimension(5,10))); 
     panel.add(username); 
     panel.add(Box.createRigidArea(new Dimension(5,10))); 
     panel.add(setNameButton); 
     add(panel); 

    } 


    public static void main(String args[]){ 

     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new SimpleFrameTest(); 

     } 
    }); 

    } 

} 
+0

Ich denke, du könntest Recht haben, ich werde einen zweiten Blick durch meinen Code und sehen, ob es etwas gibt, das steht Danke für deine Hilfe –

+0

@dominicbaker Gern geschehen. :-) – RubioRic

0

Code verhält sich setzen, weil dieser

setNameButton.addActionListener((ActionEvent e) -> { 
      String usernameinput; 
      String defaultUsername = "dom" 
        + "baker"; 
      usernameinput = JOptionPane.showInputDialog(null, 

wie Sie sehen können, die JOptionPane.showInputDialog(setNameButton nimmt die setNameButton als Parameter, so sind Sie in einer Art rekursive Endlosschleife

Verwendung eine andere Taste für die ModalDialog:

Beispiel:

setNameButton.addActionListener((ActionEvent e) -> { 
      String usernameinput; 
      String defaultUsername = "dom" 
        + "baker"; 
      usernameinput = JOptionPane.showInputDialog(null, "Enter a username", "Set username", JOptionPane.OK_CANCEL_OPTION); 
      { 
       username.setText(String.valueOf(usernameinput)); 

      } 
     }); 
+0

Ich verstehe nicht ganz, verwenden Sie einen anderen Knopf? –

+0

ummm ok Ich meine, dieser Code JOptionPane.showInputDialog(setNameButton... wird den Code in der setNameButton ausführen, wenn Sie die Schaltfläche in den Popup-Fenstern drücken .... so müssen Sie eine andere Schaltfläche verwenden .... –

+1

Nein, der erste Parameter von showOptionPane gibt nur das übergeordnete Element des Dialogfelds für den Auswahlbereich an - hier findet keine Rekursion statt. – FredK