【问题标题】:Java - updating textFields from JListJava - 从 JList 更新文本字段
【发布时间】:2009-11-26 15:36:59
【问题描述】:

我正在使用 Java 制作一个地址簿 GUI,并且我有一个 JList,它显示了我的 ArrayList 中的所有人员姓名(这是由下面提到的 updateinfo 方法填充的)。我想要它,所以当我单击JList 上的一个项目时,TextFields 会使用该人的详细信息进行更新。在我只使用按钮之前,因此actionListeners。我想我知道JList 必须使用ListSelectionListener,但我似乎无法实现这一点。我在下面添加了我的代码的 sn-p。有人可以帮忙吗?为了与我的actionlisteners 保持连续性,我希望将其作为内部类,但这并不重要

JList jl;
DefaultListModel list;

list = new DefaultListModel();
this.jl = new JList(this.list);
//add ListSelectionListener????
updateList();
this.add(this.jl, layout);

【问题讨论】:

    标签: java swing jlist


    【解决方案1】:

    您可以添加监听器,然后只查询当前选择的索引。

    我为你做了一个示例,希望对你有用。

    这是相关部分:

        private JComponent list() {
            final JList list =  new JList( data);
            list.addListSelectionListener(new ListSelectionListener() {
              public void valueChanged(ListSelectionEvent e) {
                int i = list.getSelectedIndex();
                nameTextField.setText( i >= 0 ? data.get( i ) : "" );
              }
            });
            return new JScrollPane( list );
        }
    

    请记住,这不是唯一的方法,这只是您的起点。

    这是完整的工作示例:

    import java.util.Vector;
    import java.util.Arrays;
    
    import java.awt.BorderLayout;
    
    import javax.swing.JList;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JLabel;
    import javax.swing.JComponent;
    
    import javax.swing.event.ListSelectionListener;
    import javax.swing.event.ListSelectionEvent;
    
    public class JListSample {
    
        private Vector<String> data = new Vector<String>( 
                Arrays.asList( new String []  {
                        "one", "two", "three"  
                })
        );
    
        private JTextField nameTextField;
    
        public static void main( String [] args) {
            JListSample s = new JListSample();
            s.run();
        }
        public  void run() {
            JFrame frame = new JFrame("Selection test");
            frame.add( list(), BorderLayout.WEST );
            frame.add( editPanel() );
            frame.pack();
            frame.setVisible( true );
    
        }
    
        private JComponent list() {
            final JList list =  new JList( data);
            list.addListSelectionListener(new ListSelectionListener() {
              public void valueChanged(ListSelectionEvent e) {
                int i = list.getSelectedIndex();
                nameTextField.setText( i >= 0 ? data.get( i ) : "" );
              }
            });
            return new JScrollPane( list );
        }
        private JComponent editPanel() {
            JPanel panel = new JPanel();
            panel.add(  new JLabel("Name:") );
            nameTextField = new JTextField(10);
            panel.add( nameTextField );
            return panel;
        }
    }
    

    这是显示的内容:

    sample http://img177.imageshack.us/img177/6294/capturadepantalla200911k.png

    【讨论】:

      【解决方案2】:

      您只需将选择侦听器添加到列表中,如下所示:

      jl.addSelectionListener(new ListSelectionListener() {
      
        public void valueChanged(ListSelectionEvent e) {
           // evaluate e if necessary and call a method
           // in your class to write the text in the textfield
           int selectedRow = e.getFirstIndex(); // more complicate for multiselects
           updateTextFieldWithName(selectedRow); // to be implemented
        }
      });
      

      使用像这里这样的匿名类是最快的方法。有点难读,但很典型。

      (刚刚读到您更喜欢内部类,但我无法在没有 IDE 的情况下在这里即时编写代码......)

      【讨论】:

        【解决方案3】:

        是的,您需要为此使用 ListSelectionListener,您可能还需要将列表设置为单选(ListSelectionModel.SINGLE_SELECTION)。这将允许用户仅选择列表中的一项。然后,您可以添加您的 listSelectionListener,并在事件的 valueChanged 中执行以下操作(不准确的语法)。

        valueChanged(ListSelectionEvent e){
           int idx = e.getFirstIndex();
           int idx2 = e.getLastIndex();  //idx and idx2 should be the same if you set SingleSel
           if(idx==idx2){
             //here you can get the person detail however you have them stored.  You can get   them from the model like so,
              Object personObj = MYLIST.getModel().getElementAt(int index); 
           }
        
        
         }
        

        【讨论】:

          【解决方案4】:

          我想我明白 JList 必须 使用 ListSelectionListener 但我不能 似乎实现了这个

          那么,从阅读 JList API 开始。您将找到关于“如何使用列表”的 Swing 教程的链接,其中包含一个工作示例。

          此外,在本教程中,您还将找到关于“如何编写列表选择侦听器”的部分,其中包含第二个示例。

          从基本问题的教程开始。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-01-12
            • 2012-10-07
            • 1970-01-01
            • 1970-01-01
            • 2014-12-03
            • 1970-01-01
            • 2016-01-16
            • 1970-01-01
            相关资源
            最近更新 更多