1

嗨,这是我的表格设置代码:

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

4

2 回答 2

5

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

尝试解开,采用嵌套布局/调整大小特征(如片段所示,可能不完整):

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

旁白:故意不告诉名称以证明混合命名方案往往会导致整体混乱:-) 无论您决定使用 preFixing 还是 postFixing 一些与类型相关的标记,但如果您确实保持一致,这并不重要。

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

另一个问题 - 更有趣的一个 :-) - JScrollPane 在

  • 根据视图是否实现 Scrollable,从其视图的 pref/scrollablePrefViewportSize 计算自己的 prefSize(JTable 这样做,虽然方式很糟糕)
  • 作为一个validationRoot:使视图(或任何子级)无效不会在层次结构中进一步冒泡

假设如果列的 prefWidts 发生变化,您希望表的 scrollPane 增长,则需要调整两件事:

  • 实现表的 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);
于 2012-10-03T11:59:39.073 回答
4

如果要 aJTable填充可用空间,则应将其放在JPanel具有BorderLayout布局管理器的 a 中。也不要忘记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 部分(如果要放置更多组件,可以将其包装到其他面板中)。

于 2012-10-03T13:59:38.313 回答