1

在此处输入图像描述

我有五个列表(包含在 a 中jscrollpane)添加到组布局中的 jpanel 中。列表的问题是当滚动条自动出现时,底部/顶部的边框会消失(列表 2、3、4)。如何确保所有列表看起来与第一个/最后一个列表一样的 wrt 边框?

我已经尝试使用 设置 viewportborder setViewPortBroder,但它并没有改变太多。2,3,4 显示为浅色边框,而其余列表具有双边框。

编辑

添加代码示例:

您看到的每个列表都是使用以下代码创建的:

        MyJList jList = new MyJList(value);
        jList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        jList.setModel(listModel);
        jList.setMinimumSize(new Dimension(135, 300));
        jList.setMaximumSize(new Dimension(135, 300));
        jList.clearSelection();
        jList.setSelectionBackground(Color.darkGray);
        jList.setSelectionForeground(Color.white);
        jList.setBorder(new LineBorder(Color.darkGray, 1));
        jList.setFixedCellHeight(30);
        jList.setFixedCellWidth(100);
        Font font = jList.getFont();
        jList.addListSelectionListener(new ListListener());
        return jList;

MyList 是 JList 的扩展。除了存储一些与域相关的元数据之外,它没有什么特别的。然后,将列表添加到中间面板,如下所示:

private void layoutLists(JLabel[] labels, JList[] lists) {

        panel.removeAll();
        panel.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.NONE;

        JScrollPane[] jScrollPanes = new JScrollPane[lists.length];
        for (int index = 0; index < lists.length; index++) {
            jScrollPanes[index] = new JScrollPane(lists[index]);
            jScrollPanes[index].setBorder(BorderFactory.createEmptyBorder());
            jScrollPanes[index].setMinimumSize(new Dimension(135, 300));
            jScrollPanes[index].setMaximumSize(new Dimension(135, 300));
            jScrollPanes[index].setPreferredSize(new Dimension(135, 300));
        }

        for (int index = 0; index < labels.length; index++) {
            gbc.gridx = index;
            gbc.gridy = 0;
            gbc.insets = new Insets(8, 8, 8, 8);
            panel.add(labels[index], gbc);
            gbc.gridy = 1;
            if (index == labels.length - 1) {
                gbc.insets = new Insets(8, 8, 8, 13);
            }
            panel.add(jScrollPanes[index], gbc);
        }}
4

1 回答 1

3

内部(JList)边框的顶部/底部部分不可见的解释是......如果出现垂直滚动条(列表滚动关闭)它们不可见

如果你坚持,要么:

  • 切换边框 - 列表本身为空,滚动窗格上为 lineBorder 或
  • 将 scrollPane 的 viewportBorderProperty 设置为 lineBorder

注意:不建议摆弄默认的 LAF 设置 - 组件是否有边框应留给 ui,以确保整个应用程序的视觉效果一致。将左边框线放在 scrollPane 的垂直滚动条旁边(无论是外部还是内部)看起来也不太好。

编辑

刚刚注意到您已经尝试了第二个选项(并且对结果不满意:-) 但是:如果滚动条可见,您希望垂直边框线在哪里?无论如何,回到当心:结果高度依赖 LAF ......

于 2012-08-17T08:22:53.527 回答