Почему высота JList изменяется при использовании пользовательского средства визуализации ячеек? - PullRequest
0 голосов
/ 21 апреля 2020

Я работаю с JList, в котором есть пользовательское средство визуализации ячеек. Это средство визуализации ячеек:

public class DefaultOriginalPublisherListRenderer extends DefaultListCellRenderer {

    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        if (value instanceof OriginalPublisher) {
            OriginalPublisher op = (OriginalPublisher) value;
            String text = op.getName();
            if (index > -1) {
                text = "<html><b>" + op.getName() + "</b><br/><small>" + op.getIpi() + "</small></html>";
            }
            return super.getListCellRendererComponent(list, text, index, isSelected, cellHasFocus);
        } else {
            return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        }

    }
}

Все, что он делает, это делает несколько изменений в тексте при расширении списка. В противном случае он ничего не делает.

Следует добавить, что приложение работает с L & F по умолчанию для данной системы / ОС, в которой выполняется приложение. В моей системе рендерер ячейки по умолчанию - class javax.swing.plaf.synth.SynthComboBoxUI$SynthComboBoxRenderer. Это средство визуализации ячеек, которое я заменяю приведенным выше средством визуализации.

JList, к которому применяется средство визуализации, выглядит следующим образом. Вы можете видеть, что высота намного меньше, чем у компонента выше:

enter image description here

То, что я хотел бы, чтобы высота была, это. Это высота по умолчанию, когда средство визуализации ячеек не используется:

enter image description here

Как я могу гарантировать, что высота JList, даже с пользовательской ячейкой рендер применен, остается по умолчанию?

Вот SSCCE:

package test;

import java.awt.Component;
import java.awt.Dimension;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.UIManager;

public class CellRendererTest {

    private final JFrame f;

    public CellRendererTest() {
        f = new JFrame();
        init(f);
    }

    public void show() {
        f.setPreferredSize(new Dimension(640, 480));
        f.pack();
        f.setVisible(true);
    }

    private void init(JFrame f) {
        JPanel p = new JPanel();
        f.add(p);

        JComboBox defaultRendererCb = new JComboBox();
        p.add(defaultRendererCb);

        JComboBox customRendererCb = new JComboBox();
        customRendererCb.setRenderer(new DefaultOriginalPublisherListRenderer());
        p.add(customRendererCb);        

        DefaultComboBoxModel m = new DefaultComboBoxModel();
        m.addElement(new OriginalPublisher("Test 1", "12345"));
        m.addElement(new OriginalPublisher("Test 1", "67890"));
        defaultRendererCb.setModel(m);
        customRendererCb.setModel(m);
    }

    private class DefaultOriginalPublisherListRenderer extends DefaultListCellRenderer {
        @Override
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            if (value instanceof OriginalPublisher) {
                OriginalPublisher op = (OriginalPublisher) value;
                String text = op.getName();
                if (index > -1) {
                    text = "<html><b>" + op.getName() + "</b><br/><small>" + op.getNumber() + "</small></html>";
                }
                return super.getListCellRendererComponent(list, text, index, isSelected, cellHasFocus);
            } else {
                return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            }
        }
    }

    private class OriginalPublisher {

        private final String name;
        private final String number;

        public OriginalPublisher(String name, String number) {
            this.name = name;
            this.number = number;
        }

        public String getName() {
            return name;
        }

        public String getNumber() {
            return number;
        }
    }

    public static void main(String[] args) throws Exception {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        CellRendererTest t = new CellRendererTest();
        t.show();
    }
}
...