2012-03-30 37 views
1

我有一個的JFrame其中只包含一個的JList,則的JList都有自己的單元格渲染器,單元渲染器的JTextPane與自定義恢復尺寸。自定義大小會導致此文本窗格的行被包裝。JScrollPane中勾銷我JList中單元格的寬度屬性

textPane.setSize(WIDTH, HEIGHT); 

現在我想使此JList滾動的,因此我把它包裝成JScrollPane組件,這然而,勾銷我在單元格渲染器所限定的寬度的限制。在JScrollPane中執行寬度約束的最佳方式是什麼?

setSize(FRAME_WIDTH, FRAME_HEIGHT); 
setLayout(new BorderLayout()); 

DefaultListModel<Status> listModel = new DefaultListModel<Status>(); 
JList<Status> list = new JList<>(listModel); 
list.setLayout(new BorderLayout()); 
list.setSize(FRAME_WIDTH, FRAME_HEIGHT); 
list.setCellRenderer(new MyCellRenderer()); 
// wrap the list with a JScrollPane 
add(new JScrollPane(list), BorderLayout.CENTER); 
+1

的setSize沒有任何意義(並且沒有任何效果)施膠和組件的定位是佈局管理的_exclusive_工作。相反,讓你的渲染組件返回一個合理的preferredSize(它決定了列表的pref) – kleopatra 2012-03-30 10:06:15

回答

0

渲染的Cell操作由javax.swing.plaf.basic.BasicListUI類來完成,它會畫畫整個案件,不管你的單元格渲染器設置什麼尺寸。您可以深入瞭解BasicListUI類的源代碼,以瞭解其工作原理。

我想你只是爲了確保單元格的內容可以全部顯示。在這種情況下,您可以爲列表添加一個水平滾動條。爲此,請獲取列表的首選寬度。

象下面這樣:

public static void main(String[] args) 
{ 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    frame.setLocationRelativeTo(null); 
    frame.setSize(800, 600); 

    JList list = new JList(new Object[]{ "11", "22" }) 
    { 
     @Override 
     public Dimension getPreferredSize() 
     { 
      return new Dimension(1000, 800); 
     } 
    }; 
    frame.getContentPane().add(new JScrollPane(list), BorderLayout.CENTER); 

    frame.setVisible(true); 
} 
+0

我將JList的preferredSize設置爲與我使用ListCellRenderer返回的單元格的寬度相同的寬度,並且它完成了我所需要的操作。爲什麼你爲此覆蓋了getter方法? – 2012-03-30 09:25:53

+0

setPreperredSize()並不總是有效,它取決於組件是否記住了大小。覆蓋getPreferredSize()將確保大小被傳入。 – chenyi1976 2012-04-02 13:21:09