java - 通过对象 HashMap (java) 进行具有保存功能的设置的 GUI

标签 java user-interface hashmap save settings

我在创建将我的设置保存到文本文件中的 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 中的最后一个。

从这里我有一个类可以将任何对象保存到文件中。然后我计划在需要初始化设置时只读取该对象并迭代它。

最佳答案

您不断向 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);
}

此外,不要使用 null 布局和 setBounds,而应使用布局管理器。而空布局和 setBounds()对于 Swing 新手来说,Swing GUI 似乎是创建复杂 GUI 的最简单、最好的方法,您创建的 Swing GUI 越多,在使用它们时遇到的困难就越严重。当 GUI 调整大小时,它们不会调整组件的大小,它们是增强或维护的皇家女巫,放置在滚动 Pane 中时它们完全失败,在所有平台或与原始分辨率不同的屏幕分辨率上查看时,它们看起来非常糟糕.

关于java - 通过对象 HashMap (java) 进行具有保存功能的设置的 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34668546/

相关文章:

java - 如何从 Hashmap<String String> 获取 ArrayList

java - 可以在 Java 中向映射添加函数对象吗?

java - 移除 actionbar appcompat 下方的阴影

java - Netbeans,Control-O 打开类找到类但找不到文件

JavaFX 绘制形状时出现鼠标输入问题?

python - Tkinter.OptionMenu 未按预期工作

qt - 为什么在这种情况下 Qt ColumnView 小部件会崩溃?

java - HashMap 不根据键返回值

java - Java 中的 HashMap 和 Map 对象有什么区别?

java - 流口水的时间运算符,在时间范围内和另一个 Action 之后发生的 Action