Как обновить JTextFields в GridLayout?

У меня есть MainPanel, который использует Gridlayout. Следовательно, я создал четыре класса JPanel для макетов: СЕВЕР, ВОСТОК, ЦЕНТР и ВОСТОК соответственно. Затем я добавляю все четыре в свой MainPanel.

Однако на моей панели WEST я использую другой макет сетки для хранения JButtons и JTextFields. Я хочу постоянно обновлять свои JTextFields, поскольку они отображают значение (которое меняется при нажатии кнопки на другой панели). Как разрешить изменение этого значения во время работы JFrame?

Я пытался использовать paintComponent, но он продолжает добавлять несколько копий одного и того же JTextField друг за другом, когда я добавляю его в свой метод paintComponent. Если я удалю метод добавления, значения не будут обновляться.


person nsc010    schedule 18.02.2013    source источник
comment
У вас есть код? Однако, как правило, в Swing очень мало причин переопределять paintComponent, если только вы не создаете свой собственный виджет.   -  person matt forsythe    schedule 18.02.2013
comment
Не могу загрузить код, так как он является частью задания   -  person nsc010    schedule 18.02.2013
comment
Я думаю, вы имеете в виду BorderLayout. Что вы подразумеваете под обновлением JTextField? Изменить его текст? Если это так, просто вызовите метод setText().   -  person JB Nizet    schedule 18.02.2013
comment
значение отображает число из другого класса, поэтому оно получает значение из поля этого класса. Это значение постоянно меняется, поэтому новые значения не будут обновляться на моей панели после запуска фрейма.   -  person nsc010    schedule 18.02.2013
comment
Можете ли вы загрузить небольшой фрагмент кода, который компилируется и подчеркивает поведение, которое вы видите?   -  person matt forsythe    schedule 18.02.2013
comment
@JB Nizet Проблема решена, мне просто нужно было вызвать setText() в моем методе рисования.   -  person nsc010    schedule 18.02.2013
comment
Мне нужно было вызвать setText() в моем методе рисования. Это подозрительно похоже на то, что вы никогда не должны делать. Чтобы быстрее получить помощь, опубликуйте SSCCE.   -  person Andrew Thompson    schedule 19.02.2013


Ответы (1)


Action хорошо подходит для инкапсуляции такой функциональности. В приведенном ниже примере несколько текстовых полей прослушивают ActionEvent, полученное от одной кнопки Обновить. Общее UpdateHandler происходит от AbstractAction.

изображение

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

/** @see http://stackoverflow.com/a/14947144/230513 */
public class Test {

    private JButton button = new JButton("Update");

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(createPanel(button), BorderLayout.NORTH);
        f.add(createPanel(button), BorderLayout.WEST);
        f.add(createPanel(button), BorderLayout.EAST);
        f.add(createPanel(button), BorderLayout.SOUTH);
        JPanel p = new JPanel();
        p.add(button);
        f.add(p, BorderLayout.CENTER);
        f.getRootPane().setDefaultButton(button);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    private static JPanel createPanel(JButton b) {
        JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER));
        final JTextField text = new JTextField();
        b.addActionListener(new UpdateHandler(text));
        panel.add(text);
        return panel;
    }

    private static class UpdateHandler extends AbstractAction {

        private JTextField text;
        private DateFormat df = new SimpleDateFormat("HH:mm:ss.SSS");

        public UpdateHandler(JTextField t) {
            super("update");
            t.setText(df.format(new Date()));
            this.text = t;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            text.setText(df.format(new Date()));
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test().display();
            }
        });
    }
}
person trashgod    schedule 18.02.2013