2013-01-31 36 views
3

我想創建一個有兩個窗格的用戶界面。創建一個條目列表,並使每個條目可點擊

在左側窗格中,我顯示文件列表,右側窗格顯示內容。

現在,我想在左窗格中的文件列表看起來像一個正常的列表。但是,當我單擊此列表中的一個條目時,該特定文件的內容應顯示在右側窗格中。

如何使用Swing實現這一目標?

+0

該文件是由程序的其他部分產生。所以,我確信這些文件是可讀的ASCII文件。 – Hashken

回答

2

首先,你還沒有試過,對不對? Swing幾乎可以處理與聽衆相關的所有輸入內容。退房的鼠標偵聽器,或調整awnser得到下述

https://stackoverflow.com/a/4344762/258418

對於completness我引用在這裏:

String[] items = {"A", "B", "C", "D"}; 
JList list = new JList(items); 

list.addMouseListener(new MouseAdapter() { 
    public void mouseClicked(MouseEvent evt) { 
     JList list = (JList)evt.getSource(); 
     if (evt.getClickCount() == 2) { 
      int index = list.locationToIndex(evt.getPoint()); 
     } else if (evt.getClickCount() == 3) { // Triple-click 
      int index = list.locationToIndex(evt.getPoint()); 

     } 
    } 
}); 

我相信你可以把它採取單一的點擊以及.. 。如果不寫評論

+2

'JList' API爲多次點擊提供了一個'MouseListener' /'MouseAdapter',但是ListSelectionListener對單擊不會更好嗎? – trashgod

+0

我想你是對的...(除非我構建了一個荒謬的地方,在需要雙擊來改變選擇,並單擊顯示信息) – ted

+0

ListSelectionListener也可以看到鍵盤導航,並且可以有多個偵聽器。 – trashgod

3

參考一些例子:

  • FileBrowser在左側使用JTree,在右側使用嵌套的細節面板。

  • ImageDisplay在左側嵌入自定義JFileChooser,並在右側顯示可滾動的圖像。

  • CheckTable在左側顯示JTable,在右側顯示。

5

這裏我做了一個簡短的例子,在JList的幫助下左邊JTextArea在右邊。我已使用ListSelectionListener獲取項目列表更改。根據您的方便,使用LayoutManager

enter image description here

import javax.swing.*; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 

public class JListTest { 

    private JList jList1; 
    private JPanel jPanel1; 
    private JTextArea jTextArea1; 

    public JListTest() { 
     initComponents(); 
    } 

    private void initComponents() { 
     JFrame f = new JFrame(); 
     jPanel1 = new JPanel(); 
     jList1 = new JList(); 
     jTextArea1 = new JTextArea(); 

     jList1.setModel(new AbstractListModel() { 

      String[] strings = {"Item 1", "Item 2"}; 

      @Override 
      public int getSize() { 
       return strings.length; 
      } 

      @Override 
      public Object getElementAt(int i) { 
       return strings[i]; 
      } 
     }); 
     jList1.addListSelectionListener(new ListSelectionListener() { 

      @Override 
      public void valueChanged(ListSelectionEvent evt) { 
       jList1ValueChanged(evt); 
      } 
     }); 

     jTextArea1.setColumns(20); 
     jTextArea1.setRows(5); 

     jPanel1.add(jList1); 
     jPanel1.add(jTextArea1); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     f.add(jPanel1); 
     f.pack(); 
     f.setVisible(true); 
    } 

    private void jList1ValueChanged(javax.swing.event.ListSelectionEvent evt) { 
     //set text on right here 
     String s = (String) jList1.getSelectedValue(); 
     if (s.equals("Item 1")) { 
      jTextArea1.setText("You clicked on list 1"); 
     } 
     if (s.equals("Item 2")) { 
      jTextArea1.setText("You clicked on list 2"); 
     } 
    } 

    public static void main(String args[]) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new JListTest(); 
      } 
     }); 
    } 
} 
+0

+1 [sscce](http://sscce.org/)。注意'pack()'_before_'setVisible()'並且更加節省使用空白。另外考慮'EXIT_ON_CLOSE'。 – trashgod

+0

@trashgod感謝您的編輯。 ''JList.addListSelectionListener'一旦你點擊就被調用2次,但是,你不能僅僅通過查看接口來搞清楚,因爲我只是在'JTextArea'上設置文本,任何原因?''EXIT_ON_CLOSE'編輯:) –

+1

打印'evt.getValueIsAdjusting()',並在點擊並拖動列表時進行觀察。 – trashgod