你如何从jTextField获取数据并将其添加回数组?

时间:2014-11-26 22:15:59

标签: java swing user-interface arraylist jtextfield

我想从jTextField获取一个值并将其添加回数组。它不需要永久存储。我从这个数组中读取硬编码数据并将其输出到jList和jTextFields。如果我想编辑这些数据并保存,我该怎么做?我没有任何代码,因为我不知道从哪里开始。我在网上无休止地搜索过,但我发现的任何内容都没有意义。任何帮助将不胜感激!感谢

已更新!用代码。

我在主类中创建的所有ArrayLists。

public static ArrayList<Vol_Observer> volObserver = new ArrayList<>();
public static ArrayList<Pro_Observer> proObserver = new ArrayList<>();
public static ArrayList<Animal> animalDetails = new ArrayList<>();
public static ArrayList<String> watchList = new ArrayList<>();

具有最多细节的类。

public class Observers 
{  
public String firstName;
public String surname;
public String hNum;
public String streetName;
public String city;
public String county;
public String postcode;
public String email;
public String telNum;

public Observers(String firstName, String surname, String hNum, String streetName, String city, String county, String postcode, String email, String telNum)
{
    this.firstName = firstName;
    this.surname = surname;
    this.hNum = hNum;
    this.streetName = streetName;
    this.city = city;
    this.county = county;
    this.postcode = postcode;
    this.email = email;
    this.telNum = telNum;
}

public void setFirstName(String firstName)
{
    this.firstName = firstName;
}

public void setSurname(String surname) 
{
    this.surname = surname;
}

public void sethNum(String hNum) 
{
    this.hNum = hNum;
}

public void setStreetName(String streetName) 
{
    this.streetName = streetName;
}

public void setCity(String city)
{
    this.city = city;
}

public void setCounty(String county)
{
    this.county = county;
}

public void setPostcode(String postcode)
{
    this.postcode = postcode;
}

public void setEmail(String email)
{
    this.email = email;
}

public void setTelNum(String telNum)
{
    this.telNum = telNum;
}

public String getFirstName() 
{
    return firstName;
}

public String getSurname() 
{
    return surname;
}

public String gethNum() 
{
    return hNum;
}

public String getStreetName() 
{
    return streetName;
}

public String getCity()
{
    return city;
}

public String getCounty()
{
    return county;
}

public String getPostcode()
{
    return postcode;
}

public String getEmail()
{
    return email;
}

public String getTelNum() 
{
    return telNum;
}
}

从上面扩展的类具有某些其他细节。

public class Pro_Observer extends Observers
{
public String startDate;
public String endDate;
public String Salary;
public String numObservations;

public Pro_Observer(String firstName, String surname, String hNum, String streetName, String city, String county, String postcode, String email, String telNum, String startDate, String endDate, String Salary, String numObservations) 
{
    super(firstName, surname, hNum, streetName, city, county, postcode, email, telNum);
    this.startDate = startDate;
    this.endDate = endDate;
    this.Salary = Salary;
    this.numObservations = numObservations;
}

public String getStartDate() {
    return startDate;
}

public String getEndDate() {
    return endDate;
}

public String getSalary() {
    return Salary;
}

public String getNumObservations() {
    return numObservations;
}

public void setStartDate(String startDate) {
    this.startDate = startDate;
}

public void setEndDate(String endDate) {
    this.endDate = endDate;
}

public void setSalary(String Salary) {
    this.Salary = Salary;
}

public void setNumObservations(String numObservations) {
    this.numObservations = numObservations;
}
}

这是方法,因此当我单击此按钮时,应用程序应将输入jTextField的数据保存到ArrayList中。我有一个选择内容的jRadioButton,这是必需的,所以除非它不起作用,否则请忽略这段代码。

private void addSavejButtonMouseClicked(java.awt.event.MouseEvent evt) {                                            

    if(addVoljRadioButton.isSelected())
    {
        BWA.volObserver.add(addFirstNamejTextField.getText());
    }
}

1 个答案:

答案 0 :(得分:0)

我仍然不清楚你被困的地方,但我会猜测,也许你的问题是你无法构建感兴趣的对象在按钮处理程序中。如果是这样的话,我会尝试提供答案。如果情况并非如此,那么请按照我们的要求,提供更清晰的信息和更多代码。此外,在发布代码时,请尝试通过删除与您的问题无关的额外内容来简化代码。例如,为这个只有2或3个字段的问题创建一个新的Observers类,因为不需要整个字段。并且还提供一些GUI代码。您发布了一些代码,但还不足以让我们清楚地了解正在发生的事情。

例如,这是一个SimpleObserver:

class SimpleObserver {
   private String firstName;
   private String surName;
   private String hNum;

   public SimpleObserver(String firstName, String surName, String hNum) {
      this.firstName = firstName;
      this.surName = surName;
      this.hNum = hNum;
   }

   public String getFirstName() {
      return firstName;
   }

   public String getSurname() {
      return surName;
   }

   public String gethNum() {
      return hNum;
   }

}

请注意,字段应该是私有的,而不是公共的,因为Java OOP编程的一个主要好处是它可以通过允许限制类之间可能的连接来帮助降低程序的复杂性,而数据隐藏是一种方法这样做。

对此类的立即改进包括为其提供equals和hashCode方法。

接下来是一个显示输入字段和JList的简单GUI:

class SimpleGui extends JPanel {
   public static final int COLS = 8;
   private DefaultListModel<SimpleObserver> simpleObsListModel = new DefaultListModel<>();
   private JList<SimpleObserver> simpleObsList = new JList<>(simpleObsListModel);
   private JTextField firstNameField = new JTextField(COLS);
   private JTextField surNameField = new JTextField(COLS);
   private JTextField hNumField = new JTextField(COLS);

   public SimpleGui() {
      simpleObsList.setVisibleRowCount(8);
      simpleObsList.setCellRenderer(new SimpleObsListRenderer());
      simpleObsList.setPrototypeCellValue(new SimpleObserver("Big First Name", "Big Last Name", ""));

      // very simple GUI layout
      add(new JLabel("First Name:"));
      add(firstNameField);
      add(new JLabel("Last Name:"));
      add(surNameField);
      add(new JLabel("House Number:"));
      add(hNumField);

      JScrollPane scrollPane = new JScrollPane(simpleObsList);
      scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

      add(new JButton(new SubmitAction()));
      add(scrollPane);

   }

   private class SubmitAction extends AbstractAction {
      public SubmitAction() {
         super("Submit");
         putValue(MNEMONIC_KEY, KeyEvent.VK_S);
      }

      public void actionPerformed(java.awt.event.ActionEvent e) {
         // gather data from your fields
         String firstName = firstNameField.getText();
         String surName = surNameField.getText();
         String hNum = hNumField.getText();

         // create your SimpleObserver object here
         SimpleObserver simpleObserver = new SimpleObserver(firstName, surName, hNum);

         // add to JList's model
         simpleObsListModel.addElement(simpleObserver);
      };
   }
}

class SimpleObsListRenderer extends DefaultListCellRenderer {
   @Override
   public Component getListCellRendererComponent(JList<?> list, Object value,
         int index, boolean isSelected, boolean cellHasFocus) {
      if (value == null) {
         value = "";
      } else {
         SimpleObserver simpleObserver = (SimpleObserver)value;
         String surName = simpleObserver.getSurname();
         String firstName = simpleObserver.getFirstName();
         String display = String.format("%s, %s", surName, firstName);
         value = display;
      }
      return super.getListCellRendererComponent(list, value, index, isSelected,
            cellHasFocus);
   }
}

此代码中的键是AbstractAction类,SubmitAction。这充当了JButton对类固醇的ActionListener,因为它还设置了按钮的文本,actionCommand等。该类简单地收集GUI的JTextFields持有的字符串,创建一个SimpleObserver对象,然后将新创建的对象放入JList的模型中。

我已经为JList提供了一个单元格渲染器,但是如果你给SimpleObject一个toString()方法覆盖,可以用来将它渲染到列表中,则不需要这样做。

整个工作计划如下:

import java.awt.Component;
import java.awt.event.KeyEvent;
import javax.swing.*;

public class TestSimpleObserverGui {
   private static void createAndShowGui() {
      SimpleGui mainPanel = new SimpleGui();

      JFrame frame = new JFrame("Test Gui");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class SimpleGui extends JPanel {
   public static final int COLS = 8;
   private DefaultListModel<SimpleObserver> simpleObsListModel = new DefaultListModel<>();
   private JList<SimpleObserver> simpleObsList = new JList<>(simpleObsListModel);
   private JTextField firstNameField = new JTextField(COLS);
   private JTextField surNameField = new JTextField(COLS);
   private JTextField hNumField = new JTextField(COLS);

   public SimpleGui() {
      simpleObsList.setVisibleRowCount(8);
      simpleObsList.setCellRenderer(new SimpleObsListRenderer());
      simpleObsList.setPrototypeCellValue(new SimpleObserver("Big First Name", "Big Last Name", ""));

      // very simple GUI layout
      add(new JLabel("First Name:"));
      add(firstNameField);
      add(new JLabel("Last Name:"));
      add(surNameField);
      add(new JLabel("House Number:"));
      add(hNumField);

      JScrollPane scrollPane = new JScrollPane(simpleObsList);
      scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

      add(new JButton(new SubmitAction()));
      add(scrollPane);

   }

   private class SubmitAction extends AbstractAction {
      public SubmitAction() {
         super("Submit");
         putValue(MNEMONIC_KEY, KeyEvent.VK_S);
      }

      public void actionPerformed(java.awt.event.ActionEvent e) {
         // gather data from your fields
         String firstName = firstNameField.getText();
         String surName = surNameField.getText();
         String hNum = hNumField.getText();

         // create your SimpleObserver object here
         SimpleObserver simpleObserver = new SimpleObserver(firstName, surName, hNum);

         // add to JList's model
         simpleObsListModel.addElement(simpleObserver);
      };
   }
}

class SimpleObsListRenderer extends DefaultListCellRenderer {
   @Override
   public Component getListCellRendererComponent(JList<?> list, Object value,
         int index, boolean isSelected, boolean cellHasFocus) {
      if (value == null) {
         value = "";
      } else {
         SimpleObserver simpleObserver = (SimpleObserver)value;
         String surName = simpleObserver.getSurname();
         String firstName = simpleObserver.getFirstName();
         String display = String.format("%s, %s", surName, firstName);
         value = display;
      }
      return super.getListCellRendererComponent(list, value, index, isSelected,
            cellHasFocus);
   }
}


class SimpleObserver {
   private String firstName;
   private String surName;
   private String hNum;

   public SimpleObserver(String firstName, String surName, String hNum) {
      this.firstName = firstName;
      this.surName = surName;
      this.hNum = hNum;
   }

   public String getFirstName() {
      return firstName;
   }

   public String getSurname() {
      return surName;
   }

   public String gethNum() {
      return hNum;
   }

}

关于你的代码 - 你似乎大量使用静态字段,我建议不要这样做,以便你的程序符合OOP原则,再次降低复杂性,使调试和增强更容易。

请注意,我没有包含ArrayLists,因为我仍然不知道您对此的要求是什么。同样,如果这不能回答您的问题,请改善您的问题。以我们的观点为中心提出这样的问题:除非您告诉我们或向我们展示,否则他们完全不知道您的要求是什么,或者您正在尝试做什么,或者您的代码是什么样的。

相关问题