Moin Moin!
In einer JTable möchte ich in jeder Zeile zwei JButtons, je in einer eigenen Zelle, platzieren. Die Beiden Buttons werden auch richtig angezeigt, aber sie lassen sich weder optisch klicken noch wird "actionPerformed()" der Klasse "ButtonColumn" aufgerufen. Die Methode "getTableCellEditorComponent" der Klasse "ButtonColumn" wird beim Klicken auf einen der Buttons nicht aufgerufen.
In einer alten Version des Programm funktionieren die JButtons in der JTable der Klasse "ButtonColumn" super. In der neuen Version des Programms verwende ich ein eigenes, von AbstractTableModel abgeleitetes, TableModel.
Sieht jmd. das Problem und kann mir helfen?
Hier die GUI und inkl. der Klasse "ButtonColumn":
Und hier mein TableModel:
In einer JTable möchte ich in jeder Zeile zwei JButtons, je in einer eigenen Zelle, platzieren. Die Beiden Buttons werden auch richtig angezeigt, aber sie lassen sich weder optisch klicken noch wird "actionPerformed()" der Klasse "ButtonColumn" aufgerufen. Die Methode "getTableCellEditorComponent" der Klasse "ButtonColumn" wird beim Klicken auf einen der Buttons nicht aufgerufen.
In einer alten Version des Programm funktionieren die JButtons in der JTable der Klasse "ButtonColumn" super. In der neuen Version des Programms verwende ich ein eigenes, von AbstractTableModel abgeleitetes, TableModel.
Sieht jmd. das Problem und kann mir helfen?
Hier die GUI und inkl. der Klasse "ButtonColumn":
Java:
public class MainFrame extends JFrame implements ActionListener {
protected JLabel labelNum;
protected JTable table;
protected JScrollPane scroller;
protected MyTableModel tableModel;
public MainFrame() {
super("PaperList");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
initComponents();
}
private void initComponents() {
Container cp = getContentPane();
cp.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
// Tabelle: Spalten
DefaultTableColumnModel columnModel = new DefaultTableColumnModel();
TableColumn col;
col = new TableColumn(0, Configuration.getCellWidth("cell_width_title"));
col.setHeaderValue("Title");
col.setResizable(false);
columnModel.addColumn(col);
col = new TableColumn(1, Configuration.getCellWidth("cell_width_first_author"));
col.setHeaderValue("Erstautor");
col.setResizable(false);
columnModel.addColumn(col);
col = new TableColumn(2, Configuration.getCellWidth("cell_width_first_senior"));
col.setHeaderValue("Seniorautor");
col.setResizable(false);
columnModel.addColumn(col);
col = new TableColumn(3, Configuration.getCellWidth("cell_width_date"));
col.setHeaderValue("Date");
col.setResizable(false);
columnModel.addColumn(col);
col = new TableColumn(4, Configuration.getCellWidth("cell_width_journal"));
col.setHeaderValue("Journal");
col.setResizable(false);
columnModel.addColumn(col);
col = new TableColumn(5, Configuration.getCellWidth("cell_width_pdf"));
col.setHeaderValue("");
col.setResizable(false);
columnModel.addColumn(col);
col = new TableColumn(6, Configuration.getCellWidth("cell_width_com"));
col.setHeaderValue("");
col.setResizable(false);
columnModel.addColumn(col);
// Tabelle: Inhalt
tableModel = new MyTableModel();
// Tabelle: Darstellung
table = new JTable(tableModel, columnModel);
table.setPreferredScrollableViewportSize(new Dimension(columnModel.getTotalColumnWidth(), 300));
// Tabelle: Buttons
ButtonColumn buttonColumn1 = new ButtonColumn(this, table, tableModel, 5);
ButtonColumn buttonColumn2 = new ButtonColumn(this, table, tableModel, 6);
// Tabelle: Filter
RowFilter<MyTableModel, Integer> ageFilter = new RowFilter<MyTableModel, Integer>() {
public boolean include(Entry<? extends MyTableModel, ? extends Integer> entry) {
MyTableModel tableModel = entry.getModel();
Paper paper = tableModel.getPaper(entry.getIdentifier());
if (paper.getFileName().startsWith("1")) {
return true;
}
return false;
}
};
RowFilter<MyTableModel, Integer> authorFilter = new RowFilter<MyTableModel, Integer>() {
public boolean include(Entry<? extends MyTableModel, ? extends Integer> entry) {
MyTableModel tableModel = entry.getModel();
Paper paper = tableModel.getPaper(entry.getIdentifier());
if (paper.getAuthorSenior().equals("Test")) {
return true;
}
return false;
}
};
TableRowSorter<MyTableModel> sorter = new TableRowSorter<MyTableModel>(tableModel);
// sorter.setRowFilter(authorFilter);
table.setRowSorter(sorter);
// Anzahl der angezeigten Paper in der Tabelle
labelNum = new JLabel();
labelNum.setText(getNumPaperString());
gbc.gridy = 1;
gbc.gridx = 1;
cp.add(labelNum, gbc);
// UPDATE-Button
JButton button = new JButton("UPDATE");
button.addActionListener(this);
gbc.gridy = 3;
gbc.gridx = 1;
cp.add(button, gbc);
// Tabelle einbinden
gbc.gridy = 2;
gbc.gridx = 1;
cp.add(new JScrollPane(table), gbc);
pack();
}
public String getNumPaperString() {
return "Paper " + table.getRowCount() + " / " + tableModel.getRowCount();
}
public void actionPerformed(ActionEvent event) {
System.out.println("actionPerformed --> UPDATE");
tableModel.readDirectory("d:/test/");
tableModel.fireTableDataChanged();
labelNum.setText(getNumPaperString());
System.out.println("Anzahl der Paper in der Tabelle = " + table.getRowCount());
}
class ButtonColumn extends AbstractCellEditor implements TableCellRenderer, TableCellEditor, ActionListener {
JFrame frame;
JTable table;
MyTableModel tableModel;
JButton renderButton;
JButton editButton;
String text;
int column;
public ButtonColumn(JFrame frame, JTable table, MyTableModel tableModel, int column) {
super();
this.frame = frame;
this.table = table;
this.tableModel = tableModel;
this.column = column;
renderButton = new JButton();
editButton = new JButton();
editButton.setFocusPainted( false );
editButton.addActionListener( this );
TableColumnModel columnModel = table.getColumnModel();
System.out.println("getColumnCount = " + columnModel.getColumnCount());
System.out.println("getWidth = " + columnModel.getColumn(this.column).getWidth());
columnModel.getColumn(this.column).setCellRenderer( this );
columnModel.getColumn(this.column).setCellEditor( this );
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
System.out.println("(" + row + " / " + column + ")" + isSelected + " -> " + hasFocus + " -> " + value.toString());
if (hasFocus) {
renderButton.setForeground(table.getForeground());
renderButton.setBackground(UIManager.getColor("Button.background"));
}
else if (isSelected) {
renderButton.setForeground(table.getSelectionForeground());
renderButton.setBackground(table.getSelectionBackground());
}
else {
renderButton.setForeground(table.getForeground());
renderButton.setBackground(UIManager.getColor("Button.background"));
}
renderButton.setText( (value == null) ? "" : value.toString() );
return renderButton;
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
System.out.println("getTableCellEditorComponent");
text = (value == null) ? "" : value.toString();
editButton.setText( text );
return editButton;
}
public Object getCellEditorValue() {
System.out.println("getCellEditorValue");
return text;
}
public void actionPerformed(ActionEvent e) {
System.out.println("actionPerformed --> BUTTON");
int pmid = Integer.parseInt(table.getValueAt(table.getSelectedRow(), 0).toString());
if(column == 5) {
try {
// Öffnen der PDF-Datei
Desktop.getDesktop().open( new File(Configuration.getPaperPath() + pmid + ".pdf"));
}
catch(IOException ex) {
ex.printStackTrace();
}
}
else if(column == 6) {
CommentDialog dialog = new CommentDialog(frame, tableModel, pmid);
dialog.setVisible(true);
}
}
}
}
Und hier mein TableModel:
Java:
public class MyTableModel extends AbstractTableModel {
public static final int INDEX_TITLE = 0;
public static final int INDEX_AUTHOR_FIRST = 1;
public static final int INDEX_AUTHOR_SENIOR = 2;
public static final int INDEX_DATE = 3;
public static final int INDEX_JOURNAL = 4;
public static final int INDEX_PDF = 5;
public static final int INDEX_COMMENT = 6;
private Vector<Paper> data;
protected String[] columnNames;
public MyTableModel() {
data = new Vector<Paper>();
readDatabase();
}
public int getColumnCount() {
return 7;
}
public int getRowCount() {
return data.size();
}
public Paper getPaper(int rowIndex) {
return data.get(rowIndex);
}
public Object getValueAt(int rowIndex, int columnIndex) {
Paper paper = (Paper)data.get(rowIndex);
switch (columnIndex) {
case INDEX_TITLE:
return paper.getTitle();
case INDEX_AUTHOR_FIRST:
return paper.getAuthorFirst();
case INDEX_AUTHOR_SENIOR:
return paper.getAuthorSenior();
case INDEX_DATE:
return paper.getDate();
case INDEX_JOURNAL:
return paper.getJournalISO();
case INDEX_PDF:
return "PDF";
case INDEX_COMMENT:
return "COM";
default:
return new Object();
}
}
public void readDatabase() {
DatabaseManager dm = new DatabaseManager();
data = dm.read();
}
public void readDirectory(String path) {
Vector<Paper> dataDel = new Vector<Paper>(data); // Paper die nicht mehr in dem Verzeichnis vorhanden sind
Vector<Paper> dataNew = new Vector<Paper>(); // Paper die neu in dem Verzeichnis sind
File dir = new File(path);
File[] files = dir.listFiles();
if (files != null) {
for (int i = 0; i < files.length; i++) {
if (files[i].isFile()) {
int id = Integer.parseInt(files[i].getName().substring(0, files[i].getName().indexOf('.')));
Paper paper = new Paper(id, files[i]);
if(dataDel.contains(paper)) {
dataDel.remove(paper);
}
else {
data.add(paper);
dataNew.add(paper);
paper.eFetch();
paper.addToDatabase();
}
}
}
for (Enumeration<Paper> e = dataDel.elements(); e.hasMoreElements(); ) {
Paper paper = (Paper) e.nextElement();
if(data.contains(paper)) {
data.remove(paper);
paper.removeFromDatabase();
}
}
}
String msg =
"DELETE = " + dataDel.size() + "\r\n" +
"NEW = " + dataNew.size() + "\r\n" +
"DATA = " + data.size() + "\r\n";
JOptionPane.showMessageDialog(null, msg, "Error", JOptionPane.ERROR_MESSAGE);
}
}