JList: как получить LineBorder между ячейками?

Это пример JList. Я знаю, как установить границу для всего JList или панели, содержащей JList. Мой вопрос заключается в том, как мы можем создать линейные границы между ячейками?`

введите здесь описание изображения

Например, на данном рисунке цвет линии границы между первой и второй ячейками серый, а между всеми остальными ячейками есть граница линии белого цвета.

Пожалуйста, не говорите, что это JComboBox или JTree (из-за второго элемента и двух его дочерних элементов); даже если это не JList, я хочу, чтобы мой JList имел аналогичный LineBorders между cells.


Поиск в Интернете привел меня к это interface. Его метод getListCellRendererComponent принимает такие аргументы, как E value, int index, boolean isSelected, boolean cellHasFocus, а я хочу, чтобы LineBorder отображалось между всеми ячейками независимо от того, какой у них индекс, выбраны они или нет и т. д.


ИЗМЕНИТЬ:-

введите здесь описание изображения

Граница в одних местах более толстая, в других – тонкая.


person Solace    schedule 06.05.2014    source источник
comment
вы ограничили возможные предложения или ответы на Please don't say that this is ---› загляните в документы и измените стандартные границы, вы хотите / должны переопределить isSelected и hasFocus, остальное описано в отказавшихся учебниках JComboBox, JList, JTable, JTree, эта концепция аналогично для всех этих JComponents   -  person mKorbel    schedule 06.05.2014
comment
как мы можем создать линии границ между ячейками == поиск AbstractBorder   -  person mKorbel    schedule 06.05.2014


Ответы (1)


Вы можете добиться этого с помощью ListCellRenderer. Вот простой пример:

import java.awt.Color;
import java.awt.Component;

import javax.swing.BorderFactory;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListCellRenderer;


public class TestFrame extends JFrame{

    public TestFrame(){
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        init();
        pack();
        setVisible(true);
    }

    private void init() {
        JList<String> list = new JList<>(new String[]{"1","2","3"});
        list.setCellRenderer(getRenderer());
        add(list);
    }

    private ListCellRenderer<? super String> getRenderer() {
        return new DefaultListCellRenderer(){
            @Override
            public Component getListCellRendererComponent(JList<?> list,
                    Object value, int index, boolean isSelected,
                    boolean cellHasFocus) {
                JLabel listCellRendererComponent = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected,cellHasFocus);
                listCellRendererComponent.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0,Color.BLACK));
                return listCellRendererComponent;
            }
        };
    }

    public static void main(String... strings) {
        new TestFrame();
    }
}

Выглядит как:

введите здесь описание изображения

Подробнее читайте в руководстве.

РЕДАКТИРОВАТЬ: Просто измените LineBorder на MatteBorder (изменили код и изображение).

person alex2410    schedule 06.05.2014
comment
Спасибо .. на самом деле это очень близко к тому, что я хотел. Но то, что я хочу, это линия границы прямо под ячейкой. Потому что, как вы можете видеть на изображении, вокруг всего списка есть граница, а между ячейками есть линия границы. У меня есть рамка вокруг списка, а затем граница вокруг ячеек объединяется с границей вокруг всего списка и делает его толстым и уродливым. Я прилагаю изображение моего JList. - person Solace; 07.05.2014
comment
Большое вам спасибо! - person Solace; 07.05.2014