Java 我如何判断另一个类何时已更新?

Java 我如何判断另一个类何时已更新?,java,swing,actionlistener,Java,Swing,Actionlistener,我正在编写一个Java程序,它显示一个组合框,从属性文件中获取信息。有一个设置类,允许用户更新组合框中字段的名称。我的问题是,当调用和修改settings类时,我不知道如何用新设置更新组合框。我有一个方法,可以重新绘制整个面板并重新加载组合框。但我不知道在设置类中按下“应用”按钮时如何激活该方法 这是一个粗略而艰难的例子,说明了我正在努力实现的目标 主要类别: package testing; import java.awt.*; import java.awt.event.*; import

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

这是一个粗略而艰难的例子,说明了我正在努力实现的目标

主要类别:

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();
    }
}
配置文件名为config.properties,如下所示:

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

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

public void updateProperties(Properties p) {
    model.removeAllElements();
    for (String s: p.stringPropertyNames()) {
        model.addElement(p.getProperty(s));
    }
}
其中,
model
是一个
defaultcomboxmodel
。然后你就可以打电话了

optPanel.updateProperties(config);
在成功存储属性之后


有几点:

  • 首选方法是不使用多个
    JFrames
    。一个选项是使用带有模式对话框的单个
    JFrame
    。看这个
  • 不要扩展JFrame,而是直接使用实例
  • Java表示类名以大写字母开头,因此
    settings
    将变成
    settings

我通常会查看.class文件上的日期。我建议使用changeListener之类的工具,或者如果您对更改的属性的实际名称感兴趣,可以使用PropertyChangeListener(因为有一个合理的API支持它,这会让生活变得更轻松)-谢谢。我理解上面的方法,但由于某种原因,我很难理解回调函数。我已经看过了一些关于它的教程,但无法为我的示例找到正确的实现方法。现在就知道了。有趣的是,一点睡眠就能驱散迷雾。再次感谢您的帮助和要点。
optPanel.updateProperties(config);