Domanda

Sto cercando di rendere un riga specifica del mio JTable (dovrebbe avere un colore di sfondo diverso e dovrebbe avere caratteri in grassetto).

ho trovato diverse domande su come implementare un TableCellRenderer personalizzato ( qui e qui ) e il tutorial come usare le tabelle e questo ( Table Row Rendering ).

Io sto usando un JInternalFrame per visualizzare il JTable. Ho cercato di realizzare entrambe le soluzioni ma né getCellRendererprepareRenderer sono chiamati. Quando il debug, posso vedere il mio nuovo essere JTable creato, ma, il mio punto di interruzione all'interno dei metodi non sono chiamati.

I miei sguardi codice come:

this.add(createData(model));

private JComponent createData(ProfitLossTableModel model) {
    JTable table = new JTable(model) {

        public TableCellRenderer getCellRenderer(int row, int column) {
            if ((row == 0) && (column == 0)) {
                DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
                renderer.setHorizontalAlignment(JLabel.RIGHT);
                renderer.setBackground(Color.red);
                return renderer;
            } else {
                return super.getCellRenderer(row, column);
            }
        }
    };

    table.setPreferredScrollableViewportSize(table.getPreferredSize());
    table.changeSelection(0, 0, false, false);
    table.setAutoCreateRowSorter(true);
    return new JScrollPane(table);
}

Come si può vedere, il modello è la mia implementazione di un AbstractTableModel.

Certo che mi manca qualcosa. Ho provato a chiamare repaint() per vedere se qualcosa è successo, ma venne in mente nulla.

Ho anche provato a mettere un JPane dentro la mia JInternalFrame e aggiungerli alla JScrollPane in esso, ma nulla si è verificato anche.

Qualsiasi aiuto?

TIA,

Bob

È stato utile?

Soluzione

Come discusso nel Concetti: Editor e Renderers , "il tavolo richiama il metodo getColumnClass del modello da tavolo, che ottiene il tipo di dati delle celle della colonna". È necessario verificare che l'implementazione di AbstractTableModel restituisce un valore adeguato, come suggerito in questo esempio .

Addendum:

  

Sto cercando di rendere una riga, non una colonna.

Rob Camick è Tabella Row Rendering approccio che le sostituzioni prepareRenderer() sembra proposito.

tabbedPane.addTab("FirstRow", createFirstRow(model));
...
private JComponent createFirstRow(DefaultTableModel model) {

    final Font font = new Font("Serif", Font.BOLD, 14);

    JTable table = new JTable(model) {

        public Component prepareRenderer(
                TableCellRenderer renderer, int row, int column) {
            Component c = super.prepareRenderer(renderer, row, column);
            if (!isRowSelected(row)) {
                c.setBackground(row == 0 ? Color.yellow: getBackground());
                c.setFont(row == 0 ? font : getFont());
            }
            return c;
        }
    };

    table.setPreferredScrollableViewportSize(table.getPreferredSize());
    table.changeSelection(1, 1, false, false);
    return new JScrollPane(table);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top