gpt4 book ai didi

java - 捕获大量 JTextField 的文本变化

转载 作者:行者123 更新时间:2023-11-30 04:46:48 25 4
gpt4 key购买 nike

我正在开发一个 swing 应用程序,并决定什么是保存大量 JTextField 值的最佳方法。应用程序从某个网络位置读取属性文件。属性文件为每个特定用户提供大约 10-12 个属性,例如 propertyA_1 是用户 1 的属性,propertA_2 是用户 2 的属性。属性中将有大约 10-12 个用户,因此将使用大约 80 个 JTextField 来显示值。每个用户的属性将显示在 JTabbedPane 上。我现在想做的是,当用户更改每个 JTabbedPane 中显示的任何用户的任何 JTextField 值并单击“保存”按钮时,应保存该属性的值。告诉我处理大量 JtextField 的最佳方法是什么。我想用两种方法来做

  1. 单击“保存”按钮时,通过从所有 JTextField 获取值来保存属性的每个值。
  2. 某种方法可以仅获取那些文本已更改的 JTextField 并保存其值。

我不知道如何通过选项 2 来做这件事。但我认为这是最好的方法。

这是我的代码:

public class IOSAutomationTool1 implements ActionListener {

JButton saveButton = new JButton("Click to Save");

/**
* @param args the command line arguments
*/

public void Test() throws IOException {

File file = new File("C:\\Documents and Settings\\test\\Desktop\\test.properties");

if( file != null ){

Properties property = new Properties();

property.load(new FileInputStream(file));

JFrame frame = new JFrame("IOSAutomationToolFourthPage");
frame.setLayout(new FlowLayout());
JPanel framePanel = new JPanel();
JPanel buttonPanel = new JPanel();
framePanel.setSize(700,700);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
String numberOfClients = property.getProperty("numberOfClients");
System.out.println("number of clients: "+numberOfClients);


saveButton.addActionListener(this);
buttonPanel.add(saveButton);
if (!numberOfClients.isEmpty()) {

int numberOfClientNumb = Integer.parseInt(numberOfClients);

System.out.println("numberOfClientNumb ::" + numberOfClientNumb);

JTabbedPane tab = new JTabbedPane();

// JTabbedPane tab2 = new JTabbedPane();
for( int i=1; i<=numberOfClientNumb; i++){

JPanel panel = new JPanel();
panel.setSize(400, 400);
panel.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(1, 1, 1, 1);

gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 0;
gbc.gridx = 0;

//Remote IP
JLabel remoteIPLbl = new JLabel("Remote IP : ");
panel.add(remoteIPLbl,gbc);
JLabel userNameLbl = new JLabel("User Name : ");
panel.add(userNameLbl,gbc);
JLabel remotePasswordLbl = new JLabel("Remote Password : ");
panel.add(remotePasswordLbl,gbc);
JLabel remotePathLbl = new JLabel("Remote Path : ");
panel.add(remotePathLbl,gbc);
JLabel deviceOrSimulatorLbl = new JLabel("Device or Simulator : ");
panel.add(deviceOrSimulatorLbl,gbc);

gbc.gridx = 1;
gbc.weightx = 1;

String remoteIPVal = property.getProperty("remoteIP_"+i);
JTextField remoteIPField = new JTextField(remoteIPVal);
//remoteIPLbl.setBounds(50, 100, 2, 2);
remoteIPField.setBounds(200, 100, 2, 2);
remoteIPField.setColumns(30);
panel.add(remoteIPField,gbc);

//Remote User Name


String userNameVal = property.getProperty("remoteUserName_"+i);
JTextField userNameField = new JTextField(userNameVal);
// userNameLbl.setBounds(50, 200, 2, 2);
userNameField.setBounds(200, 200, 2, 2);
userNameField.setColumns(20);
panel.add(userNameField,gbc);

//Remote Password

String remotePasswordVal = property.getProperty("remotePassword_"+i);
JTextField remotePasswordField = new JTextField(remotePasswordVal);
// remotePasswordLbl.setBounds(50, 300, 2, 2);
remotePasswordField.setBounds(200, 300, 2, 2);
remotePasswordField.setColumns(20);
panel.add(remotePasswordField,gbc);


//Remote Path

String remotePathVal = property.getProperty("remotePath_"+i);
JTextField remotePathField = new JTextField(remotePathVal);
// remotePathLbl.setBounds(50, 400, 2, 2);
remotePathField.setBounds(200, 400, 2, 2);
remotePathField.setColumns(100);
panel.add(remotePathField,gbc);



//deviceOrSimulator

String deviceOrSimulatorVal = property.getProperty("deviceOrSimulator_"+i);
JTextField deviceOrSimulatorField = new JTextField(deviceOrSimulatorVal);
//deviceOrSimulatorLbl.setBounds(50, 500, 2, 2);
deviceOrSimulatorField.setBounds(200, 500, 2, 2);
deviceOrSimulatorField.setColumns(1);
panel.add(deviceOrSimulatorField,gbc);


tab.add("Client "+i,panel);
System.out.println(""+i);
}

framePanel.add(tab);

frame.add(framePanel);

// frame.setLayout(new Lay);
}
//frame.add(saveButton);
frame.add(buttonPanel);
frame.setSize(800, 800);
frame.pack();
frame.setVisible(true);

}
}

@Override
public void actionPerformed(ActionEvent e) {
//throw new UnsupportedOperationException("Not supported yet.");

if(e.getSource() == saveButton){
System.out.print("button clicked...........");
}
}

public static void main(String[] args) throws IOException{

IOSAutomationTool1 obj = new IOSAutomationTool1();
obj.Test();
}
}

最佳答案

为了详细说明 @nlcE cOw 的建议,您可以做的是这样的:

1)使您的属性(property)最终确定:

        final Properties property = new Properties();

2) 在 for 循环之前,创建一个 DocumentListener:

    DocumentListener listener = new DocumentListener() {

private void updatePropertyForEvent(final Properties property, DocumentEvent e) {
Document document = e.getDocument();
Object value = document.getProperty("key");
if (value !=null)
try {
property.setProperty((String) value, document.getText(0, document.getLength()));
} catch (BadLocationException e1) {
// Should not happpen
e1.printStackTrace();
}
}

@Override
public void removeUpdate(DocumentEvent e) {
updatePropertyForEvent(property, e);
}

@Override
public void insertUpdate(DocumentEvent e) {
updatePropertyForEvent(property, e);
}

@Override
public void changedUpdate(DocumentEvent e) {
updatePropertyForEvent(property, e);
}
};

3) 对于您创建的每个文本字段,您在关联文档上放置一个属性,该属性将存储它代表的属性,并将监听器添加为 DocumentListener:

String remotePasswordVal = property.getProperty("remotePassword_"+i);
JTextField remotePasswordField = new JTextField(remotePasswordVal);
remotePasswordField.getDocument().putProperty("key", "remotePassword_"+i);
remotePasswordField.getDocument().addDocumentListener(listener);

4) 当您按“保存”时,您只需将属性保存到outputStream即可。

这是快速但肮脏的解决方案。更简洁的选择是使用正确的 MVC 模式。

关于java - 捕获大量 JTextField 的文本变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10794029/

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