Hallo Java-Gemeinde,
Ich habe (mal wieder) ein (kleines) Problem(chen) mit der JTable. Ich habe einen eigenen CellRenderer und einen eigenen CellEditor geschrieben. Um in einer DVD-Liste die Bewertung der DVDs anzugeben, füge ich 5 Buttons auf ein Panel hinzu, was ich dann in der Tabelle anzeigen lasse.
Mein Problem ist jetzt, dass sich die Tabelle vollständig aufhängt, wenn ich in der Spalte mit dem JPanel nicht auf die Buttons (die in Form von sternchen angezeigt werden) sondern daneben in das leere JPanel klicke.
Hier meine Sources:
Fall es noch wen interessiert: die Tabelle selbst:
Vielen Dank noch an die Leute, die wirklich versuchen mit zu helfen und sich das ganze durchlesen. Ich bin euch was schuldig
Erwartungsvoll,
pausch
Ich habe (mal wieder) ein (kleines) Problem(chen) mit der JTable. Ich habe einen eigenen CellRenderer und einen eigenen CellEditor geschrieben. Um in einer DVD-Liste die Bewertung der DVDs anzugeben, füge ich 5 Buttons auf ein Panel hinzu, was ich dann in der Tabelle anzeigen lasse.
Mein Problem ist jetzt, dass sich die Tabelle vollständig aufhängt, wenn ich in der Spalte mit dem JPanel nicht auf die Buttons (die in Form von sternchen angezeigt werden) sondern daneben in das leere JPanel klicke.
Hier meine Sources:
Java:
package de.schaefer.mediaManagement.ui.dvd.tabelle;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.EventObject;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.table.TableCellEditor;
import org.apache.log4j.Logger;
import de.schaefer.mediaManagement.control.viewcontroller.UebersichtController;
import de.schaefer.mediaManagement.entity.DVD;
import de.schaefer.mediaManagement.ui.general.SternButton;
public class BewertungCellEditor extends JPanel implements TableCellEditor {
/**
*
*/
private static final long serialVersionUID = -544094778335209879L;
private CellEditorListener cel;
private SternButton[] sterne = new SternButton[5];
private int bewertung;
private UebersichtController ue;
private static final Logger logger = Logger
.getLogger(BewertungCellEditor.class);
public BewertungCellEditor(UebersichtController ue) {
this.ue = ue;
}
@Override
public void addCellEditorListener(CellEditorListener arg0) {
cel = arg0;
}
@Override
public void cancelCellEditing() {
cel.editingCanceled(new ChangeEvent(""));
}
@Override
public Object getCellEditorValue() {
return bewertung;
}
@Override
public boolean isCellEditable(EventObject arg0) {
return true;
}
@Override
public void removeCellEditorListener(CellEditorListener arg0) {
}
@Override
public boolean shouldSelectCell(EventObject arg0) {
return false;
}
@Override
public boolean stopCellEditing() {
return false;
}
@Override
public Component getTableCellEditorComponent(final JTable table,
Object value, final boolean isSelected, final int row,
final int column) {
final int val;
if (value instanceof String) {
val = Integer.parseInt(value.toString());
logger.debug("String inputted, Integer parsed");
} else if (value instanceof Integer) {
val = (Integer) value;
logger.debug("Integer " + val + " inputted");
} else {
val = -1;
logger.debug("Wrong value!");
}
if (val <= 5 && val > 0) {
removeAll();
setBackground(Color.white);
setAlignmentY(CENTER_ALIGNMENT);
bewertung = val;
for (int i = 0; i < 5; i++) {
if (i < val)
sterne[i] = new SternButton(i + 1, true);
else
sterne[i] = new SternButton(i + 1, false);
final int tmp = i;
sterne[i].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
getTableCellEditorComponent(table, sterne[tmp].getNr(),
isSelected, row, column);
bewertung = sterne[tmp].getNr();
DVD dvd = ue.getDVDArray()[row];
dvd.setBewertung(sterne[tmp].getNr());
ue.updateDVD(dvd);
cel.editingStopped(new ChangeEvent(sterne[tmp].getNr()));
}
});
sterne[i].setPreferredSize(new Dimension(20, 20));
this.add(sterne[i]);
}
return this;
}
return this;
}
}
Java:
package de.schaefer.mediaManagement.ui.dvd.tabelle;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
import de.schaefer.mediaManagement.ui.general.SternButton;
public class BewertungTableCellRenderer extends JPanel implements
TableCellRenderer {
/**
*
*/
private static final long serialVersionUID = -7417093007447000853L;
SternButton[] sterne = new SternButton[5];
@Override
public Component getTableCellRendererComponent(final JTable table,
Object value, final boolean isSelected, final boolean hasFocus,
final int row, final int column) {
final int val;
if (value instanceof String) {
val = Integer.parseInt(value.toString());
} else if (value instanceof Integer) {
val = (Integer) value;
} else {
val = -1;
}
if (val <= 5 && val > 0) {
removeAll();
setBackground(Color.white);
setAlignmentY(CENTER_ALIGNMENT);
int i = 0;
for (; i < 5; i++) {
if (i < val)
sterne[i] = new SternButton(i + 1, true);
else
sterne[i] = new SternButton(i + 1, false);
sterne[i].setPreferredSize(new Dimension(20, 20));
this.add(sterne[i]);
}
} if(isSelected || hasFocus){
setBackground(Color.LIGHT_GRAY);
}
return this;
}
}
Fall es noch wen interessiert: die Tabelle selbst:
Java:
package de.schaefer.mediaManagement.ui.general;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import org.apache.log4j.Logger;
import de.schaefer.mediaManagement.control.viewcontroller.UebersichtController;
import de.schaefer.mediaManagement.entity.DVD;
import de.schaefer.mediaManagement.ui.dvd.tabelle.BewertungCellEditor;
import de.schaefer.mediaManagement.ui.dvd.tabelle.BewertungTableCellRenderer;
import de.schaefer.mediaManagement.ui.dvd.tabelle.DVDTableCellRenderer;
import de.schaefer.mediaManagement.ui.dvd.tabelle.DefaultListCellRenderer;
import de.schaefer.mediaManagement.ui.dvd.tabelle.IntegerTableCellEditor;
import de.schaefer.mediaManagement.ui.dvd.tabelle.StaticTextFieldCellEditor;
public class UebersichtView extends GeneralPanel {
/**
*
*/
private static final long serialVersionUID = -254332573885369969L;
private static final Logger logger = Logger.getLogger(UebersichtView.class);
private JTable uebersichtTable;
private DefaultTableModel model;
private TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>();
UebersichtController uc;
public UebersichtView(UebersichtController uc) {
super();
this.uc = uc;
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(10, 0, 10, 0);
gbc.fill = GridBagConstraints.BOTH;
uebersichtTable = new JTable();
uebersichtTable.setModel(getFilledTableModel());
uebersichtTable.setRowHeight(40);
uebersichtTable.setRowSorter(sorter);
sorter.setModel(model);
setBewertungsColumnUtils();
setTitelColumnUtils();
setDauerColumnUtils();
setJahrColumnUtils();
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 2;
gbc.weighty = 2;
gbc.insets = new Insets(50, 50, 50, 50);
add(new JScrollPane(uebersichtTable), gbc);
repaint();
}
private DefaultTableModel getFilledTableModel() {
DVD[] dvds = uc.getDVDArray();
Object[][] rowData = new Object[dvds.length][4];
for (int i = 0; i < rowData.length; i++) {
rowData[i][0] = dvds[i];
rowData[i][1] = new Integer(dvds[i].getBewertung());
rowData[i][2] = new Integer(dvds[i].getDauer());
rowData[i][3] = new Integer(dvds[i].getJahr());
}
String[] columns = { "Titel", "Bewertung", "Dauer", "Jahr" };
return model = new DefaultTableModel(rowData, columns);
}
private void setTitelColumnUtils() {
TableColumn titelColumn = uebersichtTable.getColumn("Titel");
titelColumn.setCellRenderer(new DVDTableCellRenderer());
titelColumn.setCellEditor(new StaticTextFieldCellEditor(new JTextField()));
}
private void setBewertungsColumnUtils() {
TableColumn bewertungsColumn = uebersichtTable.getColumn("Bewertung");
BewertungCellEditor dvdBewertungEditor = new BewertungCellEditor(uc);
bewertungsColumn.setCellEditor(dvdBewertungEditor);
bewertungsColumn.setCellRenderer(new BewertungTableCellRenderer());
bewertungsColumn.setWidth(90);
}
private void setDauerColumnUtils() {
TableColumn dauerColumn = uebersichtTable.getColumn("Dauer");
dauerColumn.setCellRenderer(new DefaultListCellRenderer());
dauerColumn.setCellEditor(new IntegerTableCellEditor());
}
private void setJahrColumnUtils() {
TableColumn jahrColumn = uebersichtTable.getColumn("Jahr");
jahrColumn.setCellRenderer(new DefaultListCellRenderer());
jahrColumn.setCellEditor(new StaticTextFieldCellEditor(new JTextField()));
}
@Override
public GeneralPanel getParentView() {
return uc.getParentView();
}
}
Vielen Dank noch an die Leute, die wirklich versuchen mit zu helfen und sich das ganze durchlesen. Ich bin euch was schuldig
Erwartungsvoll,
pausch