2011-10-24 19 views
4

jscrollpane内にjtableがあります。私はjgoodiesフォームレイアウトを使い、 "pref"に設定された行にスクロールペインを配置しました。これは、テーブルが今どのように見えるかです:JScrollpaneのJTableは表示されたコンポーネントの高さを調整します

enter image description here

私は道でswingx JXTableを使用していますし、2にvisibleRowCountのを設定している。しかし半分だけ行が表示されます。

SSCCEを作成しているうちに、カスタムTextAreaRendererがあるため、正しく動作していないことがわかりました。私はこのレンダラーのために、行の高さが正しく計算されていないと思います。私はあなたたちは素晴らしいことだ、それを見つけることができれば...その間に、なぜ

public static void main(String[] args) { 
    JFrame frame=new JFrame(); 
    JPanel panel=new FormDebugPanel(); 
    frame.setContentPane(panel); 
    FormLayout layout=new FormLayout("1dlu:grow,200dlu:grow,1dlu:grow", 
      "10dlu,pref,5dlu,pref,10dlu"); 
    panel.setLayout(layout); 
    String[] columns= {"1st Column","2nd Column","3rd Column"}; 
    String[][] data= { 
      {"Sethu","Data","Something\nis\nhere"}, 
      {"Sethu","Data","Something\nis\nhere"}, 

    }; 
    JXTable table=new JXTable(data,columns); 
    table.setVisibleRowCount(2); 

    TableColumnModel columnModel=table.getColumnModel(); 
    columnModel.getColumn(2).setCellRenderer(new TextAreaRenderer()); 

    JScrollPane scrlPan=new JScrollPane(table); 
    CellConstraints cc=new CellConstraints(); 
    panel.add(scrlPan, cc.xy(2, 2)); 
    panel.add(new JLabel("Label After Table"),cc.xy(2,4)); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setVisible(true); 
    } 
} 

を把握しようと、ここで、レンダリングの午前:私はTextAreaRendererを使用する場合は、その後、

class TextAreaRenderer extends JTextArea implements TableCellRenderer { 

private final DefaultTableCellRenderer adaptee = new DefaultTableCellRenderer(); 

/** map from table to map of rows to map of column heights */ 
private final Map<JTable,Map<Integer,Map<Integer,Integer>>> cellSizes = new HashMap<JTable,Map<Integer,Map<Integer,Integer>>>(); 

public TextAreaRenderer() { 
    setLineWrap(true); 
    setWrapStyleWord(true); 
} 

public Component getTableCellRendererComponent(// 
     JTable table, Object obj, boolean isSelected, boolean hasFocus, int row, int column) { 
    // set the colours, etc. using the standard for that platform 
    adaptee.getTableCellRendererComponent(table, obj, isSelected, hasFocus, row, column); 
    setForeground(adaptee.getForeground()); 
    setBackground(adaptee.getBackground()); 
    setBorder(adaptee.getBorder()); 
    setFont(adaptee.getFont()); 
    setText(adaptee.getText()); 

    // This line was very important to get it working with JDK1.4 
    TableColumnModel columnModel = table.getColumnModel(); 
    setSize(columnModel.getColumn(column).getWidth(), 100000); 
    int height_wanted = (int) getPreferredSize().getHeight(); 
    addSize(table, row, column, height_wanted); 
    height_wanted = findTotalMaximumRowSize(table, row); 
    if (height_wanted != table.getRowHeight(row)) { 
     table.setRowHeight(row, height_wanted); 
    } 
    return this; 
} 

private void addSize(JTable table, int row, int column, int height) { 
    Map<Integer,Map<Integer,Integer>> rows = cellSizes.get(table); 
    if (rows == null) { 
     cellSizes.put(table, rows = new HashMap<Integer,Map<Integer,Integer>>()); 
    } 
    Map<Integer,Integer> rowheights = rows.get(new Integer(row)); 
    if (rowheights == null) { 
     rows.put(new Integer(row), rowheights = new HashMap<Integer,Integer>()); 
    } 
    rowheights.put(new Integer(column), new Integer(height)); 
} 

/** 
* Look through all columns and get the renderer. If it is also a 
* TextAreaRenderer, we look at the maximum height in its hash table for 
* this row. 
*/ 
private int findTotalMaximumRowSize(JTable table, int row) { 
    int maximum_height = 0; 
    Enumeration<TableColumn> columns = table.getColumnModel().getColumns(); 
    while (columns.hasMoreElements()) { 
     TableColumn tc = (TableColumn) columns.nextElement(); 
     TableCellRenderer cellRenderer = tc.getCellRenderer(); 
     if (cellRenderer instanceof TextAreaRenderer) { 
      TextAreaRenderer tar = (TextAreaRenderer) cellRenderer; 
      maximum_height = Math.max(maximum_height, tar.findMaximumRowSize(table, row)); 
     } 
    } 
    return maximum_height; 
} 

private int findMaximumRowSize(JTable table, int row) { 
    Map<Integer,Map<Integer,Integer>> rows = cellSizes.get(table); 
    if (rows == null) 
     return 0; 
    Map<Integer,Integer> rowheights = rows.get(new Integer(row)); 
    if (rowheights == null) 
     return 0; 
    int maximum_height = 0; 
    for (Iterator<Map.Entry<Integer, Integer>> it = rowheights.entrySet().iterator(); it.hasNext();) { 
     Map.Entry<Integer,Integer> entry = it.next(); 
     int cellHeight = ((Integer) entry.getValue()).intValue(); 
     maximum_height = Math.max(maximum_height, cellHeight); 
    } 
    return maximum_height; 
} 
} 

setVisibleRowHeight()は正しく受け付けられません。レンダラーで行の高さを適切に設定しないこととは関係があると思います。

+2

時に県高さを更新 - あなたのコメントを見て、私は、私はあなたが – kleopatra

+0

はレンダラを見ていなかった:-)後何であるかを理解し、非常にわからないんだけど、だからこれはそれに関連していない:SwingX you _never _レンダラーを実装する(代わりに、自動ハイライト/文字列表現のすべての細かい点を緩和する)、代わりにComponentProviderを実装する。テストパッケージには、JTextArea – kleopatra

答えて

4

、あなたが最初に表示するためにどのように多くの行(または列)を設定することができます

table.setVisibleRowCount(2) 

ここ用語で初期サイズを設定する方法を-示す迅速なスニペットがあります動的に行とsscceためTableModelListener

final JXTable table = new JXTable(3, 5); 
    table.setVisibleRowCount(table.getRowCount()); 
    TableModelListener l = new TableModelListener() { 

     @Override 
     public void tableChanged(TableModelEvent e) { 
      if (!(e.getType() == TableModelEvent.INSERT)) return; 
      table.setVisibleRowCount(((TableModel) e.getSource()).getRowCount()); 
      RootPaneContainer frame = (RootPaneContainer) SwingUtilities.windowForComponent(table); 
      ((JComponent) frame.getContentPane()).revalidate(); 
     } 
    }; 
    table.getModel().addTableModelListener(l); 
    Action insert = new AbstractAction("add row") { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      ((DefaultTableModel) table.getModel()).addRow(new Object[] {}); 
     } 
    }; 
    new Timer(500, insert).start(); 
    JComponent comp = new JPanel(new MigLayout()); 
    comp.add(new JScrollPane(table)); 
    JXFrame frame = wrapInFrame(comp, "visibleRowCount"); 
    show(frame, frame.getPreferredSize().width, frame.getPreferredSize().height * 4); 
+0

ありがとうございました..私にとっては、パネルが構築されても変更されないときは、テーブルのデータが読み込まれやすくなります。だから、私はリスナーは必要ありません。しかし、スクロールペインでJXTableをラップした場合、visibleRowCount()を設定するとともに、スクロールペインのサイズを正しく設定する必要があります。スクロールペインのサイズをどのように設定すればよいですか?行数を設定するロジックは簡単です。行数が3未満の場合は、行数にsetVisibleRowCountを設定します。それ以外の場合は、setVisibleRowCountを3に保ち、残りの行をスクロールします。 – sethu

+0

残念ですが、私はスクロールペインのサイズを設定しません。代わりに、使用しているjgoodiesフォームレイアウトの行のサイズを設定します。このscrollpane + jxtableを格納している行の行サイズを設定する必要があります。しかし、テーブルが表示される前にそれをどのように計算するのですか? – sethu

+0

固定サイズを設定しないでください。 – kleopatra

1

これを実現するには、JSCrollPaneのpreferredSize、minSize、およびmaxSizeプロパティを使用できます。 preferredSizeを必要最小限のサイズに、maxsizeを必要な最大サイズに設定すると、それはうまくいくはずです。

+0

を販売していないプロバイダ、setXXSizeを決して使用しないなどの理由で、f.iを参照してください。 http://stackoverflow.com/questions/7229226/avoid-the-use-of-setpreferredmaximumminimumizeize-methods-in-java-swing – kleopatra

2
setPreferredScrollableViewportSize(Dimension) 

です。そしてここで良いチュートリアルです:JXTableでHow to Use Scroll Panes

+0

いいえ、setXXSizeよりはるかに優れていません。特に論理サイズの設定をサポートするコンポーネントはありません。 JXTable、fi) – kleopatra