安装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 = 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不会调整大小,只会在底部添加一个水平滚动条。

无意冒犯,但。。你的代码和你的问题一团糟;-)另外,你没有解释你到底想要实现什么。

尝试取消角度,采用嵌套布局/调整大小的特征(如片段中所示,可能不完整):

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

旁白:故意不测试名称,以证明混合命名方案往往会导致整体混乱:-)无论你是决定前置还是后置修复一些类型相关的标记,都无关紧要,但你是否一致。

在该层次结构中,FlowLayout有两个级别,基本上会将其子级布局在各自的pref,并相应地调整自己的pref。以免pref在pnlTable的级别上被硬编码:然而,表的pref将被更改(通过更改列prefs),它不能进一步冒泡,因为。。。对pref进行硬编码会导致而不是计算其大小(layoutManager和uiDelegate都没有机会这样做)

另一个问题——更有趣的是:-)——是JScrollPane在中有些特殊

  • 根据视图是否实现Scrollable,从视图的pref/screllablePrefViewportSize计算自己的prefSize(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);

如果您想要一个JTable来填充可用空间,您应该将它放在具有BorderLayout布局管理器的JPanel中。另外,不要忘记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 );

如果除了表之外还有其他要显示的内容,可以将这些内容添加到内容面板的"北"、"南"、"东"one_answers"西"部分(如果要在其中放置更多零部件,则可以将这些部分包装到其他面板中)。

最新更新