1

我目前在 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();
}

}
4

2 回答 2

2

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

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

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

panel.add(scrollpane,BorderLayout.NORTH);

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

编辑:

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

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

其他一般性意见。

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

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

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

于 2013-11-12T20:41:25.910 回答
2

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

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. 我没有看到您向panel已添加JScrollPane. 我希望你知道JPanelFlowLayout是默认布局,它遵循组件的首选大小提示。再次,panel.add(scrollpane, BorderLayout.NORTH);产生歧义。当我们使用约束:作为布局管理器BorderLayout.NORTH的组件时。BorderLayout

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

于 2013-11-12T20:48:27.127 回答