2011-10-24 5 views
4

jscrollpane 내에 jtable이 있습니다. jgoodies Form Layout을 사용하고 스크롤바를 "pref"로 설정된 행에 넣습니다. 이 테이블이 지금과 같은 모습입니다 : 나는이 방법으로 swingx JXTable를 사용하고, 2에 visibleRowCount의를 설정하지만 절반 만 행이 표시됩니다JScrollpane의 JTable은 표시된 구성 요소의 높이를 조정합니다.

enter image description here

.

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에서 당신은 전혀 없습니다. _ 렌더러를 구현하십시오 (대신 자동 형광펜/문자열 표현의 모든 멋진 점을 잃어 버릴 것입니다 ..). 대신 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

그 점에 대해 감사드립니다. 더 쉽게, 테이블의 데이터는 패널이 생성되고 변경되지 않을 때로드됩니다. 그래서 나는 청취자가 필요하지 않습니다. 그러나 scrollpane으로 JXTable을 래핑했다면 visibleRowCount() 설정과 함께 scrollpane의 크기를 올바르게 설정해야합니다. scrollpane의 크기를 어떻게 설정합니까? 행 수를 설정하는 논리는 간단합니다. 행 계수가 3보다 작은 경우, 행 카운트에 setVisibleRowCount를 설정합니다. 그렇지 않으면 setVisibleRowCount를 3으로 유지하고 나머지 행을 스크롤하십시오. – sethu

+0

죄송합니다. 제가 사용하고있는 jgoodies 양식 레이아웃에서 행의 크기를 설정하는 대신 스크롤 판의 크기를 설정하지 마십시오. 이 scrollpane + jxtable이있는 행의 행 크기를 설정해야합니다. 그래도 테이블을 표시하기 전에 어떻게 계산합니까? – sethu

+0

고정 크기를 설정하지 마십시오. 절대로 레이아웃에서 처리하도록하십시오. – kleopatra

1

저는 이것을 달성하기 위해 JSCrollPane의 preferredSize, minSize 및 maxSize 속성을 사용할 수 있다고 생각합니다. preferredSize를 원하는 최소 크기로 설정하고 최대 크기를 원하는 최대 크기로 설정하면 작동합니다.

+0

을 판매하는 공급자, setXXSize를 절대 사용하지 않는 이유, f.i를 참조하십시오. http://stackoverflow.com/questions/7229226/avoid-the-use-of-setpreferredmaximumminimumsize-methods-in-java-swing – kleopatra

2
setPreferredScrollableViewportSize(Dimension) 

입니다. How to Use Scroll Panes JXTable와

+0

아니요, setXXSize보다 좋지 않습니다. 특히 논리 크기 구성을 지원하는 구성 요소는 없습니다 (예 : JXTable, fi) – kleopatra

관련 문제