JTextField的setText方法不会更新JTextField实例

时间:2011-08-15 02:20:43

标签: swing jlist java

以下是多文件项目代码的一部分。我只发布此代码,因为我不清楚为什么setText方法不起作用。并非所有此项目的代码都包含在内。

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

        @SuppressWarnings("serial")

        public class Controller extends JFrame implements ActionListener,ListSelectionListener 
        {

            private JButton addButton;
            private JButton deleteButton;
            private JButton viewDetailsButton;
            private JPanel btnsPnl = new JPanel();
            private JPanel mainPnl = new JPanel();
            private JPanel dataPnl = new JPanel();
            private JPanel listPnl = new JPanel();
            private JLabel loanIdLabel = new JLabel("LoanId");
            private JLabel loanName = new JLabel("Loan Name");
            private JLabel loanLender = new JLabel("Lender");
            private JLabel loanAmount = new JLabel("Loan Amount");
            private JTextField loanIdFld = new JTextField(15);
            private JTextField loanNameFld = new JTextField(15);
            private JTextField lenderFld = new JTextField(15);
            private JTextField loanamountFld = new JTextField(15);
            private DefaultListModel dlm = new DefaultListModel();
            private JList jlst=new JList(dlm);

            private loansModel model;
            private loansView loansView;

            private int selectedListIndex;
            private ListSelectionModel listSelectionModel;


        public loansController(loansModel mo)
        {
           addButton = new JButton("Add Loan");
           deleteButton = new JButton("Delete Loan");
           viewDetailsButton = new JButton("View Details of all Loans");
           model = mo;
           loansView = new loansView(mo);   
        }

        /* Builds GUI for the controller component of the
         *  Model-View-Controller implementation
         */
        public void buildGUI()
        {
            GridBagLayout gbl = new GridBagLayout();
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx=0;
            gbc.gridy=0;
            dataPnl.setLayout(new GridLayout(4,2));
            dataPnl.add(loanIdLabel);
            dataPnl.add(loanIdFld);
            dataPnl.add(loanName);
            dataPnl.add(lenderFld);
            dataPnl.add(authorLabel);
            dataPnl.add(authorFld);
            dataPnl.add(priceLabel);
            dataPnl.add(loanamountFld); 
            gbl.setConstraints(dataPnl, gbc);
            mainPnl.add(dataPnl);    
            Dimension listDim = new Dimension(50,90);
            jlst.setPreferredSize(listDim);
            gbc.gridx = 0;
            gbc.gridy = 1;
            gbl.setConstraints(listPnl,gbc);
            listPnl.add(jlst);
            listSelectionModel= jlst.getSelectionModel();
            listSelectionModel.addListSelectionListener(new loansController(model));
            gbc.gridx=1;
            gbc.gridy=1;
            gbc.gridwidth=2;
            gbl.setConstraints(btnsPnl,gbc);    
            addButton.addActionListener(this);
            deleteButton.addActionListener(this);
            viewDetailsButton.addActionListener(this);
            btnsPnl.add(addButton);
            btnsPnl.add(deleteButton);
            btnsPnl.add(viewDetailsButton);
            mainPnl.add(listPnl);
            mainPnl.add(btnsPnl);
            getContentPane().add(mainPnl);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(800,400);
            setVisible(true);
        }

        /* Handles events coming from add,delete, and view Details 
         * buttons */
        public void actionPerformed(ActionEvent ae)
        {

            if (ae.getSource()==addButton)
            {
                String bId = loanIdFld.getText();
                String titFld = lenderFld.getText();
                String authFld = authorFld.getText();
                String priFld = loanamountFld.getText();
                boolean isAnumber;
                isAnumber = isNumeric(priFld);

                if (!isAnumber)
                {
                    JOptionPane.showMessageDialog(null, 
                        "Enter the correct loan amount",
                        "Error: Price entry",
                         JOptionPane.INFORMATION_MESSAGE);
                    priFld = loanamountFld.getText();
                    isAnumber = isNumeric(priFld);

                }

                else
                {           
                    Loan loanItem;
                    loanItem = new Loan(bId, titFld,
                    authFld,Double.parseDouble(priFld));
                    model.addLoan(loanItem);
                    dlm.addElement(bId);
                    setClearTextFld();
                }
            }

            else if (ae.getSource()== deleteButton)
            {
                model.deleteLoan(model.getSelectedListIndex());
                dlm.removeElementAt(model.getSelectedListIndex());
                setClearTextFld();
            } 

            else if (ae.getSource()==viewDetailsButton)
            {   
                loansView.buildGUI();

            }

        }




         /* This method clears the text field after the action Performed
          * method for the add and delete Buttons
          */
          public void setClearTextFld()
          {
               loanIdFld.setText("");
               lenderFld.setText("");
               authorFld.setText("");
               loanamountFld.setText("");
          }





          /* This value changed method gets the selected item in the JList
           * for performing the  
           */
          public void valueChanged(ListSelectionEvent e) 
          {

            listSelectionModel = (ListSelectionModel)e.getSource();

            int maxselectedListIndex = listSelectionModel.getMaxSelectionIndex();
            int minselectedListIndex = listSelectionModel.getMinSelectionIndex();

            System.out.println(selectedListIndex);  

            if (!listSelectionModel.isSelectionEmpty())
            {   
            for (int i = minselectedListIndex; i <= maxselectedListIndex; i++) {
                if (listSelectionModel.isSelectedIndex(i)) 
                {  
                   selectedListIndex=i;
                   System.out.println("inside valueChanged. selectedListIndex");
                   System.out.println(selectedListIndex);
                   model.setSelectedListIndex(i);
                   Loan selectedLoan = model.getLoan(i);
                   System.out.println(selectedLoan.getTitle().toString());
                   System.out.println(selectedLoan.getId());
                   System.out.println(selectedLoan.getAuthor());
                   System.out.println(selectedLoan.getTitle());
                   System.out.println((selectedLoan.getPrice()));   
        //             lenderFld.setText(selectedLoan.getTitle().toString());
          //           authorFld.setText(selectedLoan.getAuthor().toString());
            //     loanamountFld.setText(Double.toString(selectedLoan.getPrice()));


               loanIdFld.setText("1234");
               lenderFld.setText("Test LoaN NAME");
               authorFld.setText("Test lender");
               loanamountFld.setText("Test loan amount");


                }
            }
            }

          }

          }

我想要的是当有人点击GridBagLayout的loanid实例时,会显示有关贷款的详细信息。我可以看到valueChanged()被调用为“inside valueChanged.selectedListIndex”,但loanIdFld.setText(“1234”)不会用1234更新LoadId文本字段.1234是我插入的随机数,用于确定是否可以显示,但也没有显示。这里没有定义某些函数,但没有语法错误。

1 个答案:

答案 0 :(得分:3)

我的猜测:具有上述方法的loansController对象,您设置其JTextField的文本,与用户可视化的loanController对象不同。

但没有更多信息,这只是猜测。

编辑1
这证明我可能是对的:

listSelectionModel.addListSelectionListener(new loansController(model));

您正在创建 loanController对象作为侦听器,而不是使用 this

listSelectionModel.addListSelectionListener(this);

编辑2
现在使用下面几乎是SSCCE代码(太长时间不能成为真正的SSCCE,但足够短),我已经证明我的猜测实际上是正确的,你正在设置错误对象的文本,而不是可视化。如果您找到注释行,请注释掉一行并取消注释另一行以查看行为的更改:

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

@SuppressWarnings("serial")
public class loansController extends JFrame implements ActionListener,
         ListSelectionListener {
   private JButton addButton;
   private JButton deleteButton;
   private JButton viewDetailsButton;
   private JPanel btnsPnl = new JPanel();
   private JPanel mainPnl = new JPanel();
   private JPanel dataPnl = new JPanel();
   private JPanel listPnl = new JPanel();
   private JLabel loanIdLabel = new JLabel("LoanId");
   private JLabel loanName = new JLabel("Loan Name");
   private JTextField loanIdFld = new JTextField(15);
   private JTextField lenderFld = new JTextField(15);
   private JTextField loanamountFld = new JTextField(15);
   private DefaultListModel dlm = new DefaultListModel();
   private JList jlst = new JList(dlm);
   private int selectedListIndex;
   private ListSelectionModel listSelectionModel;

   public loansController() {
      addButton = new JButton("Add Loan");
      deleteButton = new JButton("Delete Loan");
      viewDetailsButton = new JButton("View Details of all Loans");
   }

   public void buildGUI() {
      String[] data = {"one", "two", "three", "four"};
      for (String datum : data) {
         dlm.addElement(datum);
      }
      GridBagLayout gbl = new GridBagLayout();
      GridBagConstraints gbc = new GridBagConstraints();
      gbc.gridx = 0;
      gbc.gridy = 0;
      dataPnl.setLayout(new GridLayout(4, 2));
      dataPnl.add(loanIdLabel);
      dataPnl.add(loanIdFld);
      dataPnl.add(loanName);
      dataPnl.add(lenderFld);
      dataPnl.add(loanamountFld);
      gbl.setConstraints(dataPnl, gbc);
      mainPnl.add(dataPnl);
      Dimension listDim = new Dimension(50, 90);
      jlst.setPreferredSize(listDim);
      gbc.gridx = 0;
      gbc.gridy = 1;
      gbl.setConstraints(listPnl, gbc);
      listPnl.add(jlst);
      listSelectionModel = jlst.getSelectionModel();


      // ****** here, comment one line and uncomment the other
      listSelectionModel.addListSelectionListener(new loansController());
      // !! listSelectionModel.addListSelectionListener(this);


      gbc.gridx = 1;
      gbc.gridy = 1;
      gbc.gridwidth = 2;
      gbl.setConstraints(btnsPnl, gbc);
      addButton.addActionListener(this);
      deleteButton.addActionListener(this);
      viewDetailsButton.addActionListener(this);
      btnsPnl.add(addButton);
      btnsPnl.add(deleteButton);
      btnsPnl.add(viewDetailsButton);
      mainPnl.add(listPnl);
      mainPnl.add(btnsPnl);
      getContentPane().add(mainPnl);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setSize(800, 400);
      setVisible(true);
   }

   public void actionPerformed(ActionEvent ae) {
      if (ae.getSource() == addButton) {
      } else if (ae.getSource() == deleteButton) {
      } else if (ae.getSource() == viewDetailsButton) {
      }
   }

   /*
    * This method clears the text field after the action Performed method for
    * the add and delete Buttons
    */
   public void setClearTextFld() {
      loanIdFld.setText("");
      lenderFld.setText("");
      loanamountFld.setText("");
   }

   public void valueChanged(ListSelectionEvent e) {
      listSelectionModel = (ListSelectionModel) e.getSource();
      int maxselectedListIndex = listSelectionModel.getMaxSelectionIndex();
      int minselectedListIndex = listSelectionModel.getMinSelectionIndex();
      System.out.println(selectedListIndex);
      if (!listSelectionModel.isSelectionEmpty()) {
         for (int i = minselectedListIndex; i <= maxselectedListIndex; i++) {
            if (listSelectionModel.isSelectedIndex(i)) {
               selectedListIndex = i;
               System.out.println("inside valueChanged. selectedListIndex");
               System.out.println(selectedListIndex);
               loanIdFld.setText("1234");
               lenderFld.setText("Test LoaN NAME");
               loanamountFld.setText("Test loan amount");
            }
         }
      }
   }

   public static void main(String[] args) {
      loansController controller = new loansController();
      controller.buildGUI();
   }
}

请注意,这就是您应该做的事情:简化代码直到您将问题隔离开来,因为它允许您更轻松地解决问题,并且失败了,那么如果您发布这个可编译的可运行代码,它会让 us 可帮助您更轻松地解决问题。此过程称为创建SSCCE或Short, Self Contained, Correct (Compilable), Example

编辑3
更好的SSCCE:

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

@SuppressWarnings("serial")
public class loansController extends JFrame implements ListSelectionListener {
   private JPanel mainPnl = new JPanel();
   private JPanel dataPnl = new JPanel();
   private JPanel listPnl = new JPanel();
   private JTextField loanIdFld = new JTextField(15);
   private JTextField lenderFld = new JTextField(15);
   private JTextField loanamountFld = new JTextField(15);
   private DefaultListModel dlm = new DefaultListModel();
   private JList jlst = new JList(dlm);
   private ListSelectionModel listSelectionModel;

   public void buildGUI() {
      String[] data = {"one", "two", "three", "four"};
      for (String datum : data) {
         dlm.addElement(datum);
      }
      dataPnl.setLayout(new GridLayout(4, 2));
      dataPnl.add(loanIdFld);
      dataPnl.add(lenderFld);
      dataPnl.add(loanamountFld);
      mainPnl.add(dataPnl);
      Dimension listDim = new Dimension(50, 90);
      jlst.setPreferredSize(listDim);
      listPnl.add(new JScrollPane(jlst));
      listSelectionModel = jlst.getSelectionModel();

      // ****** here, comment one line and uncomment the other
      // !! listSelectionModel.addListSelectionListener(new loansController());
      listSelectionModel.addListSelectionListener(this);

      mainPnl.add(listPnl);
      getContentPane().add(mainPnl);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      pack();
      setLocationRelativeTo(null);
      setVisible(true);
   }

   public void valueChanged(ListSelectionEvent e) {
      System.out.println("inside valueChanged. ");
      loanIdFld.setText("1234");
      lenderFld.setText("Test LoaN NAME");
      loanamountFld.setText("Test loan amount");
   }

   public static void main(String[] args) {
      new loansController().buildGUI();
   }
}