gpt4 book ai didi

java - 如何更新 GridLayout 中的 JTextFields?

转载 作者:行者123 更新时间:2023-11-30 09:26:23 25 4
gpt4 key购买 nike

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

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

我尝试使用 paintComponent,但是当我将它添加到我的 paintComponent 时,它会不断添加多个相同的 JTextField > 方法。如果我删除添加方法,值将不会更新。

最佳答案

Action可以很好地封装此类功能。在下面的示例中,许多文本字段监听从单个 Update 按钮收到的 ActionEvent。通用的 UpdateHandler 派生自 AbstractAction

image

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();
}
});
}
}

关于java - 如何更新 GridLayout 中的 JTextFields?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14940674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com