【问题标题】:How to update JTextFields in a GridLayout?如何更新 GridLayout 中的 JTextFields?
【发布时间】:2013-02-03 03:24:05
【问题描述】:

我有一个MainPanel,它使用Gridlayout。因此,我分别为 NORTH、EAST、CENTER 和 EAST 布局创建了四个 JPanel 类。然后我将所有四个添加到我的MainPanel。

但是,在我的 WEST 面板上,我使用另一个网格布局来存储 JButtons 和 JTextFields。我想不断更新我的JTextFields,因为它们显示一个值(当单击另一个面板上的按钮时会发生变化)。当JFrame 运行时,如何允许更改该值?

我尝试使用paintComponent,但它不断添加相同JTextField 的多个副本,因为我将它添加到我的paintComponent 方法中。如果我删除 add 方法,值将不会更新。

【问题讨论】:

  • 你有密码吗?不过,一般来说,在 Swing 中,除非您正在创建自己的小部件,否则几乎没有理由重写paintComponent。
  • 无法真正上传代码,因为它是作业的一部分
  • 我猜你的意思是BorderLayout。 “更新 JTextField”是什么意思?改变它的文字?如果是这样,只需调用setText() 方法即可。
  • 该值显示另一个类的数字,因此它从该类的字段中获取值。这个值是不断变化的,所以一旦框架运行,新值就不会在我的面板上更新
  • 您能否上传一小部分可编译并突出显示您所看到的行为的代码?

标签: java swing jpanel jtextfield paintcomponent


【解决方案1】:

Action 可以很好地封装此类功能。在下面的示例中,许多文本字段侦听从单个 Update 按钮接收的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();
            }
        });
    }
}

【讨论】:

    猜你喜欢
    • 2017-11-25
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 2017-02-10
    相关资源
    最近更新 更多