Метод setText в JTextField не обновляет экземпляры JTextField - PullRequest
0 голосов
/ 15 августа 2011

Ниже приведена часть кода многофайлового проекта. Я публикую только этот код, так как мне неясно, почему метод 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, отображаются сведения о ссуде. Я вижу, что valueChanged () вызывается как «inside valueChanged. SelectedListIndex» печатается, но loanIdFld.setText («1234») не обновляет текстовое поле LoadId с 1234. 1234 - это случайное число, которое я вставил, чтобы определить, может ли что-то быть отображается, но это также не отображается. Некоторые функции здесь не определены, но нет синтаксической ошибки.

1 Ответ

3 голосов
/ 15 августа 2011

Мое предположение: объект loanController, для которого были вызваны указанные выше методы, для которого вы устанавливаете текст его JTextFields, не является тем же объектом loanController, который визуализируется пользователем.

Но без дополнительной информации это всего лишь предположение.

Редактировать 1
Вот свидетельство того, что я могу быть прав:

listSelectionModel.addListSelectionListener(new loansController(model));

Вы создаете новый loanController объект в качестве слушателя вместо использования this :

listSelectionModel.addListSelectionListener(this);

Edit 2
Andтеперь с почти 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

Edit 3
A 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();
   }
}
...