用于通过对象哈希图保存功能的设置的 GUI (java)
GUI for settings with save capabilities via Hashmap of Objects (java)
我在创建将我的设置保存到文本文件的 GUI 时遇到问题。这是我目前已经实现的。
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 760, 494);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
frame.getContentPane().add(panel, BorderLayout.NORTH);
JLabel lblMudknife = new JLabel("MudKnife");
lblMudknife.setFont(new Font("Tahoma", Font.BOLD, 14));
panel.add(lblMudknife);
JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
frame.getContentPane().add(tabbedPane, BorderLayout.CENTER);
JPanel panel_1 = new JPanel();
tabbedPane.addTab("Build", null, panel_1, null);
panel_1.setLayout(null);
JTabbedPane tabbedPane_1 = new JTabbedPane(JTabbedPane.TOP);
tabbedPane.addTab("Settings", null, tabbedPane_1, null);
JPanel panel_2 = new JPanel();
tabbedPane_1.addTab("Environment", null, panel_2, null);
panel_2.setLayout(null);
JPanel panel_3 = new JPanel();
tabbedPane_1.addTab("Scraper", null, panel_3, null);
panel_3.setLayout(null);
.....
HashMap<String, Object[]> hm = new HashMap<String, Object[]>();
Object[] a = new Object[2];
...
a[0] = new JLabel("SecondFactorHREF");
a[1] = new JTextField();
hm.put("SecondFactorHREF", a);
a[0] = new JLabel("SplashPage");
a[1] = new JTextField();
hm.put("SplashPage", a);
int x = 10;
int y = 10;
int widthLabel = 70;
int heightLabel = 15;
int widthField = 90;
int heightField = 15;
for (Entry<String, Object[]> entry : hm.entrySet()) {
key = entry.getKey();
label = (JLabel) entry.getValue()[0];
label.setText(key);
label.setBounds(x, y, widthLabel, heightLabel);
field = (JTextField) entry.getValue()[1];
field.setBounds(x+90,y,widthField,heightField);
panel_2.add(label);
panel_2.add(field);
System.out.println(entry.getValue().toString());
System.out.println("Key, Label Value, Field Value: " + key + ", " + label.getName() + ", " + field.getText());
y += 15;
}
这将无法在布局中正确显示。它似乎只显示了 hashMap 中的最后一个。
从这里我有一个 class 可以将任何对象保存到文件中。然后我计划只读取对象并在需要初始化设置时迭代它。
您不断向 HashMap 添加相同的数组对象,但当您不断更改其内容时,它仍然是完全相同的数组对象,并且数组引用永远不会改变。如果你想添加一个新的数组对象,你应该创建一个新的数组对象。
更好的是,只需将其设为 HashMap<String, JTextField>
并即时创建 JLabel:
HashMap<String, JTextField> hm = new HashMap<>();
// ........
hm.put("SecondFactorHREF", new JTextField());
hm.put("SplashPage", new JTextField());
for (Entry<String, JTextField> entry : hm.entrySet()) {
key = entry.getKey();
label = new JLabel(key);
// .... no done't set bounds -- use layout managers!
// label.setBounds(x, y, widthLabel, heightLabel);
field = entry.getValue();
// field.setBounds(x+90,y,widthField,heightField); // again use layout managers
panel_2.add(label);
panel_2.add(field);
}
此外,不要使用空布局和 setBounds,而是使用布局管理器。虽然空布局和 setBounds()
对于 Swing 新手来说似乎是创建复杂 GUI 的最简单和最好的方法,但您创建的 Swing GUI 越多,您在使用它们时就会 运行 遇到更严重的困难。它们不会在 GUI 调整大小时调整您的组件的大小,它们是皇家 来增强或维护,它们在放置在滚动窗格中时完全失败,它们在所有平台或屏幕分辨率上查看时看起来 gawd-awful和原来的不一样。
我在创建将我的设置保存到文本文件的 GUI 时遇到问题。这是我目前已经实现的。
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 760, 494);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
frame.getContentPane().add(panel, BorderLayout.NORTH);
JLabel lblMudknife = new JLabel("MudKnife");
lblMudknife.setFont(new Font("Tahoma", Font.BOLD, 14));
panel.add(lblMudknife);
JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
frame.getContentPane().add(tabbedPane, BorderLayout.CENTER);
JPanel panel_1 = new JPanel();
tabbedPane.addTab("Build", null, panel_1, null);
panel_1.setLayout(null);
JTabbedPane tabbedPane_1 = new JTabbedPane(JTabbedPane.TOP);
tabbedPane.addTab("Settings", null, tabbedPane_1, null);
JPanel panel_2 = new JPanel();
tabbedPane_1.addTab("Environment", null, panel_2, null);
panel_2.setLayout(null);
JPanel panel_3 = new JPanel();
tabbedPane_1.addTab("Scraper", null, panel_3, null);
panel_3.setLayout(null);
.....
HashMap<String, Object[]> hm = new HashMap<String, Object[]>();
Object[] a = new Object[2];
...
a[0] = new JLabel("SecondFactorHREF");
a[1] = new JTextField();
hm.put("SecondFactorHREF", a);
a[0] = new JLabel("SplashPage");
a[1] = new JTextField();
hm.put("SplashPage", a);
int x = 10;
int y = 10;
int widthLabel = 70;
int heightLabel = 15;
int widthField = 90;
int heightField = 15;
for (Entry<String, Object[]> entry : hm.entrySet()) {
key = entry.getKey();
label = (JLabel) entry.getValue()[0];
label.setText(key);
label.setBounds(x, y, widthLabel, heightLabel);
field = (JTextField) entry.getValue()[1];
field.setBounds(x+90,y,widthField,heightField);
panel_2.add(label);
panel_2.add(field);
System.out.println(entry.getValue().toString());
System.out.println("Key, Label Value, Field Value: " + key + ", " + label.getName() + ", " + field.getText());
y += 15;
}
这将无法在布局中正确显示。它似乎只显示了 hashMap 中的最后一个。
从这里我有一个 class 可以将任何对象保存到文件中。然后我计划只读取对象并在需要初始化设置时迭代它。
您不断向 HashMap 添加相同的数组对象,但当您不断更改其内容时,它仍然是完全相同的数组对象,并且数组引用永远不会改变。如果你想添加一个新的数组对象,你应该创建一个新的数组对象。
更好的是,只需将其设为 HashMap<String, JTextField>
并即时创建 JLabel:
HashMap<String, JTextField> hm = new HashMap<>();
// ........
hm.put("SecondFactorHREF", new JTextField());
hm.put("SplashPage", new JTextField());
for (Entry<String, JTextField> entry : hm.entrySet()) {
key = entry.getKey();
label = new JLabel(key);
// .... no done't set bounds -- use layout managers!
// label.setBounds(x, y, widthLabel, heightLabel);
field = entry.getValue();
// field.setBounds(x+90,y,widthField,heightField); // again use layout managers
panel_2.add(label);
panel_2.add(field);
}
此外,不要使用空布局和 setBounds,而是使用布局管理器。虽然空布局和 setBounds()
对于 Swing 新手来说似乎是创建复杂 GUI 的最简单和最好的方法,但您创建的 Swing GUI 越多,您在使用它们时就会 运行 遇到更严重的困难。它们不会在 GUI 调整大小时调整您的组件的大小,它们是皇家 来增强或维护,它们在放置在滚动窗格中时完全失败,它们在所有平台或屏幕分辨率上查看时看起来 gawd-awful和原来的不一样。