Hallo,
ich habe eine JTable geschrieben, der die Daten in einem Vector mit den Objekten vom Typ MyEntry speichert.
MyEntry beinhaltet Werte wie z.B. ID, Titel, Hersteller, etc.
Ich habe dazu einen CellRenderer geschrieben, der aus dem MyEntry-Objekt Titel und ID ausliest und in einem 2-zeiligen JLabel zurückgibt. Dabei habe ich die Zeilenhöhe mit
angepasst.
Der CellEditor ist ein JPanel, wlches mehrere JTextField zum Bearbeiten enthält. Auch da wollte ich die Zellenhöhe mit dem obigen Code an die Größe des JPanel anpassen.
Die Probleme dabei:
Wenn ich eine Zelle editieren will, scheint Java erst den CellEditor auszuführen (Zellen wird größer) und anschließend gleich den CellRenderer drüberzulegen. Das kann ich beheben, in dem ich entweder im Editor oder Renderer die Zellen in der Höhe nicht anpasse. Dabei ist die Zelle nach dem editieren allerdings zu groß bzw. zu klein.
Wie kann ich das Problem lösen?
Code des CellRenderers
Code des CellEditors
ich habe eine JTable geschrieben, der die Daten in einem Vector mit den Objekten vom Typ MyEntry speichert.
MyEntry beinhaltet Werte wie z.B. ID, Titel, Hersteller, etc.
Ich habe dazu einen CellRenderer geschrieben, der aus dem MyEntry-Objekt Titel und ID ausliest und in einem 2-zeiligen JLabel zurückgibt. Dabei habe ich die Zeilenhöhe mit
Code:
int labelHeight = (int) this.getMinimumSize().getHeight();
int tableRowHeight = table.getRowHeight(row);
if (labelHeight != tableRowHeight) {
table.setRowHeight(row, labelHeight);
}
Der CellEditor ist ein JPanel, wlches mehrere JTextField zum Bearbeiten enthält. Auch da wollte ich die Zellenhöhe mit dem obigen Code an die Größe des JPanel anpassen.
Die Probleme dabei:
Wenn ich eine Zelle editieren will, scheint Java erst den CellEditor auszuführen (Zellen wird größer) und anschließend gleich den CellRenderer drüberzulegen. Das kann ich beheben, in dem ich entweder im Editor oder Renderer die Zellen in der Höhe nicht anpasse. Dabei ist die Zelle nach dem editieren allerdings zu groß bzw. zu klein.
Wie kann ich das Problem lösen?
Code des CellRenderers
Code:
package de.cybercosmos.JStocktaking;
import java.awt.Component;
import java.io.File;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.table.TableCellRenderer;
import javax.swing.text.View;
import de.cybercosmos.Utils.EntryConstants;
import de.cybercosmos.Utils.EntryItem;
public class EntryJTableCellRenderer extends JLabel implements TableCellRenderer {
private Border unselectedBorder = null;
private Border selectedBorder = null;
private boolean isBordered = true;
public EntryJTableCellRenderer() {
this.setOpaque(true);
this.setVerticalTextPosition(TOP);
this.setHorizontalTextPosition(RIGHT);
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (isSelected) {
setForeground(table.getSelectionForeground());
setBackground(table.getSelectionBackground());
} else {
setForeground(table.getForeground());
setBackground(table.getBackground());
}
this.setFont(table.getFont());
if (hasFocus) {
setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
if (table.isCellEditable(row, column)) {
setForeground(table.getSelectionForeground());
setBackground(table.getSelectionBackground());
}
} else {
setBorder(new EmptyBorder(1, 1, 1, 2));
}
this.setText("<html><body><span style=\"color:gray; width:100px\">"
+ ((EntryItem) value).getID()) + "</span>
" + ((EntryItem) value.getTitle())
+ "</body></html>");
int labelHeight = (int) this.getMinimumSize().getHeight();
int tableRowHeight = table.getRowHeight(row);
if (labelHeight != tableRowHeight) {
table.setRowHeight(row, labelHeight);
}
return this;
}
}
Code des CellEditors
Code:
public class EntryJTableCellEditor extends AbstractCellEditor implements TableCellEditor {
private EntryItem currentEntry;
private JPanel contentPanel;
public EntryJTableCellEditor() {
this.contentPanel = new JPanel();
this.contentPanel.add(new JTextField());
// etc.
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
this.currentEntry = (EntryItem) value;
int preferredHeight = (int) this.contentPanel.getMinimumSize().getHeight();
int tableRowHeight = table.getRowHeight(row);
if (preferredHeight != tableRowHeight) {
table.setRowHeight(row, preferredHeight);
}
return this.contentPanel;
}
public Object getCellEditorValue() {
return this.currentEntry;
}
}