Hallo =). Ich melde mich schonwieder ..
So richtig zufrieden bin ich zwar mit dem JWindow aus meinem vorherigen Thread noch nicht, aber mal zu was anderem = ).
Ich habe eine JTable, die ich mit comboboxen und Strings versehen habe und die auf MouseReleased Events Änderungen am TableModel vornimmt. Wenn ich dann aber in der überschriebenen setValueAt(..) methode ein fireTableCellUpdated(row, column) ausführe, wird nicht die entsprechende Zelle neu gezeichnet, sondern die gesamte Tabelle.
Wenn ich also nur vereinzelte Updates habe, oder Tabellenspalten ohnehin gleich bleiben, möchte ich ja nicht die gesamte Tabelle neu zeichnen. Vielleicht habe ich einen Fehler gemacht - daher hier der Quellcode für den Renderer, das Model und die JTable.
So richtig zufrieden bin ich zwar mit dem JWindow aus meinem vorherigen Thread noch nicht, aber mal zu was anderem = ).
Ich habe eine JTable, die ich mit comboboxen und Strings versehen habe und die auf MouseReleased Events Änderungen am TableModel vornimmt. Wenn ich dann aber in der überschriebenen setValueAt(..) methode ein fireTableCellUpdated(row, column) ausführe, wird nicht die entsprechende Zelle neu gezeichnet, sondern die gesamte Tabelle.
Wenn ich also nur vereinzelte Updates habe, oder Tabellenspalten ohnehin gleich bleiben, möchte ich ja nicht die gesamte Tabelle neu zeichnen. Vielleicht habe ich einen Fehler gemacht - daher hier der Quellcode für den Renderer, das Model und die JTable.
Java:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package UI.Tables;
import AppletMain.DefaultResources;
import AppletMain.DefaultResources.DEFAULT_COLORSET;
import AppletMain.Enumarations.OPTIONS;
import MapDrawing.SailingPainter;
import UI.Utility.CustomCheckBox;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JLabel;
import javax.swing.JSeparator;
import javax.swing.JTable;
import javax.swing.border.EmptyBorder;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
class JTableOptionsRenderer implements TableCellRenderer {
private JLabel textLabel = new JLabel();
private CustomCheckBox cBox = CustomCheckBox.createCustomCheckBox();
private JSeparator sep = new JSeparator(JSeparator.HORIZONTAL);
public JTableOptionsRenderer() {
textLabel.setFont(DefaultResources.getFont(DefaultResources.FONT.META_DATA));
textLabel.setForeground(DefaultResources.getDefaultColor(DefaultResources.DEFAULT_COLORSET.DATA_COLOR));
textLabel.setBackground(DefaultResources.getDefaultColor(DefaultResources.DEFAULT_COLORSET.TOGGLE_COLOR_FIRST));
textLabel.setOpaque(true);
textLabel.setBorder(new EmptyBorder(3, 0, 0, 0));
cBox.setBackground(DefaultResources.getDefaultColor(DefaultResources.DEFAULT_COLORSET.TOGGLE_COLOR_FIRST));
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (value instanceof Boolean) {
cBox.setSelected((Boolean) value);
return cBox;
} else if (value instanceof OPTIONS){
textLabel.setText(((OPTIONS) value).toString());
return textLabel;
}
else{
return sep;
}
}
}
/**
*
* @author lueder.j
*/
class OptionsTableModel extends AbstractTableModel {
private Object[][] rows = new Object[OPTIONS.values().length][2];
private String[] columns = {"checkbox", "Definition"};
public OptionsTableModel() {
initRows();
}
private void initRows() {
for (int i = 0; i < OPTIONS.values().length; i++) {
if (OPTIONS.values()[i] == OPTIONS.NONE) {
rows[i][0] = "";
rows[i][1] = "";
} else {
if (i == 0) {
rows[i][0] = true;
} else {
rows[i][0] = false;
}
rows[i][1] = OPTIONS.values()[i];
}
}
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return rows[rowIndex][columnIndex];
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
rows[rowIndex][columnIndex] = aValue;
fireTableCellUpdated(rowIndex, columnIndex);
}
@Override
public int getRowCount() {
return rows.length;
}
@Override
public int getColumnCount() {
return columns.length;
}
@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
}
public class OptionsTable extends JTable {
private OPTIONS activeMainOption = OPTIONS.SHOW_SAILNUMBERS;
private int rowActive = 0;
public OptionsTable() {
setModel(new OptionsTableModel());
setDoubleBuffered(true);
setVisible(true);
setDefaultRenderer(Boolean.class, new JTableOptionsRenderer());
setDefaultRenderer(OPTIONS.class, new JTableOptionsRenderer());
setDefaultRenderer(String.class, new JTableOptionsRenderer());
setTableHeader(null);
setGridColor(DefaultResources.getDefaultColor(DEFAULT_COLORSET.BORDER_COLOR));
setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
setShowHorizontalLines(true);
setIntercellSpacing(new Dimension(0, 1));
getColumnModel().getColumn(0).setPreferredWidth(20);
getColumnModel().getColumn(1).setPreferredWidth(120);
setRowHeight(MenuContainer.lineHeight + MenuContainer.lineBorderThickness * 2);
setRowHeight(6, 2); // Set the height for the empty Row, which is used for the seperator and does match with the NONE value of the OPTIONS Enumration
this.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
int row = rowAtPoint(e.getPoint());
int column = columnAtPoint(e.getPoint());
OPTIONS command = (OPTIONS) getModel().getValueAt(row, 1);
if (getModel().getColumnClass(column) == Boolean.class) {
if (((Boolean) getModel().getValueAt(row, column)) == false) {
getModel().setValueAt(true, row, column);
if (command == OPTIONS.SHOW_PATH) {
SailingPainter.showPath = true;
} else if (command == OPTIONS.SHOW_TAIL) {
SailingPainter.showTails = true;
} else {
if (command != activeMainOption) {
getModel().setValueAt(false, rowActive, 0);
}
SailingPainter.option = command;
activeMainOption = command;
rowActive = row;
}
} else {
if (command == OPTIONS.SHOW_PATH) {
SailingPainter.showPath = false;
} else if (command == OPTIONS.SHOW_TAIL) {
SailingPainter.showTails = false;
} else {
SailingPainter.option = OPTIONS.NONE;
}
getModel().setValueAt(false, row, 0);
}
}
}
});
}
}