我正在使用“在 JPanel 上添加 JSeparator 和 ComboBoxItem-to-render” -ListCellRenderer 方法在 JComboBox 中显示分隔符。
我注意到 MacOS 上将 PopUp 上的选定项目垂直居中的算法被 JSeparator-ComboBoxItems 的高度变化弄糊涂了。
有没有办法修复此屏幕截图右侧看到的弹出窗口的错误位置?如果选择了“西班牙”-项目,它被画得有点太高了;“汽车”-项目太高了。
源代码:
import java.awt.BorderLayout;
import java.awt.Component;
import java.util.Arrays;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.ListCellRenderer;
public class JComboBoxSeparatorMacOs {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JComboBox<String>("A,Normal,Combo Box,without Separators".split(",")), BorderLayout.WEST);
JComboBox<String> comboBox = new JComboBox<String>("Spain,Italy,Car,Peru".split(","));
ListCellRenderer<String> renderer = new SeparatorListCellRenderer<String>(comboBox.getRenderer(), 0);
comboBox.setRenderer(renderer);
frame.add(comboBox);
frame.pack();
frame.setVisible(true);
}
}
class SeparatorListCellRenderer<E> implements ListCellRenderer<E> {
private final ListCellRenderer<? super E> delegate;
private final int[] indexes;
private final JPanel panel = new JPanel(new BorderLayout());
public SeparatorListCellRenderer(ListCellRenderer<? super E> delegate, int... indexes) {
Arrays.sort(indexes);
this.delegate = delegate;
this.indexes = indexes;
panel.setOpaque(false); //for rendering of selected item on MSWindows
}
@Override
public Component getListCellRendererComponent(JList list, E value, int index, boolean isSelected, boolean cellHasFocus) {
panel.removeAll();
panel.add(delegate.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus));
if (Arrays.binarySearch(indexes, index) >= 0)
panel.add(new JSeparator(), BorderLayout.PAGE_END);
return panel;
}
}