3

我正在编写一个 Java 程序,它显示一个从属性文件中获取信息的组合框。有一个设置类允许用户更新组合框中的字段名称。我的问题是当调用和修改设置类时,我无法弄清楚如何使用新设置更新组合框。我有一种方法可以重新绘制整个面板并重新加载组合框。但是我不知道在设置类中按下“应用”按钮时如何激活该方法。

这是我想要完成的一个粗略而艰难的例子。

主类:

package testing;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.Properties;

import javax.swing.*;

public class testConfigLoad extends JFrame
{
    JButton apply = new JButton("Apply");
JButton set   = new JButton("Settings");

    Properties          config      = new Properties();
    FileInputStream     fis         = null;
    FileOutputStream    fos         = null;
    final String        configFile  = "config.properties";

    OptPanel opt;

    public testConfigLoad() throws IOException
    {
        super("Test Program");
        setSize(200, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new FlowLayout());

        config();
        opt = new OptPanel(config);
        buildFrame();
    }

    public void buildFrame()
    {
        set.addActionListener(new setListener());

        add(opt);
        add(apply);
        add(set);

        setVisible(true);
    }

    public void config() throws IOException
    {
        try
        {
            fis = new FileInputStream(configFile);
            config.load(fis);
        }
        catch (FileNotFoundException e)
        {
            System.out.println("File not found");
        }
        finally
        {
            if (fis != null)
            {
                fis.close();
            }
        }       
    }

    private class setListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            settings set = new settings(config);
        }
    }

    public static void main(String[] args) throws IOException
    {
        new testConfigLoad();
    }
} 

需要刷新的面板:

package testing;

import java.util.Properties;
import javax.swing.*;

public class OptPanel extends JPanel
{
    String[] opts;
    JLabel optLabel = new JLabel("Available Options");
    Properties config;

    public OptPanel(Properties p)
    {
        config = p;
        opts = new String[3];
        buildPanel();
    }

    public void buildPanel()
    {
        for (int i = 0; i < opts.length; i++)
        {
            opts[i] = config.getProperty("option." + i + ".name");
        }

        JComboBox optBox = new JComboBox(opts);

        add(optLabel);
        add(optBox);
    }

    public void refPanel()
    {
        removeAll();
        this.buildPanel();
        ((JPanel) this).revalidate();
        repaint();
    }
}

和设置类:

package testing;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import javax.swing.*;

public class settings 
{
    Properties config;
    final String        configFile  = "config.properties";

    JFrame setFrame = new JFrame("Settings");
    JLabel opt1 = new JLabel("Option 1");
    JLabel opt2 = new JLabel("Option 2");
    JLabel opt3 = new JLabel("Option 3");
    JTextField text1 = new JTextField(15);
    JTextField text2 = new JTextField(15);
    JTextField text3 = new JTextField(15);
    JButton apply = new JButton("Apply");

    public settings(Properties p)
    {
        config = p;
        setFrame.setSize(275, 200);
        setFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
        setFrame.setLayout(new FlowLayout());

        buildSetFrame();
    }

    public void buildSetFrame()
    {
        text1.setText(config.getProperty("option.0.name"));
        text2.setText(config.getProperty("option.1.name"));
        text3.setText(config.getProperty("option.2.name"));

        apply.addActionListener(new applyListener());

        setFrame.add(opt1);
        setFrame.add(text1);
        setFrame.add(opt2);
        setFrame.add(text2);
        setFrame.add(opt3);
        setFrame.add(text3);
        setFrame.add(apply);

        setFrame.setVisible(true);
    }

    private class applyListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e) 
        {
            config.setProperty("option.0.name", text1.getText());
            config.setProperty("option.1.name", text2.getText());
            config.setProperty("option.2.name", text3.getText());

            FileOutputStream fos = null;
            try
            {
                fos = new FileOutputStream(configFile);
                config.store(fos, null);
            }
            catch (IOException f)
            {
                System.out.println("Error");
            }
            finally
            {
                if (fos != null)
                {
                    try
                    {
                        fos.close();
                    }
                    catch (IOException g)
                    {
                        System.out.println("Problem");
                    }
                }
            }
            setFrame.setVisible(false);

            //  This is where I need to pass something back to the 
                    //  testConfigLoad class to tell it to 
            //  run the refPanel method in the OptPanel class.
        }
    }
}   

配置文件名为 config.properties,如下所示:

option.2.name=two
option.1.name=one
option.0.name=zero
4

1 回答 1

4

一种方法是在OptPanelsettings类之间使用回调。您可以提取将元素添加到属性的功能JComboBox到它自己的方法中:

public void updateProperties(Properties p) {
    model.removeAllElements();
    for (String s: p.stringPropertyNames()) {
        model.addElement(p.getProperty(s));
    }
}

哪里modelDefaultComboBoxModel。然后你可以简单地打电话

optPanel.updateProperties(config);

成功存储属性后。


几点:

  • 首选方法是不使用多个JFrames. JFrame一种选择是使用带有模态对话框的单个。请参阅此讨论
  • 不要扩展 JFrame,而是直接使用实例。
  • Java命名约定表明类名以大写字母开头,因此settings将变为Settings
于 2013-01-27T23:35:07.013 回答