Hallo!
Ich hab da ne Frage zu Tables und zwar sieht meine Tabelle so aus:
Die Headers, die zu sehn sind (Mitarbeit 1, Mitarbeit 2, Mitarbeit 3,...) habe ich selsbt gezeichnet und jedesmal wenn ein neuer Header hinzugefügt wird, sieht die Tabelle so aus:
Woran kann das liegen?
Hier ist der Code, wo die Headers in die Tabelle hinzugefügt werden:
Ich hab da ne Frage zu Tables und zwar sieht meine Tabelle so aus:

Die Headers, die zu sehn sind (Mitarbeit 1, Mitarbeit 2, Mitarbeit 3,...) habe ich selsbt gezeichnet und jedesmal wenn ein neuer Header hinzugefügt wird, sieht die Tabelle so aus:

Woran kann das liegen?
Hier ist der Code, wo die Headers in die Tabelle hinzugefügt werden:
Code:
package stephancejka.thmarks.view;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.text.DecimalFormat;
import javax.swing.AbstractButton;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JRadioButton;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.event.TableModelEvent;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;
import javax.swing.text.JTextComponent;
import eke.thmarks.table.model.NotenTableModel;
import stephancejka.concomp.VerticalLabelUI;
import stephancejka.thmarks.management.SubjectSaver;
class MarksTable
extends JTable {
private MarksTable(TableModel model) {
super(model);
MarksTableHeader header = new MarksTableHeader();
getTableHeader().setDefaultRenderer(header);
getTableHeader().setPreferredSize(new Dimension(0, 200));
getTableHeader().setReorderingAllowed(false);
getTableHeader().addMouseListener(header);
}
public void tableChanged(TableModelEvent e) {
super.tableChanged(e);
if (e.getFirstRow() == TableModelEvent.HEADER_ROW && e.getType() == 100) {
init();
}
}
private void init() {
setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
TableColumnModel tcm = getTableHeader().getColumnModel();
tcm.getColumn(0).setResizable(false);
tcm.getColumn(0).setPreferredWidth(30);
tcm.getColumn(1).setResizable(false);
tcm.getColumn(1).setPreferredWidth(240);
if (!getName().endsWith(":t4"))
for (int i = 2; i < tcm.getColumnCount(); i++) {
tcm.getColumn(i).setResizable(false);
tcm.getColumn(i).setPreferredWidth(25);
}
else {
tcm.getColumn(2).setResizable(false);
tcm.getColumn(2).setPreferredWidth(220);
tcm.getColumn(3).setResizable(false);
tcm.getColumn(3).setPreferredWidth(220);
}
setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}
private Color tablecolor;
private Color tablecolor1;
private static final Color defcolor = new Color(240, 240, 240);
private static final Font font = new Font(Font.SANS_SERIF, Font.PLAIN, 12);
static MarksTable getTable(int tab, int clazz, int subject, Color color) {
MarksTable table = new MarksTable(NotenTableModel.getNotenTableModel(tab, clazz, subject));
table.setName("table:k" + clazz + ":f" + subject + ":t" + tab);
table.tablecolor = new Color(color.getRed(), color.getGreen(), color.getBlue(), 90);
table.tablecolor1 = color;
table.init();
return table;
}
@Override
public final Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
if (row == 0) {
c.setBackground(tablecolor1);
if (c instanceof JLabel)
((JLabel) c).setHorizontalAlignment(SwingConstants.RIGHT);
c.setFont(new Font(Font.SANS_SERIF, Font.ITALIC, 10));
} else if (!isRowSelected(row)) {
c.setBackground(row % 2 == 0 ? defcolor : tablecolor);
setFont(font);
}
return c;
}
private class MarksTableHeader
implements TableCellRenderer, MouseListener, MouseMotionListener {
private final Font FONT1 = new Font(Font.SANS_SERIF, Font.ITALIC, 11);
private final Font FONT2 = new Font(Font.SANS_SERIF, Font.BOLD, 12);
private int selectedColumn = -1;
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
JLabel label = new JLabel((String) value);
if (column >= 2 && !table.getName().endsWith(":t4")) {
label.setUI(new VerticalLabelUI(true));
label.setFont(FONT1);
label.setHorizontalAlignment(SwingConstants.RIGHT);
if (column == selectedColumn) {
label.setOpaque(true);
label.setBackground(Color.DARK_GRAY);
} else {
label.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
}
} else {
label.setFont(FONT2);
label.setVerticalAlignment(SwingConstants.BOTTOM);
label.setHorizontalAlignment(SwingConstants.LEFT);
label.setOpaque(true);
label.setBackground(((MarksTable) table).tablecolor1);
}
return label;
}
public void mouseClicked(MouseEvent e) {
if (selectedColumn != -1) {
selectedColumn = -1;
((Component) e.getSource()).removeMouseMotionListener(this);
((Component) e.getSource()).repaint();
}
}
public void mousePressed(MouseEvent e) {
JTable table = ((JTableHeader) e.getSource()).getTable();
int column = table.convertColumnIndexToModel(table.getColumnModel().getColumnIndexAtX(e.getX()));
if (column >= 2) {
selectedColumn = column;
((Component) e.getSource()).addMouseMotionListener(this);
((Component) e.getSource()).repaint();
}
}
public void mouseReleased(MouseEvent e) {
if (selectedColumn != -1) {
MarkChangePopup p = new MarkChangePopup(MarksTable.this.dataModel, selectedColumn);
((NotenTableModel) MarksTable.this.dataModel).setColumnName(selectedColumn, p.bezeichnung.getText());
MarksTable.this.dataModel.setValueAt(
p.relevanz.getText() + ((p.einfluss1.isSelected()) ? '!' : ""), 0, selectedColumn);
SubjectSaver.save((NotenTableModel) MarksTable.this.dataModel);
}
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
if (selectedColumn != -1) {
selectedColumn = -1;
((Component) e.getSource()).repaint();
}
}
public void mouseDragged(MouseEvent e) {
JTable table = ((JTableHeader) e.getSource()).getTable();
int column = table.convertColumnIndexToModel(table.getColumnModel().getColumnIndexAtX(e.getX()));
if (column != selectedColumn) {
selectedColumn = -1;
((Component) e.getSource()).removeMouseMotionListener(this);
((Component) e.getSource()).repaint();
}
}
public void mouseMoved(MouseEvent e) {
}
private class MarkChangePopup
extends JDialog {
private JTextComponent relevanz;
private JTextComponent bezeichnung;
private JRadioButton einfluss1;
private JRadioButton einfluss2;
public MarkChangePopup(TableModel dataModel, int column) {
super((Frame) null, true);
setSize(new Dimension(370, 420));
setLocationRelativeTo(null);
setUndecorated(true);
getContentPane().setLayout(null);
JLabel ue1 = new JLabel("Bewertung konfigurieren", SwingConstants.CENTER);
ue1.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 14));
ue1.setBounds(0, 20, 370, 20);
getContentPane().add(ue1);
JLabel bezeichnungL = new JLabel("Bezeichnung");
bezeichnungL.setBounds(40, 50, 100, 20);
getContentPane().add(bezeichnungL);
bezeichnung = new JTextField(dataModel.getColumnName(column));
bezeichnung.setBounds(40, 75, 200, 20);
getContentPane().add(bezeichnung);
String rel = "";
Object o = dataModel.getValueAt(0, column);
if (o instanceof String) {
rel = (String) o;
} else if (o instanceof Integer) {
rel = "" + o;
}
JLabel punkte = new JLabel("Max. Punkteanzahl");
punkte.setBounds(40, 110, 150, 20);
getContentPane().add(punkte);
relevanz = new JFormattedTextField(new DecimalFormat());
relevanz.setText(rel.indexOf('!') == -1 ? rel : rel.substring(0, rel.indexOf('!')));
relevanz.setBounds(40, 135, 80, 20);
getContentPane().add(relevanz);
ButtonGroup group = new ButtonGroup();
einfluss1 = new JRadioButton("Auf jeden Fall berücksichtigen");
einfluss1.setSelected(rel.indexOf('!') != -1);
einfluss1.setBounds(30, 180, 200, 20);
getContentPane().add(einfluss1);
group.add(einfluss1);
Component label1 = new JLabel("<html>Diese Beurteilung fließt auf jeden Fall in die Note des Schülers ein, unabhängig davon, ob der Schüler hier auch eine Bewertung erhalten hat.</html>");
label1.setFont(new Font(Font.SANS_SERIF, Font.ITALIC, 11));
label1.setBounds(50, 200, 270, 60);
getContentPane().add(label1);
einfluss2 = new JRadioButton("Nur bei bewertetem Schüler berücksichtigen");
einfluss2.setSelected(rel.indexOf('!') == -1);
einfluss2.setBounds(30, 270, 300, 20);
getContentPane().add(einfluss2);
group.add(einfluss2);
Component label2 = new JLabel("<html>Diese Beurteilung fließt nur dann in die Note des Schülers ein, wenn er hier auch eine Bewertung erhalten hat.</html>");
label2.setFont(new Font(Font.SANS_SERIF, Font.ITALIC, 11));
label2.setBounds(50, 290, 270, 60);
getContentPane().add(label2);
AbstractButton ok = new JButton("OK");
ok.setBounds(150, 370, 60, 20);
ok.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
}
});
getContentPane().add(ok);
((JComponent) getContentPane()).setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
setVisible(true);
}
}
}
}