2

JPanel を表示するカスタム TableCellRenderer を作成しました。JPanel にインタラクティブな要素が含まれている場合、それらも機能するようにしたいので、カスタムの TableCellEditor を作成しました。動作しますが、JPanels をクリックすると奇妙な動作が発生します。クリックすると JPanel が消えることがあります。カスタムレンダラーのみを設定すると、JPanels がインタラクティブでないことを除いて、まったく問題はありません。したがって、問題は TableCellEditor にあるはずです。

編集者:

public class PanelTableCellEditor
        extends AbstractCellEditor
        implements TableCellEditor
{
    private Object _component;

    @Override
    public Object getCellEditorValue()
    {
        return _component;
    }

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value,
                                                 boolean isSelected, int row,
                                                 int column)
    {
        _component = value;
        if (value instanceof JPanel)
        {
            ((Component) value).setForeground(UIManager.getColor("List.selectionForeground"));
            ((Component) value).setBackground(UIManager.getColor("List.selectionBackground"));
            return ((Component) value);
        }
        else
        {
            return null;
        }
    }
}

レンダラー:

public class PanelTableCellRenderer
        extends Component
        implements TableCellRenderer
{
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
                                                   boolean isSelected,
                                                   boolean hasFocus, int row,
                                                   int column)
    {
        if (value instanceof JPanel)
        {
            if (isSelected || hasFocus)
            {
                ((Component) value).setForeground(UIManager.getColor("List.selectionForeground"));
                ((Component) value).setBackground(UIManager.getColor("List.selectionBackground"));
            }
            else
            {
                ((Component) value).setForeground(UIManager.getColor("Panel.foreground"));
                ((Component) value).setBackground(UIManager.getColor("Panel.background"));
            }

            return ((Component) value);
        }
        else
        {
            return new DefaultTableCellRenderer().getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        }
    }
}

メインフォームには次のコードがあります:

DefaultTableModel model = new DefaultTableModel();
        model.addColumn(null, new Object[]
                {
                    jPanel1, jPanel2, jPanel1, jPanel2, jPanel1, jPanel2, jPanel1, jPanel2, jPanel1, jPanel2, jPanel1
                });
        jTable1.setModel(model);
        TableColumn column = jTable1.getColumnModel().getColumn(0);
        column.setCellRenderer(new PanelTableCellRenderer());
        column.setCellEditor(new PanelTableCellEditor());
        jTable1.setRowHeight(50);
        jTable1.setTableHeader(null);
        jScrollPane2.setColumnHeaderView(null);
4

1 に答える 1

1

ここには 2 つの問題があります。

*配置された AWT/SWING コンポーネントの重複は厳禁です。*

1) パネルに同じコンポーネントを 2 回追加すると、問題が発生します。Swing は、同じコンポーネントが異なる場所に存在することを好みません。つまり、GUI の状態、描画解除などはすべて、1 つのコンポーネント (1 つの場所) のモデルに基づいています。私は過去にあなたと同様の問題を抱えていました。コンポーネントが複数回追加されたために空白になった...

変数がありませんか?

2) 変数 jPanel1/jPanel2 がコードのどこにも定義されていません。これは実際のコードでは問題ではないと思いますが、--- したがって、これらの定義を表示すると、他の問題が発生する可能性があります。

于 2011-11-24T15:27:18.583 に答える