如何在 JTable / JScrollPane 中去除边框

40
如果您运行下面的简短示例,您将看到中心区域周围有一个边框。我不确定为什么会出现这个边框。
当JTable在JScrollPane中时,就会发生这种情况。我尝试了各种方法来去除它,但是目前还没有成功。没有JScrollPane的JTable不会显示边框。
请参见下面的示例。谢谢。
public class TestScrollPane extends JFrame {

    public static void main(String[] args) {
        JFrame frame = new TestScrollPane();
        JPanel panel = new JPanel();
        JTable table = new JTable();

        panel.setLayout(new BorderLayout());
        panel.add(new JLabel("NORTH"), BorderLayout.NORTH);
        panel.add(new JLabel("SOUTH"), BorderLayout.SOUTH);

        JScrollPane sp = new JScrollPane(table);
        // None of these have any effect
        sp.setBorder(null);
        sp.getInsets().set(0, 0, 0, 0);
        sp.setViewportBorder(null);
        sp.getViewport().setBorder(null);
        sp.getViewport().getInsets().set(0, 0, 0, 0);
        sp.getViewport().setOpaque(true);

        panel.add(sp, BorderLayout.CENTER);
        // Adding the table alone shows no border
        // panel.add(table, BorderLayout.CENTER);
        frame.add(panel);

        frame.setVisible(true);
    }

    public TestScrollPane() throws HeadlessException {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setMinimumSize(new Dimension(100, 100));
    }
}

3
你是否尝试使用BorderFactory.createEmptyBorder()而不是将边框设置为空(null)?该方法可使边框为空但仍保留其大小。 - sly7_7
另外,不要忘记对 frame 进行 pack() - trashgod
6个回答

74

使用BorderFactory.createEmptyBorder()替代null...

通过使用:

sp.setBorder(createEmptyBorder());

它可行。

您的主方法变为:

public static void main(String[] args) {
    JFrame frame = new TestScrollPane();
    JPanel panel = new JPanel();
    JTable table = new JTable();

    panel.setLayout(new BorderLayout());
    panel.add(new JLabel("NORTH"), BorderLayout.NORTH);
    panel.add(new JLabel("SOUTH"), BorderLayout.SOUTH);

    JScrollPane sp = new JScrollPane(table);
    sp.setBorder(BorderFactory.createEmptyBorder());
    panel.add(sp, BorderLayout.CENTER);
    frame.add(panel);

    frame.setVisible(true);
}

1
很酷 :). 我认为(但不确定)Swing组件的默认行为是具有线边框。因此,BorderFactory类是您自定义它们的好帮手 :)。 - sly7_7
2
请参考下面的克里希纳答案:sp.setViewportBorder(null); - Asaf
当作者编写此代码时,他使用了setViewPortBorder(null),但似乎没有起作用。也许这只是一个错误,自2010年以来已经修复。我已经离开了Java开发,所以@krishna-gupta的答案现在可能是正确的。 - sly7_7
这个答案对我在Java 6上的OS X Lion工作良好。我需要在我的另一台机器上(运行Java 8 on OS X Mavericks)尝试一下,看看是否需要在这里编写一些特定版本的分支或其他什么东西... - ArtOfWarfare

5

有趣的是,当你删除这行代码时,边框会消失:

sp.setBorder(null);

1
不适用于Windows XP。可能是平台问题。 - sproketboy
这绝对取决于你的 L&F。在 OS X 上,你会得到一个非常小的边框,我认为它应该看起来像阴影或其他什么东西(不太确定 - 我把组件放在一个非标准的位置,边框看起来不对,因此我想要去掉它)。 - ArtOfWarfare

5

我也一直在寻找同样的答案,但以上的回答都不能解决问题,所以我发现了一个更好的答案:

JScrollPane jsp = new JScrollPane();

//ur other codes

jsp.setViewportBorder(null);

1

对于 JTable,table.setIntercellSpacing(new Dimension(0, 0)) 起作用。


0
我认为正确的修复方法是将 viewportView 的边框设置为“null”。

0

要从JScrollPane的所有部分中包括垂直和水平滚动条中移除边框,可以使用以下代码:

JScrollPane jsp = new JScrollPane();
jsp.getVerticalScrollBar().setBorder(null);
jsp.getHorizontalScrollBar().setBorder(null);
jsp.setBorder(null);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接