我程序中的两个课程给我带来了麻烦。第一个打开JFrame。第二个更新.properties文件上的数据。在JFrame中,有一个带有JTextAreas的面板和一个“Save Changes”按钮。当按下那个按钮时,我从第二个类中调用一个方法,但为了做到这一点,我必须
firstClass x = new firstClass();
因此,当按下按钮时,文件会更新,但会打开一个新的JFrame。我非常确定创建实例x
是导致这种情况的原因,但我不知道如何做到这一点。
第1课:
public class firstClass{
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
new firstClass();
}
});
}
JFrame go = new JFrame("firstClass");
JPanel panel = new JPanel();
JTextArea textArea = new JTextArea();
JButton savechanges = new JButton("Save");
public firstClass() {
panel.add(textArea);
panel.add(savechanges);
savechanges.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0){
secondClass f = new secondClass();
try {
f.UpdateData();
} catch (IOException e) {
e.printStackTrace();
}
}
});
go.add(panel);
go.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
go.setSize(750, 750);
go.setVisible(true);
}
第2课:
public class secondClass {
public static void main(String[] args) {
//creates properties file
}
public void UpdateData() throws IOException{
firstClass x = new firstClass(); // <-------------------------------
FileInputStream in = new FileInputStream("config.properties");
Properties props = new Properties();
props.load(in);
in.close();
FileOutputStream out = new FileOutputStream("config.properties");
props.setProperty("prop1", x.textArea.getText().toString());
props.store(out, null);
out.close();
}
答案 0 :(得分:2)
你是穿越目的,谁在这里实际控制谁谁负责什么?
分离责任区域,例如,您的SecondClass
仅(实际)负责从用户收集数据,而FirstClass
实际上是知道该数据应该是什么的人使用过,SecondClass
不应该关心...
这样想,SecondClass
是服务员,它接受订单并将信息提供给主管FirstClass
,谁知道如何履行订单并准备餐...
不要使用单独的框架(请参阅The Use of Multiple JFrames, Good/Bad Practice?出于某些原因而不应该这样做),请考虑使用某些kine的模态JDialog
。
对话框应根据用户关闭的方式收集用户的信息,使用调用者处理和处理结果......
SecondClass secondClass = new SecondClass();
int reason = secondClass.showDialog();
if (reason == SAVE_RESULTS) {
//... Get the data from the secondClass and save it...
}
有关详细信息,请参阅How to Make Dialogs
<强>更新强>
好的,你似乎想要的是某种“配置”管理器,它能够存储/检索值。
配置管理器将知道如何读取和写入属性,并且不关心任何其他内容,它具有明确定义的边界。然后,您需要让配置管理器根据需要读取或写入值...
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
public class TestConfig {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestConfig();
}
});
}
JFrame go = new JFrame("firstClass");
JPanel panel = new JPanel();
JTextArea textArea = new JTextArea();
JButton savechanges = new JButton("Save");
public TestConfig() {
panel.add(textArea);
panel.add(savechanges);
savechanges.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
try {
ConfigurationManager.INSTANCE.put("prop1", textArea.getText());
} catch (IOException ex) {
JOptionPane.showMessageDialog(panel, "Failed to write properties", "Error", JOptionPane.ERROR_MESSAGE);
}
}
});
go.add(panel);
go.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
go.setSize(750, 750);
go.setVisible(true);
}
public enum ConfigurationManager {
INSTANCE;
protected Properties readProperties() throws IOException {
Properties p = new Properties();
try (FileInputStream fis = new FileInputStream("config.properties")) {
p.load(fis);
}
return p;
}
public String get(String name) throws IOException {
return readProperties().getProperty(name);
}
public void put(String key, String vaue) throws IOException {
Properties p = readProperties();
p.put(key, vaue);
writeProperties(p);
}
protected void writeProperties(Properties p) throws IOException {
try (FileOutputStream fos = new FileOutputStream("config.properties")) {
p.store(fos, "Config");
}
}
}
}
这个例子非常繁重......每次读取一个值时,它都会从磁盘加载内容,每次设置该值时,都会存储到磁盘上。
你可以将值缓存在内存中,在第一次加载时读取它们,在将来的某个时间写入它们,但我希望你能得到这个想法