Ich versuche, eine Funktion zu implementieren showTexfieldSettingsDialouge (Map-Felder) in einer kleinen 'Code Generator'-Anwendung, eine Hashmap voll mit Strings als Eingabe , zeigt ein Swing-Fenster mit iterativ erstellten Panels und Textfeldern für jeden in der Hashmap genannten Schlüssel und gibt diese Hashmap mit den Eingaben vom Benutzer nach Anklicken eines Buttons zurück.Lassen Sie eine Java-Funktion warten, bis eine Schaltfläche geklickt wird, bis
Das Problem: Um auf den Button zu warten, muss ich einen ActionListener erstellen, der in einem neuen (dem Swing-) Thread läuft. Wie kann ich die Funktion warten lassen, bis der ActionListener ausgelöst wird, weitermachen, die Eingabe schreiben und dann zurückgeben?
Für eine bessere Hilfe, die ich nach dem Code kann ich bis jetzt geschrieben:
public class GUIMacroHandler {
//diverse other functions
public HashMap<String, String> showTexfieldSettingsDialouge(Map<String, String> fields){
JFrame mainFrame = new JFrame("Please fill every Textfield with the correct Data");
Map<String, JLabel> labels = new HashMap<String, JLabel>();
Map<String, JTextField> textfields = new HashMap<String, JTextField>();
JPanel optionpanel = new JPanel(new GridLayout(fields.size(), 2, 10, 10));
JSplitPane splitPane = new JSplitPane();
JButton btnSubmit = new JButton("Submit");
splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
mainFrame.getContentPane().add(splitPane, BorderLayout.NORTH);
splitPane.setTopComponent(optionpanel);
splitPane.setBottomComponent(btnSubmit);
for (Entry<String, String> entry : fields.entrySet()) {
labels.put(entry.getKey(),new JLabel(entry.getKey() + ":"));
textfields.put(entry.getKey(),new JTextField(entry.getValue());
optionpanel.add(labels.get(entry.getKey()));
optionpanel.add(textfields.get(entry.getKey()));
}
btnSubmit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
//Can't do stuff here because the function needs to return after the button is clicked and not before
}
});
mainFrame.pack();
mainFrame.setVisible(true);
//TODO:
//Wait for button to be clicked somehow
//Fill the given values with the input of the text fields
return fields;
}
}
Die Funktion im Code mehr als einmal gegossen und wird gedacht, um leicht beliebigen String/String HashMap zu ändern, indem Benutzer gesucht Werte. f.e. so wie:
GUIMacroHandler guiMacroHandler = new GUIMacroHandler();
combatsettings = guiMacroHandler.showTexfieldSettingsDialouge(combatsettings);
ich eine ganze Zeit gegoogelt habe ein keine Lösung für mein Problem gefunden, würde ich um Hilfe, danke im voraus wirklich glücklich sein! : D
Edit: einfach das Zeug in der Aktion ausgeführt Anweisung gibt nur eine mögliche Lösung wäre, wenn ich diese Funktion nur einmal im Code verwenden würde, aber nicht hier, weil die Funktion zu warten gezwungen wird, die Schaltfläche, die geklickt werden soll, um zurückzugeben Im eigentlichen Code würde das GUI - Fenster mit den Eingängen der Hashmap erstellt werden und dann die gegebene Hashmap zurückgeben und der Code würde ohne Benutzereingaben weitergehen, das Fenster würde immer noch existieren und auf die warten Klicken Sie auf die Schaltfläche, auf die geklickt wird, um schließlich ablaufen zu können, aber keine Verwendung für vom Benutzer geänderte Daten und Code würde mit den Standardwerten fortgesetzt, da er nicht auf die Benutzereingabe wartet.
Warum nicht das Zeug im Action-Listener? –
Was Murat sagt. Führen Sie einfach Ihre Operation in der 'actionPerformed'-Methode des Listeners gemäß dem Design aus. – Mena
Wäre eine mögliche Lösung, wenn ich diese Funktion nur einmal im Code verwenden würde, aber wie bekomme ich die gefüllte Map in der Return-Anweisung, wenn sie wie abgebildet dargestellt wird? - Im eigentlichen Code würde das GUI-Fenster mit den Eingängen der Hashmap erstellt werden und dann die gegebene Hashmap zurückgeben und der Code würde ohne Benutzereingabe weitergehen, das Fenster würde immer noch existieren und darauf warten, dass die Schaltfläche zum letzten Mal angeklickt wird , aber keine Verwendung für vom Benutzer geänderte Daten und Code würde mit den Standardwerten fortfahren, weil er nicht auf die Benutzereingabe wartet. – Jeve