2014-01-17 96 views
0

我正在製作一個打印JList上的項目的程序,並試圖儘可能少地使用內存。因此,我只想使用一個JList變量,但屏幕上仍然有兩個列表可以讀取。我遇到了一些問題,如何在第一個列表中查找值,並將其初始化並添加到JPanel中。一個JPanel上的多個JLists

JPanel的初始化方法:

public void run() { 
    panel = new JPanel(null); 
    //Initalize components 

    //List 1 
    ArrayList<String> st = new ArrayList<String>(); 
    for(int i=0;i<10;i++) st.add("Number: " + i); 
    jli = new JList(st.toArray()); 
    jli.setName("MyList1"); 
    jli.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    jli.setLayoutOrientation(JList.VERTICAL); 
    jli.setSelectedIndex(-1); 
    jli.setVisibleRowCount(-1); 
    JScrollPane jsp = new JScrollPane(jli); 
    jsp.setSize(new Dimension(120, 130)); 
    jsp.setLocation(5, 5); 
    panel.add(jsp); 

    //List 2 
    st = new ArrayList<String>(); 
    for(int i=0;i<10;i++) st.add("#: " + i); 
    jli = new JList(st.toArray()); 
    jli.setName("MyList2"); 
    jli.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    jli.setLayoutOrientation(JList.VERTICAL); 
    jli.setSelectedIndex(-1); 
    jli.setVisibleRowCount(-1); 
    jsp = new JScrollPane(jli); 
    jsp.setSize(new Dimension(120, 130)); 
    jsp.setLocation(150, 5); 
    panel.add(jsp); 

    //Button 1 
    jb = new JButton("Print 1"); 
    jb.addActionListener(this); 
    jb.setLocation(5, 140); 
    jb.setSize(jb.getPreferredSize()); 
    panel.add(jb); 

    //Button 2 
    jb = new JButton("Print 2"); 
    jb.addActionListener(this); 
    jb.setLocation(120, 140); 
    jb.setSize(jb.getPreferredSize()); 
    panel.add(jb); 
} 

ActionPreformed方法:

public void actionPerformed(ActionEvent e) { 
    switch (e.getActionCommand()) { 
     case "Print 1": 
      //This is where I need help 
      break; 
     case "Print 2": 
      System.out.println(jli.getSelectedValue()); 
      break; 
    } 
} 

總之,我如何找到第一個JList的數據創建和第二的JList沒有做兩個JList的變量產生的?

+0

使用單一當您有兩個JList實例時,「變量」不會爲您節省任何內存。您可能有10個變量指向這兩個列表,並且內存的增加將不重要... – MadProgrammer

+0

是否有額外的JList內存的微量真的有害?爲什麼這是一個要求? – csmckelvey

+0

@MadProgrammer問題offtopic是你在早上5點醒來的什麼,涉及到使用匿名類的問題,那麼你不必做'switch' – nachokk

回答

0

儘管我覺得它很奇怪,但是如果你堅持只有一個類型的變量,那麼你將不能直接訪問第一個實例化列表。假設你的paneljli是全局定義,您可以通過搜索panel的子組件找到列表:

@Override 
    public void actionPerformed(ActionEvent e) { 
     Component[] components = panel.getComponents(); 
     for (Component component : components) { 
      // child component must be a JList, but not jli 
      if(component instanceof JList && !component.equals(jli)) { 
       JList firstList = (JList) component; 
      } 
     } 
    } 

我還是想重複,這個代碼是可以通過引入簡單地消除了完整的開銷另一個JList變量。而不是直接訪問列表,你將不得不搜索它,消耗CPU時間。另外,如果你有第三個JList,你會怎麼做?然後你不能將兩個不可接近的JList彼此區分開來。如果你仍然堅持有一個變量,可以考慮使用JListList S:

List<JList> allMyJLists = new LinkedList<>(); 
JList jli = new JList(); // first JList 
allMyJLists.add(jli); 
jli = new JList(); // second JList 
allMyJLists.add(jli); 

現在訪問第一JList

allMyJLists.get(0); 

,第二個與

allMyJLists.get(1); 
+0

非常感謝您的幫助,我喜歡將「List of List 「 – Elipzer