2012-03-30 4 views
1

私のJListセルのwidth属性を無効、JListのJTextPaneのがカスタムで返されるセルレンダラーで、独自のセルレンダリングを持っていますサイズ。カスタムサイズの結果、このテキスト枠の行が折り返されます。JScrollPaneのは私だけ<strong>JListの</strong>で構成されてい<strong>JFrameの</strong>を持って

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は意味をなさない(および任意の効果を持っていない)サイズおよび構成要素の配置することのLayoutManagerの_exclusive_ジョブです。代わりに、レンダリングコンポーネントに適切なpreferredSize(リストのprefを決定する)を返します。 – kleopatra

答えて

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で返すセルの幅と同じ幅に設定しました。このためにゲッターメソッドを上書きする理由は何ですか? –

+0

setPreperredSize()は常に動作しているわけではなく、コンポーネントがサイズを覚えているかどうかによって異なります。 getPreferredSize()を上書きすると、サイズが渡されます。 – chenyi1976

関連する問題

 関連する問題