【问题标题】:Java Swing: Relative Positioning and Automatic Resizing?Java Swing:相对定位和自动调整大小?
【发布时间】:2010-10-05 19:49:45
【问题描述】:

我有一个 createUI() 函数,它将 JPanel 加载到 NORTH、SOUTH、EAST 中。

private void createUI() {
    add(createToolBar(), BorderLayout.NORTH);
    add(createDataView(), BorderLayout.SOUTH);
    add(createHistoryView(), BorderLayout.EAST);

    createMenuBar();

    setTitle("My Application");

}

每个组件都显示在正确的位置,但是,它们都在固定大小的 JPanel 中。我想知道 JPanel 是否有可能完全填满 BorderLayout 区域。

例如,createDataView() 是一个带有表格的简单 Jpanel。我希望它水平扩展,并有一个固定的高度。

private JPanel createDataView(){
        JPanel panel = new JPanel();

        String data[][] = {{"001","vinod","Bihar","India","Biology","65","First"},
                           {"002","Raju","ABC","Kanada","Geography","58","second"},
                           {"003","Aman","Delhi","India","computer","98","Dictontion"},
                           {"004","Ranjan","Bangloor","India","chemestry","90","Dictontion"},
                           {"004","Ranjan","Bangloor","India","chemestry","90","Dictontion"}};
        String col[] = {"Roll","Name","State","country","Math","Marks","Grade"};
        JTable table = new JTable(data,col);
        table.setPreferredScrollableViewportSize(new Dimension(900,100));
        JTableHeader header = table.getTableHeader();
        header.setBackground(Color.yellow);
        JScrollPane pane = new JScrollPane(table);
        table.setAutoResizeMode(JTable.WIDTH);
        table.doLayout();
        panel.add(pane);
        return panel;
}                      

现在我依靠手动设置尺寸。不过,我会想办法获取当前窗口的宽度,并将其设置如下。

table.setPreferredScrollableViewportSize(new Dimension(900,100));

【问题讨论】:

  • 你在南“细胞”里塞了两件东西……它们之间的关系应该如何?

标签: java swing


【解决方案1】:

JPanel的默认布局是FlowLayoutGridLayout 可能是您的数据视图的替代方案。您可以在A Visual Guide to Layout Managers 中比较可能性。

JPanel panel = new JPanel(new GridLayout(1, 0));

附录:您的setAutoResizeMode() 看起来很可疑; JTable.WIDTH 不太可能是只是巧合的一个有效值。 GridLayout 可以很好地与默认设置 JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS 配合使用,但您可以尝试其他设置。

table.setAutoResizeMode(JTable.WIDTH);

【讨论】:

  • WIDTH 继承自 ImageObserver(一直向上由Component 实现),恰好与JTable#AUTO_RESIZE_NEXT_COLUMN 相同。
  • @Geoffrey Zheng:都是 1!我应该看的。感谢您澄清这一点。
【解决方案2】:

使用边框布局,NORTH、SOUTH、EAST 和 WEST 边框都采用包含面板的默认大小,但 CENTER 扩展为占用所有剩余空间。我建议将您的 createDataView 放在布局的这一部分。

【讨论】:

  • 你的意思是把一个JPanel容器放在CENTER,然后把组件放在这里吗?
  • 是的,改变 add(createDataView(), BorderLayout.SOUTH);添加(createDataView(), BorderLayout.CENTER);
  • 这似乎与 CENTER 中的现有组件完全重叠。无论如何让它并排?如果我在 SOUTH, CENTER 需要一些东西怎么办?
  • 哦,抱歉,您没有提到 CENTER 中已经有组件。在这种情况下,您可能需要查看 JTable 上的 minSize、preferredSize 和 maxSize 方法。
猜你喜欢
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多