2012-10-03 25 views
1

你好这里是我的代码为我的表设置:适合的JTable填补的JPanel

String [] column = {"MacAddress","PcName","OperatingSystem","IpAddress","Port","Status"}; 
    model = new DefaultTableModel(0,column.length); 
    model.setColumnIdentifiers(column); 
    mainTable = new JTable(model); 
    mainTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
    for(int i=0;i<=column.length-1;i++){ 
    mainTable.getColumnModel().getColumn(i).setPreferredWidth(300); 
    } 
    pane = new JScrollPane(mainTable); 
    pnlTabel = new JPanel(); 
    pnlTabel.setBorder(BorderFactory.createTitledBorder("")); 
    pnlTabel.setPreferredSize(new Dimension(dim.width*70/100, dim.height*60/100)); 
    pnlTabel.add(pane); 
addMainPanel(pnlTabel); 

这里是我的addMainPanel()函数:

public void addMainPanel(Component pnl){ 
    mainPanel.add(pnl); 
    mainPanel.revalidate(); 
} 

这里是我为我的mainPanel代码:

mainPanel = new JPanel(); 
mainPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); 
add(mainPanel,"Center"); 

,我使用边界布局为我的框架:

setLayout(new BorderLayout(0,0)); 

我的问题是,即使我使用这组代码来设置我的JTable以适应,但它似乎无法全部此,代码:

mainTable.setAutoResizeMode(JTa![enter image description here][1]ble.AUTO_RESIZE_OFF); 
for(int i=0;i<=column.length-1;i++){ 
mainTable.getColumnModel().getColumn(i).setPreferredWidth(300); 
} 

如果是使用代码,我的JTable不会调整大小,只能添加底部的水平滚动条。

+0

使用setXXSize ;-)的危险不要:在那之后,一个组件将永远不会再尝试计算它的大小提示... [详细信息](http://stackoverflow.com/a/7229519/203657 ) – kleopatra

回答

3

如果您想要JTable填充可用空间,则应将其放入JPanel(其中包含BorderLayout布局管理器)。另外不要忘了保证,如果表不适合视图(如太多行),滚动条会出现JScrollPane

JFrame frame = new JFrame(); 
// set up frame 

JTable table = new JTable(); 
// Set up table, add data 

// Frame has a content pane with BorderLayout by default 
frame.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER); 

如果您有其他内容,您希望除了显示表中,您可以将这些添加到内容面板的NORTH,SOUTH,EAST,WEST部分(如果要放置更多组件,可以将其包含在其他面板中)。

+1

这是很好的宽度,但如果我想我的Jtable适合我的scrollpane的高度(当没有足够的行滚动条)?我怎么能做到这一点?谢谢 – caniaskyouaquestion

4

没有冒犯的意思,但..你的代码,因此你的问题是一团糟;-)另外,你不解释你到底想要达到什么。

试图解除缠结,以嵌套布局/伸缩特性(如见于片段,可能不完全):

frame // BorderLayout 
    mainPanel // FlowLayout 
     pnlTabel // FlowLayout, hard-coded prefSize 
      pane // scrollPane 
       mainTable // auto-resize-off 

旁白:故意保持untelling名字来证明混合命名方案如何往往贡献以总体困惑:-)无论你决定pre或postFixing一些类型相关的标记,但如果你确实是一致的,无关紧要。

在这一层次中,有FlowLayout中的两个级别,其基本上将在其各自的首选项布局自己的孩子,并相应地调整自己的PREF,以免把选项都在pnlTable水平硬编码:然而,表的pref将改变(通过更改列首选项)它不能泡进一步,因为...硬编码PREF导致计算它的大小(既不的layoutManager和也不uiDelegate,既没有机会做到这一点)

另一个问题 - 更有趣的一个:-) - 是JScrollPane的有点特别在

  • 从视图的PREF计算自己的prefSize/scrollablePrefViewportSize取决于是否认为实现滚动(JTable中这样做,但在一个糟糕的方式)
  • 是一个validationRoot:无效的视图(或任何孩子)不会在分级结构中进一步冒泡

假设你想,如果列的prefWidts更改表的滚动窗格增长,有两个一样的东西来调整:

  • 实现表的getPreferredScrollableWidth返回基于列的其中prefWidth计算出的值
  • 重新验证容器上涨的层次

一些代码一起玩:

final JTable table = new JTable(50, 10) { 
    // properties to base a reasonable prefScrollable size 
    int visibleColumns = 3; 
    int visibleRows = 10; 
    // hard-coded default in super 
    Dimension dummySuper = new Dimension(450, 400); 
    @Override 
    public Dimension getPreferredScrollableViewportSize() { 
     Dimension dim = super.getPreferredScrollableViewportSize(); 
     if (!dummySuper.equals(dim)) return dim; 
     dim = new Dimension(); 
     for (int column = 0; column < Math.min(visibleColumns, getColumnCount()); column++) { 
      dim.width += getColumnModel().getColumn(column).getPreferredWidth(); 
     } 
     dim.height = visibleRows * getRowHeight(); 
     return dim; 
    } 

}; 
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
for (int i = 0; i < table.getRowCount(); i++) { 
    table.setValueAt("row: " + i, i, 0); 
} 
JComponent tablePanel = new JPanel(); 
tablePanel.add(new JScrollPane(table)); 

Action sizeColumns = new AbstractAction("size columns") { 
    int prefWidth = 75; 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     int newWidth = prefWidth + 15; 
     for (int i = 0; i < table.getColumnCount(); i++) { 
      if (table.getColumnModel().getColumn(i).getPreferredWidth() == prefWidth) 
       table.getColumnModel().getColumn(i).setPreferredWidth(newWidth); 
     } 
     prefWidth = newWidth; 
     // revalidate "higher up" than the table itself 
     frame.revalidate(); 
    } 
}; 
frame.add(new JButton(sizeColumns), BorderLayout.SOUTH);