3

取り除けない問題があります。

ご存知のとおり、私はJTablesの使用にかなり慣れていないので、答えは簡単かもしれませんが、解決策を見つけることができません:/

したがって、AbstractTableModelを使用するJTableがあります。これは、

    public Class<?> getColumnClass(int columnIndex_p) 

メソッド、表示する各列のタイプを指定します。それらの1つはブール値です。

単純なJTableを作成する場合、

    table_l = new JTable(new MyTableModel());

すべてが正常であり、ブール値はチェックボックス(オン/オフ)を使用して正しく表示されます。

ここで、テキストを各セルの中央に配置したいと思います(そして、おそらく後でさらに多くのオプションを使用します)。

したがって、次のように、列ごとに新しいDefaultTableCellRendererを定義します。

    DefaultTableCellRenderer cellRenderer_l = new DefaultTableCellRenderer() {
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
          // delegate the rendering part to the default renderer (am i right ???)
          Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
          return comp;
        }
    }

次に、このCellRenderの水平方向の配置を次のように設定します。

    cellRenderer_l.setHorizontalAlignment(JLabel.CENTER);

次に、この新しいCellRendererをJTableの各列にインストールします。

    for (int i = 0; i < table_l.getColumnCount(); ++i) {
        table_l.getColumnModel().getColumn(i).setCellRenderer(cellRenderer_l);
    }

ただし、新しいCellRendererでは、表示されるJTableはTableModelのgetColumnClass()メソッドを使用しなくなったため、ブール値に「true/false」文字列を表示するだけです。

以前のようにgetColumnClass()を使用する方法がわかりません。

誰かが答えを持っているなら...ありがとう

編集:あなたが行ったすべての説明に感謝します。実際、私の本当の質問は、「JTableのすべてのDefaultRendererに影響を与えて、結果をJTableのセルの中央に配置する方法」でした。

4

2 に答える 2

5

ここに示すように、デフォルトのセルレンダラーは、タイプの値に対してすでにこれを実行しています。これだけでは不十分な場合は、質問を編集して、発生した問題を示すsscceを含めてください。Boolean.class

補遺:をさらにカスタマイズする必要がある場合は、ここに示すように、をDefaultTableCellRenderer使用して適切なタイプのレンダラーを指定します。setDefaultRenderer()

table.setDefaultRenderer(Boolean.class, yourCellRenderer); 

画像

于 2013-02-08T10:02:44.743 に答える
2

すべてのレンダリングコンポーネントに同じ視覚的装飾を適用するために(それが本当に必要な場合は、注意してください。使い勝手が悪くなる可能性があります!)、JTableのpreparedRendererメソッドをオーバーライドできます。

@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
    Component comp = super.prepareRenderer(...);
    if (comp instanceof JLabel) {
        ((JLabel) comp).setHorizontalAlignment(...);
    }
    return comp;
}

ところで:このアプローチは、アプリケーションのニーズに合わせてJSomethingをサブクラス化しないという規則に違反しています。視覚的に装飾するレンダリングコンポーネントを正式にサポートするSwingXの使用を検討することもできます。したがって、サブクラス化する代わりに、蛍光ペンをテーブルに登録します。

JXTable table = ...
table.addHighlighter(new AlignmentHighlighter(CENTER), HighlightPredicate.ALWAYS);   
于 2013-02-08T10:59:50.790 に答える