実線、点線、破線など、いくつかの異なる線のスタイルを表示するComboBoxが必要です。
これを実現するためのカスタムレンダリングを作成するにはどうすればよいですか?
皆さんありがとう。
これを行う良い方法は、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();
}
});
}
}
私がカスタムエディタに与えたこの答えを見てください。JComboBox
そのソリューションでは、BasicComboBoxEditor
クラスを拡張し、編集コンポーネントを変更して、の新しいインスタンスを使用しましたsetEditor()
。
同様に、レンダリングコンポーネントを拡張BasicComboBoxRenderer
し、必要に応じて境界線を変更してから、を使用してレンダリングコンポーネントsetRenderer()
の新しいインスタンスをに設定できますJComboBox
。