2014-11-24 105 views
0

这里是代码,任何人都可以运行方便,快捷,那就说明我的问题:一个JList的触发数据添加到另一个JList中

import java.awt.Color; 
import java.awt.Component; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.DefaultListCellRenderer; 
import javax.swing.DefaultListModel; 
import javax.swing.DefaultListSelectionModel; 
import javax.swing.JScrollPane; 
import javax.swing.JList; 
import javax.swing.JButton; 
import javax.swing.ListSelectionModel; 

import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.util.ArrayList; 

public class Driver extends JFrame { 

    public ArrayList<String> RN = new ArrayList<String>(); 

    private JPanel contentPane; 


    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 

        Driver frame = new Driver(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public Driver() { 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 605, 497); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 
     contentPane.setLayout(null); 

     DefaultListSelectionModel m = new DefaultListSelectionModel(); 
     m.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     m.setLeadAnchorNotificationEnabled(false); 

     JScrollPane scrollPane = new JScrollPane(); 
     scrollPane.setBounds(26, 133, 538, 133); 
     contentPane.add(scrollPane); 
     scrollPane.setViewportView(listRN); 
     listRN.setSelectionModel(m); 
    // listRN.setCellRenderer(new MyListCellRenderer()); 
     listRN.addMouseListener(mouseListener); 
     JScrollPane scrollPane_1 = new JScrollPane(); 
     scrollPane_1.setBounds(26, 296, 538, 133); 
     contentPane.add(scrollPane_1); 



     scrollPane_1.setViewportView(listPL); 
     listPL.setSelectionModel(m); 
    // listPL.setCellRenderer(new MyListCellRenderer()); 
     JButton btnNewButton = new JButton("Load"); 
     btnNewButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       RN.add("Ivan"); 
       RN.add("Gaga"); 
       RN.add("Dragan"); 
       for(int i=0;i<RN.size();i++){ 
        modelRN.addElement(RN.get(i)); 
       } 

      } 
     }); 
     btnNewButton.setBounds(386, 58, 89, 23); 
     contentPane.add(btnNewButton); 
    } 

    MouseListener mouseListener = new MouseAdapter() { 
     public void mouseClicked(MouseEvent e) { 
     String d = null; 

      if (e.getClickCount() == 1) { 

       int index = listRN.locationToIndex(e.getPoint()); 
       System.out.println("clicked on Item " + index); 

        d = listRN.getSelectedValue(); 

       modelPL.addElement(d); 
       } 

       } 


    }; 


    DefaultListModel<String> modelRN = new DefaultListModel<String>(); 

    DefaultListModel<String> modelPL = new DefaultListModel<String>(); 

    JList<String> listRN = new JList<String>(modelRN); 

    JList<String> listPL = new JList<String>(modelPL); 

} 

它是一个简单的例子。点击Load按钮,字符串被添加到第一个JList。点击那个JList中的一个字符串,它被加载到第二个JList,所以没什么大不了的。我的问题是随后JLists的行为...当我点击Jlist中的选择时,它将字符串加载到第二个Jlist,但突出显示的选择跳转到另一个String ...加上当我点击一个字符串时在第二个Jlist中,它连接到第一个。

理解JList行为的根本缺陷是什么?

回答

2

listPL和listRN不应该具有相同的ListSelectionModel,当您在第一个列表中选择一个项目并将其添加到第二个列表中时,其中的选定项目会发生更改,因此第一个列表中的所选项目也会更改,因为它们有相同的ListSelectionModel。

+0

谢谢。愚蠢的疏忽对我而言。一切都OK了:) – caniaskyouaquestion 2014-11-24 11:09:53

+0

@caniaskyoua问题我很高兴它为你工作。 – 2014-11-24 11:10:34