【问题标题】:Java Swing layout for a scrollable table?可滚动表的Java Swing布局?
【发布时间】:2013-11-25 04:46:42
【问题描述】:

我目前在 JPanel 中有一个 JPanel,我想在其中放置 JScrollPane/JTable。我无法将其放置在我想要的位置。我想让表格适合 JPanel 的整个宽度,但只填充垂直显示表格中所有动态数据所需的空间。

这是我目前拥有的代码,图片就是它的样子。蓝色区域是表格/滚动情况的嵌套面板。还有为什么桌子下面有一个愚蠢的灰色盒子。我该如何摆脱它?对不起图片,数据很敏感。谢谢。

    JPanel panel = new JPanel();
    panel.setBounds(50, 100, 300, 450);
    panel.setBackground(Color.blue);
    contentPane.add(panel); //contentPane is the outter panel

    JScrollPane scrollpane = new JScrollPane(table); //table was created earlier
    panel.add(scrollpane,BorderLayout.NORTH);

示例程序(我不要桌子下的那个大矩形)

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class Test {

public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(350,100,1000,800);
    JPanel contentPane = new JPanel(new BorderLayout());
    frame.setContentPane(contentPane);
    JTable table = new JTable(5,5);
    JScrollPane scrollpane = new JScrollPane(table);
    table.setFillsViewportHeight(true);
    contentPane.add(scrollpane,BorderLayout.NORTH);
    frame.revalidate();
}

}

【问题讨论】:

  • 我看到了 setBounds,这让我觉得您使用的是空布局...
  • 我正在为外部面板使用绝对定位。我不明白为什么会有所作为。
  • @MadProgrammer,他的代码也没有告诉我们JPanel 实例panel 的布局,但他正在添加具有BorderLayout 约束的组件:)

标签: java swing layout jtable jscrollpane


【解决方案1】:

还有为什么桌子下面有一个愚蠢的灰色框。我该如何摆脱 那个?

在将table.setFillsViewportHeight(true); 添加到JSCrollPane 后尝试使用它:就像你现在所做的那样:

   JPanel panel = new JPanel();
   // other code
   panel.setLayout(new BorderLayout()); // not sure whither you are already doing this

   JScrollPane scrollPane = new JScrollPane(table);
   table.setFillsViewportHeight(true);

   panel.add(scrollPane, BorderLayout.CENTER);

调用setFillsViewportHeight(true) 函数设置fillsViewportHeight 属性。当此属性为true 时,table 使用容器的整个高度,即使table 没有足够的行来使用整个垂直空间。

注意:

  1. 我没有看到您向已添加 JScrollPanepanel 添加了布局。我希望您知道 JPanel 使用 FlowLayout 作为默认布局,它遵循组件的首选大小提示。同样,panel.add(scrollpane, BorderLayout.NORTH); 会产生歧义。当我们使用约束:BorderLayout.NORTH 到具有BorderLayout 作为布局管理器的组件时。

  2. Frame 的内容窗格具有BorderLayout 作为默认布局管理器您正在使用setBounds() 设置绑定到panel,我们通常在使用AbsoluteLayout(null) 布局时这样做。而AbsoluteLayout 在 Swing 中开发应用程序时是不行的

【讨论】:

  • JPanel 仍在使用 FlowLayout,这意味着滚动窗格可能不会填满整个区域...
  • @MadProgrammer,我已经注意到了这个问题。真是模棱两可:他在做的时候,panel.add(scrollpane, BorderLayout.NORTH);
  • 我不希望桌子填满整个容器。我只想让它尽可能大,以查看所有数据,如果它比容器大,它应该用滚动条填充整个东西。
  • @Robert, Get some people skills and grow up - 我认为你是需要人际交往能力的人。当人们试图提供帮助时,你是那个寻求帮助然后制造 cmet 的人。由于这样一个糟糕的问题,很难给你准确的建议。您发布的代码大多没用。说“它不起作用”并没有给我们任何信息。根据收到的所有建议发布您的SSCCE 展示您尝试过的内容。
  • @camickr,版主已经删除了看起来的 cmets。我标记了他的cmets。希望他能发布SSCCE,让我们知道他到底想做什么。
【解决方案2】:

但只填充垂直显示表格中所有动态数据所需的空间。

如果您有 100 行,它们将无法同时显示在框架上怎么办?

重写JTable的getPreferredScrollableViewportSize()方法返回一个合理的数字,这个数字应该包括JTableHeader的高度。因此,您可能希望将高度限制在合理的行数 + 表头。

panel.add(scrollpane,BorderLayout.NORTH);

NORTH 约束不做任何事情。 JPanel 默认使用 FlowLayout。您需要将面板的布局设置为 BorderLayout。

编辑:

您被要求出示包含这些答案中所提建议的 SSCCE。你还没有:

  1. 实现了getPreferredScrollableViewportSize()方法
  2. 将所有组件添加到框架后,在框架上执行 pack()。

其他通用cmets。

  1. 不要指定框架的大小。这就是 pack() 方法的用途。即使是你也不会硬编码大小。我的显示器甚至不够大,无法显示您指定大小的帧。

  2. 在将所有组件添加到框架之前,不要使框架可见。

  3. 应在事件调度线程上创建 GUI。

【讨论】:

  • 如果有 100 行,那么它应该用滚动垂直填充整个空间(因此滚动窗格的点)。
  • 这不是布局管理器的工作方式。组件建议布局管理器使用的提示。所以面板不能说我需要 500 像素的高度,因为框架中可能还有另一个面板也需要 500 像素的高度,这对于框架来说太大了。所以每个组件都应该有一个“首选大小”。然后你打包框架并使用允许组件增长/缩小和框架大小变化的布局管理器,这意味着你不应该将你的组件添加到 NORTH 因为 if 永远不会改变高度,即使有更多可用空间。
  • 那么你推荐什么布局来管理这个?我只是不确定你如何让它在面板中改变大小。
  • 您在一周前的其他问题中得到了答案。您不仅没有遵循该建议,还没有发布SSCCE!!!
  • 我添加了一个小程序。当它运行时,我希望桌子下面的那个大矩形不存在。我希望表格只显示单元格。在此示例中,我设置了列数和行数,但在我的实际程序中,行数会根据条件而变化,因此它应该能够动态调整大小。
猜你喜欢
  • 2014-12-15
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
  • 2012-01-29
  • 2019-04-04
  • 2018-05-03
相关资源
最近更新 更多