ローカル システムのルック アンド フィールを使用する Java アプリケーションを作成しています。プログラムには、色付きのドット (カスタム JComponment) とそれに続くオブジェクトを指定したテキストをレンダリングする ListCellRenderer があります。これは、Swing のデフォルトの Metal ルック アンド フィールを使用する場合にうまく機能します。
ただし、Windows のルック アンド フィールを使用すると、セルはドロップダウン リストで正しくレンダリングされますが、選択されたアイテム (ユーザーが別のオプションを選択していないときに表示されるアイテム) はテキストのみをレンダリングし、色付きのドットを無視します。レンダラーを変更してフォントを設定すると、ドロップダウンと選択した項目の両方で適切なフォントが表示されるため、セル レンダラーが少なくとも部分的に使用されていることがわかります。
このような問題を引き起こしているさまざまな LAF に関する Web 上の投稿をいくつか読みましたが、私の特定の問題について話し合っている人に出会ったことはありません。
興味のある方のために、コードは次のとおりです。
.
@Override
public Component getListCellRendererComponent(JList<? extends ColoredDisplayable> jlist, ColoredDisplayable e, int i, boolean isSelected, boolean hasFocus) {
JPanel cell = new JPanel(new GridBagLayout());
cell.setOpaque(false);
JLabel label = new JLabel(e.getDisplayString());
label.setOpaque(false);
label.setBorder(BorderFactory.createEmptyBorder(1, 4, 1, 4));
label.setHorizontalAlignment(JLabel.LEFT);
Color deselectedBackground = cell.getBackground();
Color deselectedTextColor = cell.getForeground();
// LAYOUT COMPONENTS
// Dot
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = INSETS;
gbc.anchor = GridBagConstraints.LINE_START;
gbc.weightx = 0.0f;
gbc.fill = GridBagConstraints.NONE;
cell.add(new Dot(e.getColor()), gbc);
// Label
gbc.gridx = 1;
gbc.weightx = 1.0f;
gbc.fill = GridBagConstraints.HORIZONTAL;
cell.add(label, gbc);
if (isSelected){
cell.setOpaque(true);
cell.setBackground(MetalLookAndFeel.getTextHighlightColor());
} else {
cell.setBackground(deselectedBackground);
cell.setForeground(deselectedTextColor);
}
return cell;
}
また、カスタム コンポーネントのコードは次のとおりです。誰かがこれを試して、私がここでばかげたことをしているだけかどうかを確認してください。
public class Dot extends JComponent {
/** The size of the dot. */
private static final int SIZE = 10;
/** The size of the dot. */
private static final int PAD = 4;
private static final Dimension DIM = new Dimension(SIZE + PAD, SIZE + PAD);
/** The Color to render the dot. */
private final Color m_color;
/** The Dot itself. */
private static final Ellipse2D.Double DOT = new Ellipse2D.Double(PAD / 2, PAD / 2, SIZE, SIZE);
/**
* Creates a dot of the specified color.
* @param color the color to make the dot.
*/
public Dot(Color color) {
m_color = color;
}
@Override
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(m_color);
g2d.fill(DOT);
}
@Override
public Dimension getPreferredSize() {
return DIM;
}
}
編集: これをUbuntu 12.04でテストしたところ、セルレンダラーは期待どおりに機能しました(ただし、カスタムレンダラーが適用されていない場合のように、JComboboxは外側の境界線をレンダリングしませんでした)。
編集:これをさらに詳しく調べると、JComboBox の setEditor メソッドに何かがあるように見えますが、編集できない場合は、メソッドの状態の javadoc としてレンダラーを使用する必要があります。
JComboBox フィールドで選択された項目を描画および編集するために使用されるエディターを設定します。エディターは、受信側の JComboBox が編集可能な場合にのみ使用されます。編集できない場合、コンボ ボックスはレンダラーを使用して、選択した項目を描画します。
それは私が見ている動作ではないようです。Windows LAF のユーザーがセル レンダラーのすべての部分を監視できるようにするには、どうすればよいですか?