L oop через вложенное поле в JPanel - PullRequest
0 голосов
/ 21 января 2020

Я сделал 2 класса, первый - JTextFields, второй - внедряет эти JTextFields в JPanel. Я пытаюсь .setText для каждого JTextField, но простой

    for (Field f: fields) {
    f.setValue("my text");
    }

не работает - он устанавливает текст только для JTextFields в одном JPanel. Поскольку каждое из JTextFields имеет уникальный идентификатор поля, не могли бы вы сказать мне, как установить для них Text (setValue)? Эти значения должны быть установлены вне циклов, используя ActionListener.

public class Field {

    JTextField field = new JTextField();
    static int fieldID = 0;
    private String text;
    public Field() {
        fieldID++;
    }

    public String getValue() {
        return field.getText();
    }

    public void setValue(String text) {
        field.setText(text);
    }
} 

public class Frame extends JFrame {

public Frame() {
    Field[] fields = new Field[9];
    JPanel[] corePane = new JPanel[9];
    JPanel frontPane = new JPanel();
    frontPane.setLayout(new GridLayout(3, 3));

    for (int i = 0; i < corePane.length; i++) {
        corePane[i] = new JPanel();
        for (int j = 0; j < 9; j++) {
            fields[j] = new Field();
            corePane[i].add(fields[j].field);
        }
        corePane[i].setLayout(new GridLayout(3, 3));
        frontPane.add(corePane[i]);
    }

    setLayout(new BorderLayout());
    setSize(300, 300);
    getContentPane().add(frontPane, BorderLayout.CENTER);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
}

public static void main(String args[]) {
    SwingUtilities.invokeLater(Frame::new);
}
}

Ответы [ 2 ]

1 голос
/ 21 января 2020

Итак, ваш fields, вероятно, должен быть двумерным массивом, например,

Field[][] fields = new Field[9][9];

Таким образом, вы можете получить доступ к полям (второе измерение) для данной панели (первое измерение), ie fields[pane][field].

Очевидно, что в вашем for-loop вам нужно будет правильно инициализировать массив для полей, например, fields[i] = new Field[9];

Это может сделать ваш код более похожим на .. .

public class Field {

    JTextField field = new JTextField();
    static int fieldID = 0;
    private String text;

    public Field() {
        fieldID++;
    }

    public String getValue() {
        return field.getText();
    }

    public void setValue(String text) {
        field.setText(text);
    }
}

public class Frame extends JFrame {

    public Frame() {
        Field[][] fields = new Field[9][9];
        JPanel[] corePane = new JPanel[9];
        JPanel frontPane = new JPanel();
        frontPane.setLayout(new GridLayout(3, 3));

        for (int i = 0; i < corePane.length; i++) {
            corePane[i] = new JPanel();
            fields[i] = new Field[9];
            for (int j = 0; j < 9; j++) {
                fields[i][j] = new Field();
                corePane[i].add(fields[i][j].field);
            }
            corePane[i].setLayout(new GridLayout(3, 3));
            frontPane.add(corePane[i]);
        }

        setLayout(new BorderLayout());
        setSize(300, 300);
        getContentPane().add(frontPane, BorderLayout.CENTER);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(Frame::new);
    }
}

Теперь слово static

static int fieldID = 0;

будет означать, что каждый экземпляр Field будет иметь одинаковый fieldID, независимо от того, что вы его измените. к. Для меня (и исходя из того, что вы сказали), не имеет смысла использовать static таким образом

Есть альтернативы этому, которые могут обеспечить лучшее и более повторно используемое решение

0 голосов
/ 21 января 2020

В качестве альтернативы решению @MadProgrammer я могу предложить вам несколько полезных методов, которые помогут вам решить эти задачи без объявления каких-либо массивов.

/**
 * Searches for all children of the given component which are instances of the given class.
 *
 * @param aRoot start object for search. May not be null.
 * @param aClass class to search. May not be null.
 * @param <E> class of component.
 * @return list of all children of the given component which are instances of the given class. Never null.
 */
public static <E> List<E> getAllChildrenOfClass(Container aRoot, Class<E> aClass) {
    return getAllChildrenOfClass(aRoot, aClass, e -> true);
}

/**
 * Searches for all children of the given component which are instances of the given class and satisfies the given condition.
 *
 * @param aRoot start object for search. May not be null.
 * @param aClass class to search. May not be null.
 * @param condition condition to be satisfied. May not be null.
 * @param <E> class of component.
 * @return list of all children of the given component which are instances of the given class. Never null.
 */
public static <E> List<E> getAllChildrenOfClass(Container aRoot, Class<E> aClass, Predicate<E> condition) {
    final List<E> result = new ArrayList<>();
    final Component[] children = aRoot.getComponents();
    for (final Component c : children) {
        if (aClass.isInstance(c) && condition.test(aClass.cast(c))) {
            result.add(aClass.cast(c));
        }
        if (c instanceof Container) {
            result.addAll(getAllChildrenOfClass((Container) c, aClass, condition));
        }
    }
    return result;
}

Теперь вы можете задавать текст для всех ваших текстовые поля.

getAllChildrenOfClass(getContentPane(), JTextField.class).forEach(tf -> tf.setText("My text"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...