J
Jochen#16
Gast
Hallo zusammen,
ich versuche gerade voll funktionable JButtons in eine JTable zu integrieren. Dies will mir nicht so recht gelingen. Zwar sind die Buttons als solche erkennbar, ich kann sie aber nicht anklicken. Irgendwas mache ich da scheinbar grundlegend falsch. Nur was?
Ich definiere eine Tabelle mit einem eigenen TableModel (MyTableModel). Für die Spalte, in der die Buttons dargestellt werden sollen, habe ich einen eigenen CellRenderer implementiert (TestRenderer). Die darzustellenen Buttons werden vorher in einem Array definiert und dem Konstruktor des Renderers mitgeliefert.
Jemand eine Idee? Bin für jeden Hinweis dankbar.
Der komplette Code:
ich versuche gerade voll funktionable JButtons in eine JTable zu integrieren. Dies will mir nicht so recht gelingen. Zwar sind die Buttons als solche erkennbar, ich kann sie aber nicht anklicken. Irgendwas mache ich da scheinbar grundlegend falsch. Nur was?
Ich definiere eine Tabelle mit einem eigenen TableModel (MyTableModel). Für die Spalte, in der die Buttons dargestellt werden sollen, habe ich einen eigenen CellRenderer implementiert (TestRenderer). Die darzustellenen Buttons werden vorher in einem Array definiert und dem Konstruktor des Renderers mitgeliefert.
Jemand eine Idee? Bin für jeden Hinweis dankbar.
Der komplette Code:
Code:
package test;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
public class TableSelectionDemoExtended extends JPanel implements ActionListener
{
private JTable table;
private JButton[] testBtn;
public TableSelectionDemoExtended() {
super();
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
testBtn = new JButton[5];
for (int i = 0; i < 5; i++)
{
testBtn[i] = new JButton("Button " + (i + 1));
testBtn[i].addActionListener(this);
}
final TestRenderer weirdRenderer = new TestRenderer(testBtn);
table = new JTable(new MyTableModel())
{
public TableCellRenderer getCellRenderer(int row, int column) {
if (column == 5)
{
return weirdRenderer;
}
return super.getCellRenderer(row, column);
}
};
add(new JScrollPane(table));
}
class MyTableModel extends AbstractTableModel {
private String[] columnNames = {"First Name",
"Last Name",
"Sport",
"# of Years",
"Vegetarian",
"Test"};
private Object[][] data = {
{"Mary", "Campione",
"Snowboarding", new Integer(5), new Boolean(false), null},
{"Alison", "Huml",
"Rowing", new Integer(3), new Boolean(true), null},
{"Kathy", "Walrath",
"Knitting", new Integer(2), new Boolean(false), null},
{"Sharon", "Zakhour",
"Speed reading", new Integer(20), new Boolean(true), null},
{"Philip", "Milne",
"Pool", new Integer(10), new Boolean(false), null},
};
public MyTableModel() {}
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public boolean isCellEditable(int row, int col) {
if (col < 2 || col == 5) {
return false;
} else {
return true;
}
}
public void setValueAt(Object value, int row, int col) {
data[row][col] = value;
fireTableCellUpdated(row, col);
}
}
private static void createAndShowGUI() {
//Disable boldface controls.
UIManager.put("swing.boldMetal", Boolean.FALSE);
//Create and set up the window.
JFrame frame = new JFrame("TableSelectionDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create and set up the content pane.
TableSelectionDemoExtended newContentPane = new TableSelectionDemoExtended();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
public class TestRenderer extends DefaultTableCellRenderer
{
public JButton button[];
public TestRenderer(JButton[] aBtn)
{
button = aBtn;
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column)
{
return button[row];
}
}
public void actionPerformed(ActionEvent e)
{
System.out.println("Blah");
if (e.getActionCommand().startsWith("Button"))
{
System.out.println(e.getActionCommand());
}
}
}