【发布时间】:2011-05-06 22:03:31
【问题描述】:
我使用 NetBeans 创建了一个 jFrame,当单击主 GUI 上的按钮以添加新条目时,它会打开。我想知道是否有一种方法可以为显示 jFrame 表单时显示的每个新条目提供唯一的 id。除了唯一的 id,我还希望创建一个文本字段 createdOn 自动填充当前日期。
【问题讨论】:
我使用 NetBeans 创建了一个 jFrame,当单击主 GUI 上的按钮以添加新条目时,它会打开。我想知道是否有一种方法可以为显示 jFrame 表单时显示的每个新条目提供唯一的 id。除了唯一的 id,我还希望创建一个文本字段 createdOn 自动填充当前日期。
【问题讨论】:
在JVM执行程序的整个生命周期中,hashCode()可以作为一个唯一的ID; UUID 是另一种选择。该示例在每次按下按钮时显示一个新的Date。
附录:经过仔细审查,java.util.Date 的 hashCode() 方法可能不是唯一的。特别是,“不要求如果两个对象根据 equals(java.lang.Object) 方法不相等,则对两个对象中的每一个调用 hashCode 方法必须产生不同的整数结果。”您也许可以使用getTime() 中的long,但分辨率为一毫秒。
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
/** @see http://stackoverflow.com/questions/4128432 */
public class AddTest extends JPanel {
private static final DateFormat format =
new SimpleDateFormat("yyyy-MMM-dd hh:mm:ss.SSS");
private final List<TestPanel> panels = new ArrayList<TestPanel>();
public AddTest() {
this.setLayout(new GridLayout(0, 1));
TestPanel tp = new TestPanel();
panels.add(tp);
this.add(tp);
this.validate();
Dimension d = tp.getPreferredSize();
this.setPreferredSize(new Dimension(d.width, d.height * 8));
}
private static class TestPanel extends JPanel {
public TestPanel() {
Date date = new Date();
this.add(new JLabel(String.valueOf(date.hashCode())));
this.add(new JTextField(format.format(date)));
}
}
private void display() {
JFrame f = new JFrame("AddTest");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(this, BorderLayout.CENTER);
JButton button = new JButton(new AbstractAction("New") {
@Override
public void actionPerformed(ActionEvent e) {
TestPanel tp = new TestPanel();
panels.add(tp);
AddTest.this.add(tp);
AddTest.this.revalidate();
AddTest.this.repaint(); // may be required
}
});
f.add(button, BorderLayout.SOUTH);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new AddTest().display();
}
});
}
}
【讨论】:
Date 的连续值最多可以相隔一毫秒。
repaint() 在revalidate() 之后可能是必要的。