【发布时间】:2016-10-11 03:22:29
【问题描述】:
我想要一个右对齐的 JComboBox。我怎样才能做到这一点? 之前有人说过“您可以为 JComboBox 设置一个渲染器,它可以是一个具有 JLabel#setHorizontalAlignment(JLabel.RIGHT) 的 JLabel”,但我不知道该怎么做?
【问题讨论】:
标签: java swing jcombobox renderer right-align
我想要一个右对齐的 JComboBox。我怎样才能做到这一点? 之前有人说过“您可以为 JComboBox 设置一个渲染器,它可以是一个具有 JLabel#setHorizontalAlignment(JLabel.RIGHT) 的 JLabel”,但我不知道该怎么做?
【问题讨论】:
标签: java swing jcombobox renderer right-align
之前有人说过“你可以为 JComboBox 设置一个渲染器,它可以是一个具有 JLabel#setHorizontalAlignment(JLabel.RIGHT) 的 JLabel”
是的,默认渲染器是 JLabel,因此您无需创建自定义渲染器。您可以使用:
((JLabel)comboBox.getRenderer()).setHorizontalAlignment(JLabel.RIGHT);
【讨论】:
好吧,你可以使用 ListCellRenderer,像这样:
import java.awt.Component;
import java.awt.ComponentOrientation;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.SwingUtilities;
public class ComboboxDemo extends JFrame{
public ComboboxDemo(){
JComboBox<String> comboBox = new JComboBox<String>();
comboBox.setRenderer(new MyListCellRenderer());
comboBox.addItem("Hi");
comboBox.addItem("Hello");
comboBox.addItem("How are you?");
getContentPane().add(comboBox, "North");
setSize(400, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
private static class MyListCellRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
Component component = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
component.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
return component;
}
}
public static void main(String [] args){
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new ComboboxDemo().setVisible(true);
}
});
}
}
【讨论】:
这对我很有效
comboFromDuration.setRenderer(new DefaultListCellRenderer() {
@Override
public void paint(Graphics g) {
setHorizontalAlignment(DefaultListCellRenderer.CENTER);
setBackground(Color.WHITE);
setForeground(Color.GRAY);
setEnabled(false);
super.paint(g);
}
});
为避免每次调用paint(Graphics) 时都使用setter,您还可以使用匿名构造函数块:
comboFromDuration.setRenderer(new DefaultListCellRenderer() {
{
setHorizontalAlignment(DefaultListCellRenderer.CENTER);
setBackground(Color.WHITE);
setForeground(Color.GRAY);
setEnabled(false);
}
});
【讨论】: