【问题标题】:remove borders inside JScrollPane删除 JScrollPane 内的边框
【发布时间】:2011-10-07 12:25:29
【问题描述】:

我正在尝试将多个 JLists 放在 JPanel 中,并将 JPanel 放在 JScrollPane 中。问题是当我将 JScrollPane 添加到等式时,JList 和外边框之间有一个空格,我该如何摆脱这个边框,使其水平填充?

这里有一个小示例代码,用 JLabel 而不是 JList 演示了这个问题。

/edit:这似乎是 windows 的东西,它在 Mac OS 上运行良好。

import java.awt.*;
import javax.swing.*;

public class Test extends JFrame
{  
    public static void main(String[] args) 
    {
        Test test = new Test();
    }

    public Test()
    {
        JPanel contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout());        
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);        
        this.setContentPane(contentPane);        
        this.setMinimumSize(new Dimension(400, 300));

        JScrollPane sp = new JScrollPane(createLeftPane());
        sp.setBorder(BorderFactory.createLineBorder(Color.yellow));
        this.add(sp, BorderLayout.WEST);

        LookAndFeel.installBorder(sp, "BorderFactory.createEmptyBorder()");        

        StackTraceElement[] st = Thread.currentThread().getStackTrace();
        for(int i = 0; i < st.length; i++) {
            System.out.println(st[i]);
        }

        this.pack();
        this.setLocationRelativeTo(null);
        this.setVisible(true);

    }

    private JPanel createLeftPane()
    {
        JPanel panel = new JPanel();
        panel.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.HORIZONTAL;
        JLabel label = new JLabel("TEST LABEL");
        label.setBorder(BorderFactory.createLineBorder(Color.blue));
        panel.add(label, c);
        panel.setBorder(BorderFactory.createLineBorder(Color.red));

        return panel;
    }        
}

这是一个屏幕截图(第一个没有滚动窗格)

堆栈跟踪:

java.lang.Thread.getStackTrace(Thread.java:1479) 
test.Test.<init>(Test.java:27) 
test.Test.main(Test.java:10)

/edit:经过反复试验,我发现当我将 c.weightx = 0.5 添加到约束时,它确实会水平填充,但是当 scrollPane 变得大于其内容时,它会使自身变宽,这很奇怪。请参阅下面的屏幕截图:

【问题讨论】:

  • +1 用于发布 SSCCE。可以加个截图吗?

标签: java swing border jpanel jscrollpane


【解决方案1】:

问题不在于滚动窗格。这是因为您将标签添加到 JPanel。默认情况下,面板使用 FlowLayot,它在每个组件周围有 5 个像素的垂直/水平间隙。

将 FlowLayout 更改为使用 0 间隙,或使用不同的布局。也许是 BoxLayout。

【讨论】:

  • “双向”是什么意思?顺便说一句,我发现了一些有趣的东西,当我在我的 Mac 上运行它时不会出现问题。所以显然这是一个 Windows 的东西
  • @Jesse 你的意思是stackoverflow.com/questions/6242341/…(JComboBox 的JList)
【解决方案2】:

component.setBorder(null) 移除已在组件上设置的任何边框

【讨论】:

  • 很好的答案!我一直在寻找这个问题的解决方案很长一段时间,这个简单的解决方案有效!谢谢你。
【解决方案3】:

当我在我的 Mac 上运行它时不会出现这个问题,所以显然这是 Windows 的问题。

除了background、foreground、font 和 opaque 的预期 UI 默认值之外,BasicPanelUI 安装了边框,而 com.apple.laf.AquaPanelUI(显然)没有。

LookAndFeel.installBorder(p,"Panel.border");

您可以尝试将您的设置为null。

【讨论】:

  • 感谢您的回答,我尝试将其设置为 null,如下所示: LookAndFeel.installBorder(sp, null);但它会在 java.util.Hashtable.get(Hashtable.java:334) 处引发 nullPointerException(sp 是我的 JScrollPane)
  • 编辑您的答案以包括您修改后的sscce 和堆栈跟踪。需要一个空边框,例如BorderFactory.createEmptyBorder().
  • 我修改了我的 SSCCE 并包含了一个堆栈跟踪。我必须查找如何使用堆栈跟踪,所以我希望我以正确的方式做到了。 BorderFactory.createEmptyBorder() 不起作用,但我再次不确定我做对了。
  • 尝试将其设置在您的contentPane,而不是您的sp。我也在 Mac OS X 上。
  • 我使用了这个语法:LookAndFeel.installBorder(contentPane, "BorderFactory.createEmptyBorder()");,但它不起作用。
【解决方案4】:

你是这个意思吗???

import java.awt.*;
import java.io.File;
import javax.swing.*;
import javax.swing.filechooser.FileSystemView;

public class FilesInTheJList {

    private static final int COLUMNS = 5;
    private Dimension size;

    public FilesInTheJList() {
        final JList list = new JList(new File("C:\\").listFiles()) {

            private static final long serialVersionUID = 1L;

            @Override
            public Dimension getPreferredScrollableViewportSize() {
                if (size != null) {
                    return new Dimension(size);
                }
                return super.getPreferredScrollableViewportSize();
            }
        };
        list.setFixedCellHeight(50);
        list.setFixedCellWidth(150);
        size = list.getPreferredScrollableViewportSize();
        size.width *= COLUMNS;
        list.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        list.setCellRenderer(new MyCellRenderer());
        list.setVisibleRowCount(0);
        list.setLayoutOrientation(JList.HORIZONTAL_WRAP);

        JFrame f = new JFrame("Files In the JList");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new JScrollPane(list));
        f.pack();
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                FilesInTheJList fITJL = new FilesInTheJList();
            }
        });
    }

    private static class MyCellRenderer extends JLabel implements ListCellRenderer {

        private static final long serialVersionUID = 1L;

        @Override
        public Component getListCellRendererComponent(JList list, Object value,
                int index, boolean isSelected, boolean cellHasFocus) {
            if (value instanceof File) {
                File file = (File) value;
                setText(file.getName());
                setIcon(FileSystemView.getFileSystemView().getSystemIcon(file));
                if (isSelected) {
                    setBackground(list.getSelectionBackground());
                    setForeground(list.getSelectionForeground());
                } else {
                    setBackground(list.getBackground());
                    setForeground(list.getForeground());
                }
                setPreferredSize(new Dimension(250, 25));
                setEnabled(list.isEnabled());
                setFont(list.getFont());
                setOpaque(true);
            }
            return this;
        }
    }
}

.

.

类似但更好的方法@trashgod here

【讨论】:

  • 和代码行 f.add(new JScrollPane(list)); 不是 JScrollPane 的正确定义,是否有另一种方式我必须定义它:-)
  • 对不起,我的搜索没有找到,我的错 :)
【解决方案5】:

trashgod 的解决方案对我有用

LookAndFeel.installBorder(scrollpane,BorderFactory.createEmptyBorder().toString());

【讨论】:

    【解决方案6】:

    您也可以使用删除JScrollPane 的边框

    JScrollPane yourScrollPane = new JScrollPane();
    yourScrollPane.setBorder(BorderFactory.createEmptyBorder());
    

    【讨论】:

      猜你喜欢
      • 2016-12-19
      • 1970-01-01
      • 2021-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      相关资源
      最近更新 更多