捕获大量JTextField的文本更改

时间:2012-05-29 06:21:09

标签: java swing

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

  1. 单击“保存”按钮,通过从所有JTextField获取值来保存每个属性值。
  2. 某种方式只获取那些文本被更改的JTextField并保存它们的值。
  3. 我不确定如何通过选项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();
        }
    }
    

1 个答案:

答案 0 :(得分:2)

要详细说明@nlcE cOw的建议,你可以做的是这样的:

1)让你的财产最终:

        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)当您按“保存”时,只需将property保存到outputStream。

这是快速&amp;肮脏的解决更清洁的选择是使用适当的MVC模式。