Mehrere JTextField Felder in Schleife ändern

Hallo,

ich habe mehrere JTextfelder im GUI die von editierbar auf nicht editierbar geändert werden sollen.
Ich möcht aber nicht jedes einzelne Feld mit “dbFixToolId.setEditable(false);” ändern.
Ich möchte die Felder der Klasse ermitte4l und dann in einer Schleife abarbeiten.

Field[] fields = this.getClass().getDeclaredFields();
		
for (int i = 0; i < fields.length; i++)    {
    int strIndex = fields**.toString().indexOf("db");
    String lbName = fields**.getName();
    if (strIndex >= 0)   	{
        lbName.setEditable(false); // <-- Dies funktioniert nicht suche hierfür eine Lösung. lbName entält den Feldnamen.
    }
}              

Hm, dir ist schon klar, dass this.getClass().getDeclaredFields(); etwas völlig anderes als deine JTextFields zurückgibt oder? :wink:

Mach das folgendermaßen:
Sammel dir alle JTextField Instanzen in einer List<JTextField>. Dann kannst du mit einer Schleife gemütlich über die Liste iterieren:

List<JTextField> textFields = new ArrayList<JTextField>();
...
for (JTextfield textField : textFields) {
  textField.setEditable(false);
}

Oder erstelle dir alternativ eine Factory-Methode, die dir schon entsprechend konfigurierte JTextFields zurückgibt. Dann sparst du dir das nachträgliche ändern.

Wenn du es schon so versuchst dann solltest du es auch halbwegs korrekt machen : Container.getComponents()
Das gibt dir ein Array mit allen Component Objekten des jeweiligen Container.

Ansonsten würde ich den Vorschlag von EikeB empfehlen : wenn du schon keine Lust hast die benötigten Component irgendwo “mühsehlig” zu referenzieren dann bau dir eine Factory die das für dich übernimmt und im Hintergrund die benötigten Felder in eine List legt.

Ansonsten : sollte this.getClass().getDeclaredFields() wirklich die entsprechenden Component liefern weil du sie als global Member deklariert hast … ja, wäre 'ne Möglichkeit, trotzdem solltest du gerade dann lieber den “längeren” Weg nehmen und entsprechend die einzelnen Component disablen. Nebenbei : Änderungen an der GUI dürfen nur durch den EDT selbst vorgenommen werden > Stichwort SwingUtilities.invokeLater() / invokeAndWait() bzw. SwingWorker. Von einem anderen Thread aus Component.setEnable() zu callen kann zu Problemen führen.

Das ist ein typischer Anwendungsfall für das Listener-Konzept, dass man gerade in Swing häufiger findet:[SPOILER]```public class ListenerExample {
private final JFrame _frame = new JFrame(“ListenerExample”);

public ListenerExample() {
    final JCheckBox checkBoxEditable = new JCheckBox("TexFeldStatus");
    final JCheckBox checkBoxColor = new JCheckBox("TexFeldFarbe");
    JPanel textFieldPanel = new JPanel(new GridLayout(0, 5));
    for (int i = 0; i < 30; i++) {
        final JTextField textField = new JTextField(String.valueOf(i));
        {
            final boolean toggleState = 0 == i % 2;
            checkBoxEditable.addItemListener(new ItemListener() {

                @Override
                public void itemStateChanged(ItemEvent e) {
                    textField.setEnabled(toggleState
                            ^ checkBoxEditable.isSelected());
                }
            });
        }
        if (0 == i % 3) {
            final boolean toggleColor = 0 == i % 6;
            checkBoxColor.addItemListener(new ItemListener() {

                @Override
                public void itemStateChanged(ItemEvent e) {
                    textField.setBackground(toggleColor
                            ^ checkBoxColor.isSelected() ? Color.GREEN : Color.RED);
                }
            });
        }
        textFieldPanel.add(textField);
    }

    _frame.add(textFieldPanel);
    Container checkBoxPanel = new JPanel(new GridLayout(0, 1));
    checkBoxPanel.add(checkBoxEditable);
    checkBoxPanel.add(checkBoxColor);
    _frame.getContentPane().add(checkBoxPanel, BorderLayout.WEST);
    _frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    checkBoxEditable.setSelected(true);
    checkBoxColor.setSelected(true);

}

public static void main(String[] args) {
    new ListenerExample().run();
}

private void run() {
    _frame.pack();
    _frame.setVisible(true);
}

}```[/SPOILER]
Es besteht natürlich keine Plicht, die TextFelder in einer Schleife zu erzeugen…

bye
TT

macht das eigene MLAModul bisher nichts mit Swing?
(“GUI jar in GUI jar in GUI jar” wäre dann allerdings falscher Titel, eher “GUI jar in jar in GUI jar” ,
edit: ok, jetzt sehe ich auch im Text mehr eigenes GUI in MLAModul, aber noch nicht ganz deutlich)
starte dort testweise auch selber JOptionPane, einen JDialog, ein JFrame usw., alles mal durch, geht das aber das fremde SubModul geht nicht?

vielleicht blockiert die Hauptanwendung, die MLAModul aufruft, den AWT-Thread, weil aus ActionListener heraus gerufen wird,
dann dürften alle neuen Fenster ihre Probleme haben

teste evtl. auch, von MLAModul aus das fremde SubModul per Thread erst 3 sec später zu starten, selber die eigene Aktion beenden (falls eine vorliegt)
-> Hauptanwendung gibt hoffentlich AWT-Thread frei, nach 3 sec. gehts?