Ich baue gerade eine kleine JTable, und möchte die Spaltenüberschrift markieren (und Zeilenköpfe - der Zeile-Header-Teil funktioniert tatsächlich), wenn eine Zelle ausgewählt ist, um es einfacher zu machen finde die assoziierten Namen mit dieser Zelle. Hier ist ein Bild:Hervorhebung einer Spaltenüberschrift einer JTable
ich bereits versucht, den Renderer für den Header mit diesem Schalt aus:
table.getTableHeader().setDefaultRenderer(new ColumnHeaderRenderer());
Aber es heißt nur, wenn ich auf dem Header klicken und sagt immer isSelected falsch ist .
Dies ist der Code i für die Zeilennamen verwenden, einschließlich der Highlight innerhalb des Renderers - Code ist nicht von mir, ich habe es nur ein wenig geändert:
/*
* Use a JTable as a renderer for row numbers of a given main table.
* This table must be added to the row header of the scrollpane that
* contains the main table.
*/
public class RowNameTable extends JTable
implements ChangeListener, PropertyChangeListener {
private JTable main;
public RowNameTable(JTable table) {
main = table;
main.addPropertyChangeListener(this);
setFocusable(false);
setAutoCreateColumnsFromModel(false);
setModel(main.getModel());
setSelectionModel(main.getSelectionModel());
TableColumn column = new TableColumn();
column.setHeaderValue(" ");
addColumn(column);
column.setCellRenderer(new RowNameRenderer(main));
getColumnModel().getColumn(0).setPreferredWidth(table.getColumnModel().getColumn(0).getPreferredWidth());
setPreferredScrollableViewportSize(getPreferredSize());
}
@Override
public void addNotify() {
super.addNotify();
Component c = getParent();
// Keep scrolling of the row table in sync with the main table.
if (c instanceof JViewport) {
JViewport viewport = (JViewport) c;
viewport.addChangeListener(this);
}
}
/*
* Delegate method to main table
*/
@Override
public int getRowCount() {
return main.getRowCount();
}
@Override
public int getRowHeight(int row) {
return main.getRowHeight(row);
}
/*
* This table does not use any data from the main TableModel,
* so just return a value based on the row parameter.
*/
@Override
public Object getValueAt(int row, int column) {
return Integer.toString(row + 1);
}
/*
* Don't edit data in the main TableModel by mistake
*/
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
//
// Implement the ChangeListener
//
public void stateChanged(ChangeEvent e) {
// Keep the scrolling of the row table in sync with main table
JViewport viewport = (JViewport) e.getSource();
JScrollPane scrollPane = (JScrollPane) viewport.getParent();
scrollPane.getVerticalScrollBar().setValue(viewport.getViewPosition().y);
}
//
// Implement the PropertyChangeListener
//
public void propertyChange(PropertyChangeEvent e) {
// Keep the row table in sync with the main table
if ("selectionModel".equals(e.getPropertyName())) {
setSelectionModel(main.getSelectionModel());
}
if ("model".equals(e.getPropertyName())) {
setModel(main.getModel());
}
}
/*
* Borrow the renderer from JDK1.4.2 table header
*/
private static class RowNameRenderer extends DefaultTableCellRenderer {
private JTable main;
public RowNameRenderer(JTable main) {
this.main = main;
setHorizontalAlignment(JLabel.CENTER);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (table != null) {
JTableHeader header = table.getTableHeader();
if (header != null) {
setForeground(header.getForeground());
setBackground(header.getBackground());
setFont(header.getFont());
}
}
if (isSelected) {
setFont(getFont().deriveFont(Font.BOLD));
}
setText((value == null) ? "" : main.getColumnName(row));
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
return this;
}
}
}
Und hier haben wir den entsprechenden Teil erstellen Sie die Tabelle:
costTableModel = new CostTableModel(costCalc);
table = new JTable(costTableModel);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.setCellSelectionEnabled(true);
scrollPane = new JScrollPane(table);
RowNameTable nameTable = new RowNameTable(table);
scrollPane.setRowHeaderView(nameTable);
Und die Klasse costTableModel, nur für Vollständigkeit halber:
public class CostTableModel extends AbstractTableModel {
private CostCalculator costCalc;
public CostTableModel(CostCalculator costCalc) {
this.costCalc = costCalc;
}
@Override
public int getRowCount() {
return costCalc.getPersonsList().size();
}
@Override
public int getColumnCount() {
return costCalc.getPersonsList().size();
}
@Override
public String getColumnName(int col) {
return costCalc.getPersonsList().get(col).getName();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Person debtor = costCalc.getPersonsList().get(rowIndex);
Person debtee = costCalc.getPersonsList().get(columnIndex);
return costCalc.getAmountOwed(debtor, debtee);
}
@Override
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
}
Vielen Dank für Ihre Hilfe im Voraus!
Zunächst einmal danke! Das sieht ziemlich genau so aus, wie ich es brauche, ich habe momentan keine Zeit es in meinen Code zu implementieren, aber ich werde es heute Abend tun und hier berichten. – wlfbck
Okay, ich baue es jetzt ein! Es funktioniert perfekt, bis auf eine kleine Sache (markieren mehrere Spaltenüberschriften), aber ich werde versuchen, das herauszufinden und lernen Sie mehr über JTables :) – wlfbck
hmm ... verstehe nicht, wie die Auswahl _row_ hören hilft beim Neuzeichnen bei _column_ Auswahländerungen. Eigentlich nicht: Markieren Sie eine Zelle und verschieben Sie die Auswahl in die gleiche Zeile. Die Hervorhebung der Spalte wird nicht aktualisiert. – kleopatra