2012-05-29 3 views
1

Я работаю над приложением качания и решил решить, что может быть лучшим способом сохранить значения большого количества JTextFields. Приложение считывает файл свойств из некоторого сетевого местоположения. Файл свойств имеет около 10-12 свойств для каждого конкретного пользователя. Например, свойствоA_1 является свойством для пользователя 1 и propertA_2 для пользователя 2. В свойствах будет около 10-12 пользователей, поэтому для отображения значений будет около 80 JTextField. Свойства каждого пользователя будут показаны на JTabbedPane. Теперь я хочу сказать, что когда пользователь меняет значение любого JTextField для любого пользователя, отображаемого в каждой JTabbedPane, и нажимает кнопку «Сохранить», значение свойства должно быть сохранено. Скажите, что может быть лучшим способом обработки большого количества JtextField. Я думаю, что вы делаете это 2 путиЗахват смены текста большого количества JTextFields

  1. При нажатии кнопки «Сохранить» сохраняйте каждое значение свойства, получая значение из всех JTextFields.
  2. Определенный способ получить только те JTextFields, для которых текст изменен и сохранить их значения.

Я не уверен, как это сделать по варианту 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(); 
    } 
} 
+0

Я не уверен, что нашел ответ, хотя, как вы описали свою ситуацию, вы тоже ответили на него. Когда вы читаете из файла свойств, я думаю, вы делаете это с помощью ключа, чтобы получить значение, связанное с этим ключом, поэтому почему вы не можете просто применить это как ВАРИАНТ 2, установите этот ключ как имя ' JTextField' и просто обновите значение этого ключа нажатием кнопки. –

+0

Как вы можете это кодировать? Как узнать, изменяется ли значение JTextField при нажатии кнопки Jbutton (событие нажатия кнопки). Поскольку я хочу обновлять только те значения, которые были изменены, остальное останется таким, каким оно есть. –

+0

Существует еще один подход, который вы можете посмотреть, чтобы класс сказал 'USER', теперь, когда вы извлекаете значения из' DATABASE', помещаете их внутри этого класса, теперь, когда вы нажимаете кнопку «Сохранить», создайте другой объект этого класса скажем, 'updatedUser' и скопировать текущие значения' JTextField' в этот новый экземпляр, теперь сравните два значения, измените только измененные, оставите остальные. AFAIK, вычислительные значения в соответствующей системе намного быстрее, а затем обновляют всю базу данных за одну модификацию. –

ответ

2

Выработать немного над тем, что @nlcE корове предположить, что вы могли бы сделать что-то вроде этого:

1) Сделайте свою собственность окончательное:

 final Properties property = new Properties(); 

2) Перед тем как ваш для цикла, создать 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) Для каждого TextField вы создаете, вы помещаете объект на соответствующем документе, который будет хранить какое свойство представляет и добавить слушателя в 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.

Это быстрое решение &. Более чистым вариантом будет использование надлежащего шаблона MVC.

+0

Я думаю, это очень объясняет, как я хотел, чтобы это было сделано :-) Другим способом является наличие массива JTextField и добавление индекса соответствующего поля в ArrayList и сохранение содержимого соответствующих полей внутри База данных. Я не рядом с каким-либо ПК, этот IPAD не дает мне previlige для запуска программ, поэтому сегодня пишут комментарии :-) +1, для этого вашего творения. –

+0

Спасибо за помощь .. :-) –