回答
这样做的好方法是使用CustomRenderer。您既可以使用预定义的图像,也可以实时绘制直线笔划。下面是后一个选项的示例:
import java.awt.BasicStroke;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.Stroke;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;
import javax.swing.SwingUtilities;
import javax.swing.UnsupportedLookAndFeelException;
public class TestComboBox {
private static enum LineType {
PLAIN {
@Override
public Stroke getStroke() {
return new BasicStroke(1.0f, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER, 1.0f, new float[] { 1.0f }, 1);
}
},
DOTTED {
@Override
public Stroke getStroke() {
return new BasicStroke(1.0f, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER, 1.0f, new float[] { 0.1f, 5.0f }, 1);
}
},
DASHED {
@Override
public Stroke getStroke() {
return new BasicStroke(1.0f, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER, 1.0f, new float[] { 3.0f, 3.0f }, 1);
}
};
public abstract Stroke getStroke();
}
public class LineRenderer extends JPanel implements ListCellRenderer {
private LineType value;
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
if (value instanceof LineType) {
setLineType((LineType) value);
} else {
setLineType(null);
}
return this;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
if (value != null) {
g2d.setStroke(value.getStroke());
g.drawLine(0, getHeight()/2, getWidth(), getHeight()/2);
}
}
private void setLineType(LineType value) {
this.value = value;
}
@Override
public Dimension getPreferredSize() {
return new Dimension(50, 20);
}
}
protected void initUI() {
final JFrame frame = new JFrame(TestComboBox.class.getSimpleName());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel(new GridBagLayout());
final JComboBox comboBox = new JComboBox(LineType.values());
comboBox.setRenderer(new LineRenderer());
comboBox.setSelectedItem(null);
comboBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JOptionPane.showMessageDialog(comboBox, "You have selected " + comboBox.getSelectedItem());
}
});
}
});
panel.add(comboBox);
frame.add(panel);
frame.setSize(300, 100);
frame.setVisible(true);
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,
UnsupportedLookAndFeelException {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestComboBox().initUI();
}
});
}
}
@ Guillaume Polet 精彩,伟大的工作,非常感谢! –
看看这个answer,我给了一个定制的JComboBox
编辑器。在该解决方案中,我扩展了BasicComboBoxEditor
类,修改了编辑组件,并在setEditor()
中使用了该实例。
同样,您可以扩展BasicComboBoxRenderer
,根据需要修改渲染组件的边框,然后使用setRenderer()
将它的新实例设置为JComboBox
。
您确实不应该使用UI委托代码来执行此任务。这就是[ComboBoxEditor](http://docs.oracle.com/javase/7/docs/api/javax/swing/ComboBoxEditor.html)和[ListCellRenderer](http://docs.oracle.com/javase/) 7/docs/api/javax/swing/ListCellRenderer.html)接口。以这种方式使用类似'BasicComboBoxRenderer'的东西可能会危及应用程序的外观和感觉 – MadProgrammer
- 1. ggplot线条图具有不同的线条样式和标记
- 2. React.js - 渲染基于道具不同样式组件
- 3. 线条颜色,线条样式,线条重量组合框
- 4. JavaFX组合框选择线条样式
- 5. java swing组合框
- 6. Java swing渲染问题
- 7. Java swing渲染优化
- 8. 在OpenGL中渲染B样条曲线
- 9. 丑陋的线条和边框渲染
- 10. Java Swing - 三点组合框
- 11. 渲染后的组合框存储
- 12. Swing字体渲染
- 13. 如何渲染2条文字线?
- 14. 的Java Swing存储和渲染文本
- 15. java swing中的渲染问题
- 16. MathJax不渲染具有角
- 17. Durandal组合渲染
- 18. ExtJs组合框:样式条目
- 19. ReactJS条件渲染组件与道具的最佳方式
- 20. Python:具有相同图例的不同线条样式的情节
- 21. Swing GUI渲染慢?
- 22. 重装和渲染组合框
- 23. Java多线程渲染,如何优化
- 24. primefaces,如何有条件地渲染组件而不创建它
- 25. 从矩形渲染线条
- 26. AChartEngine上的不同线条样式
- 27. 将Swing组件渲染到离线缓冲区
- 28. 如何分别渲染子组件的样式?
- 29. 如何在同一地点渲染不同的集合?
- 30. 如何渲染没有任何样式属性的gridvew?
你有什么试过的?您可以使用JPanel作为渲染器并在面板中画线,或者可以使用代表每行的ImageIcons并使用DefaultListCellRenderer的子类。 –
嗨JB Nizet,你能提供一些行代码作为例子吗? –
是:http://docs.oracle.com/javase/tutorial/uiswing/components/combobox.html#renderer –