1

セルが選択されたときに背景と前景を設定するために JTable TableCellRenderers を使用する場合、一般的な方法があります。以下は、尋ねられた質問の例です。

行/セルが選択されているときに、Java カスタム セル レンダラーが強調表示を表示しないのはなぜですか?

このソリューションには、セルの周囲の境界線が 1 つ欠けています。(ここで尋ねられたように、行の周りの境界線について尋ねていないことに注意してください。)セルが選択されたときに境界線が強調表示されるはずです。独自の境界線を作成して設定するだけでは受け入れられません。作成した境界線がルック アンド フィールに適合しない可能性があるためです。

次のように、デフォルトのレンダラーを初期化し、その境界線を清掃することで、境界線を正常に取得しました。

private final DefaultTableCellRenderer defTblRend = new DefaultTableCellRenderer();
private final JComponent renderer = new ComplexCell(); // Whatever object type extends JComponent
@Override public Component getTableCellRendererComponent(JTable table,
    Object value, boolean isSelected, boolean hasFocus, int row,
    int column)
{
    // ... Set values on "renderer" object here ...
    renderer.setBackground(isSelected ? table.getSelectionBackground() : table.getBackground());
    renderer.setForeground(isSelected ? table.getSelectionForeground() : table.getForeground());
    renderer.setOpaque(!renderer.getBackground().equals(table.getBackground()));
    JComponent comp = (JComponent)defTblRend.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    renderer.setBorder(comp.getBorder());
    return renderer;
}

より良い方法はありますか?

4

1 に答える 1

2

UIManager を使用できる場合があります。UIManager のデフォルトを参照してください。「Table.focusCellHighlightBorder」は、必要なプロパティのように見えます。

元のポスターによって追加:

camickrの情報に基づいて私が思いついた解決策は次のとおりです。最適化/クリーンアップを歓迎します。

  1. 静的境界線を設定して、必要な場所で使用できるようにします (「UiUtils」というクラスに配置します)。

    public static final Border focusedCellBorder = UIManager.getBorder("Table.focusCellHighlightBorder");
    public static final Border unfocusedCellBorder = createEmptyBorder();
    private static Border createEmptyBorder()
    {
        Insets i = focusedCellBorder.getBorderInsets(new JLabel());
        return BorderFactory.createEmptyBorder(i.top, i.left, i.bottom, i.right);
    }
    
  2. レンダラー

    @Override public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int column)
    {
        // [... set component values here ...]
        label.setBorder(hasFocus ? UiUtils.focusedCellBorder : UiUtils.unfocusedCellBorder);
        return label;
    }
    
于 2011-06-02T19:15:28.857 に答える