我有一个使用MainPanel
的{{1}}。因此,我分别为:NORTH,EAST,CENTER和EAST布局创建了四个Gridlayout
类。然后我将所有四个添加到我的JPanel
。
但是,在我的WEST面板上,我使用另一种网格布局来存储MainPanel
和JButtons
。我想不断更新我的JTextFields
,因为它们显示一个值(当点击另一个面板上的按钮时会发生变化)。如何在JTextFields
运行时更改该值?
我尝试使用JFrame
,但它继续添加相同paintComponent
的多个副本,因为我在JTextField
方法中添加了它。如果我删除了add方法,则值不会更新。
答案 0 :(得分:2)
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();
}
});
}
}