удалить границы внутри JScrollPane - PullRequest
2 голосов
/ 07 октября 2011

Я пытаюсь поместить несколько JList в 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;
    }        
}

Вот скриншот(первый без области прокрутки) JScrollPane Problems

Трассировка стека:

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 становится больше, чем его содержимое, оно делает себя шире, что странно.Смотрите скриншоты ниже:

enter image description here

Ответы [ 6 ]

3 голосов
/ 04 сентября 2013

component.setBorder(null) удаляет любую границу, установленную для компонента

3 голосов
/ 07 октября 2011

Проблема не из-за полосы прокрутки. Это потому, что вы добавляете метку в JPanel. По умолчанию панель использует FlowLayot, который имеет вертикальный / горизонтальный зазор 5 пикселей вокруг каждого компонента.

Измените FlowLayout, чтобы использовать пробел 0, или используйте другой макет. Может быть, BoxLayout.

2 голосов
/ 07 октября 2011

Проблема не возникает, когда я запускаю ее на своем Mac, так что, очевидно, это вещь для Windows.

В дополнение к ожидаемым значениям по умолчанию для пользовательского интерфейса background, foreground, font и opaque, BasicPanelUI устанавливает границу, а com.apple.laf.AquaPanelUI (по-видимому) - нет.

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

Вы можете попытаться установить свой null.

1 голос
/ 07 октября 2011

вы имеете в виду этот путь ???

enter image description here

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;
        }
    }
}

.

.

similair, но лучший путь @trashgod здесь

0 голосов
/ 05 ноября 2015

Вы также можете удалить границу JScrollPane, используя

JScrollPane yourScrollPane = new JScrollPane();
yourScrollPane.setBorder(BorderFactory.createEmptyBorder());
0 голосов
/ 13 октября 2014

У меня решение trashgod работало с

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