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, тази концепция е similair за всички тези 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