gpt4 book ai didi

java - 我如何知道另一个类何时更新?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:19:29 25 4
gpt4 key购买 nike

我正在编写一个显示组合框的 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

最佳答案

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

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

其中 model 是一个 DefaultComboBoxModel。然后你可以简单地调用

optPanel.updateProperties(config);

成功存储属性后。


一些要点:

  • 首选方法是不要使用多个 JFrames。一种选择是将单个 JFrame 与模态对话框一起使用。看这个discussion .
  • 不要扩展 JFrame,而是直接使用一个实例。
  • Java Naming conventions指示类名以大写字母开头,因此 settings 将变为 Settings

关于java - 我如何知道另一个类何时更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14553304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com