2

このコードのおかげで、色を素敵に変えるJTableがあります。

table.setDefaultRenderer(Object.class, new BorderRenderer(new ColorRenderer(table
                .getDefaultRenderer(Object.class), colorProvider)));

(ここで、「colorProvider」には、1行おきに明るい灰色に変わるコードが含まれています。)テキストを中央に揃えたい列が1つあります。その列に中央の水平方向の配置でDefaultCellRendererを設定すると、テーブルのデフォルトのレンダラーが上書きされ、素敵なストライプが失われます。

ストライプを保持したまま、列の配置を変更できますか?

さらに複雑にするために、私はスーパークラスに上記のコードを持っています。アラインメントを変更したい列を知っているのは私のサブクラスです。

4

4 に答える 4

2

ストライプを保持したまま、列の配置を変更できますか?

より簡単なアプローチは、テーブル行レンダリングを使用することです。次に、行の色に影響を与えることなく、個々のレンダラーの配置をカスタマイズできます。

DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment( JLabel.CENTER );
table.getColumnModel().getColumn(???).setCellRenderer( centerRenderer );
于 2010-11-05T03:41:29.170 に答える
1

この方法を使用すると、ヘッダーとテーブルの両方のコンテンツが中央揃えになります。ただし、CENTERをLEFTまたはRIGHTの配置に変更できます。

    public void setTableAlignment(JTable table){
    // table header alignment
    JTableHeader header = table.getTableHeader();
    DefaultTableCellRenderer renderer = (DefaultTableCellRenderer)table.getTableHeader().getDefaultRenderer();
    header.setDefaultRenderer(renderer);
    renderer.setHorizontalAlignment(JLabel.CENTER);

   // table content alignment
   DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
   centerRenderer.setHorizontalAlignment( JLabel.CENTER );
   int rowNumber = table.getColumnCount();
   for(int i = 0; i < rowNumber; i++){
   table.getColumnModel().getColumn(i).setCellRenderer( centerRenderer );
   }
   }
于 2013-02-24T19:16:04.657 に答える
1

スーパークラスのコードで設定されているデフォルトの更新機能に配置を設定しようとすると、すべてのセルに影響します。BorderRendererあなたが持っているオプションは、またはColorRenderer (どちらか適切な方)の新しいサブクラスを作成し、その中getTableCellRendererComponentで呼び出しから返された値を取得し、戻るsuper.getTableCellRendererComponent前にその値にアライメントを設定することです。次に、整列する必要のある列に対して、そのレンダラーのインスタンスを設定できます。

于 2010-11-05T02:33:45.490 に答える
1

TableCellRendererWrapperを作成するという最終決定に導いてくれたafkとcamickrの両方に感謝します。

public class ColumnAlignmentRenderer implements TableCellRenderer {

    private TableCellRenderer mWrappedRenderer;
    private int mDefaultAlignment = SwingConstants.LEFT;
    private Map<Integer, Integer> mSpecialColumnAlignmentMap = new Hashtable<Integer, Integer>();

    public ColumnAlignmentRenderer(TableCellRenderer pWrappedRenderer) {
        mWrappedRenderer = pWrappedRenderer;
    }

    public Component getTableCellRendererComponent(JTable pTable, Object pValue, boolean pIsSelected,
            boolean pHasFocus, int pRow, int pColumn) {

        // Use the wrapped renderer
        Component renderedComponent = mWrappedRenderer.getTableCellRendererComponent(pTable, pValue, pIsSelected, pHasFocus,
                pRow, pColumn);

        // Set the alignment
        Integer alignment = mSpecialColumnAlignmentMap.get(pColumn);
        if (alignment != null) {
            ((JLabel)renderedComponent).setHorizontalAlignment(alignment);
        } else {
            ((JLabel)renderedComponent).setHorizontalAlignment(mDefaultAlignment);
        }

        return renderedComponent;
    }

    public void setSpecialColumnAlignment(Integer pColumn, Integer pAlignment) {
        mSpecialColumnAlignmentMap.put(pColumn, pAlignment);
    }

    public void setDefaultAlignment(int pAlignment) {
        mDefaultAlignment = pAlignment;
    }
}

それは完璧ではありませんが、それは私のために仕事を成し遂げます。それを使用するには、これを行います:

        // Center alignment for "selected" column
        ColumnAlignmentRenderer cellRenderer = new ColumnAlignmentRenderer(getTable().getDefaultRenderer(Object.class));
        cellRenderer.setSpecialColumnAlignment(MyTableModel.COL_TO_CENTER, SwingConstants.CENTER);
        getTable().setDefaultRenderer(Object.class, cellRenderer);

        // Center alignmet for "selected" column header
        ColumnAlignmentRenderer headerRenderer = new ColumnAlignmentRenderer(getTable().getTableHeader().getDefaultRenderer());
        headerRenderer.setSpecialColumnAlignment(MyTableModel.COL_TO_CENTER, SwingConstants.CENTER);
        getTable().getTableHeader().setDefaultRenderer(headerRenderer);
于 2010-11-05T17:55:53.217 に答える