Follow along with the video below to see how to install our site as a web app on your home screen.
Anmerkung: This feature currently requires accessing the site using the built-in Safari browser.
public Component getTableCellRendererComponent(...)
... dann leite doch einfach eine eigene Komponente von JComponent ab und platziere dann "intern" das JLabel und den JButton entsprechend... anschließend verwendest du Snapes vorgeschlagene Methode und überschreibstIch möchte gerne in einer Zelle ein Label und einen Button anzeigen lassen
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
class JTableButtonRenderer implements TableCellRenderer
{
private TableCellRenderer defaultRenderer;
public JTableButtonRenderer(TableCellRenderer renderer)
{
defaultRenderer = renderer;
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected,
boolean hasFocus,
int row, int column)
{
if(value instanceof MyTableComponent) return (MyTableComponent)value;
return defaultRenderer.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, column);
}
}
class MyTableComponent extends JPanel
{
public MyTableComponent(String labelName)
{
add(new JLabel(labelName));
add(new JButton("..."));
}
}
class JTableButtonModel extends AbstractTableModel
{
private Object[][] __rows =
{
{ "hi", new MyTableComponent("C:/images") },
{ "ha", new MyTableComponent("C:/images")},
{ "ho", new MyTableComponent("C:/images") },
{ "yeah", new MyTableComponent("C:/images") }
};
private String[] __columns = { "Numbers", "Buttons" };
public String getColumnName(int column)
{
return __columns[column];
}
public int getRowCount() {
return __rows.length;
}
public int getColumnCount() {
return __columns.length;
}
public Object getValueAt(int row, int column) {
return __rows[row][column];
}
public boolean isCellEditable(int row, int column) {
return false;
}
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
}
class JTableButtonMouseListener implements MouseListener
{
private JTable __table;
private void __forwardEventToButton(MouseEvent e)
{
TableColumnModel columnModel = __table.getColumnModel();
int column = columnModel.getColumnIndexAtX(e.getX());
int row = e.getY() / __table.getRowHeight();
Object value;
JButton button;
MouseEvent buttonEvent;
if(row >= __table.getRowCount() || row < 0 ||
column >= __table.getColumnCount() || column < 0)
return;
value = __table.getValueAt(row, column);
if(!(value instanceof JButton))
return;
button = (JButton)value;
buttonEvent =
(MouseEvent)SwingUtilities.convertMouseEvent(__table, e, button);
button.dispatchEvent(buttonEvent);
// This is necessary so that when a button is pressed and released
// it gets rendered properly. Otherwise, the button may still appear
// pressed down when it has been released.
__table.repaint();
}
public JTableButtonMouseListener(JTable table) {
__table = table;
}
public void mouseClicked(MouseEvent e)
{
System.out.println("foo");
__forwardEventToButton(e);
}
public void mouseEntered(MouseEvent e) {
__forwardEventToButton(e);
}
public void mouseExited(MouseEvent e) {
__forwardEventToButton(e);
}
public void mousePressed(MouseEvent e)
{
__forwardEventToButton(e);
}
public void mouseReleased(MouseEvent e) {
__forwardEventToButton(e);
}
}
public final class JTableButton extends JFrame
{
private JTable table;
private JScrollPane scrollPane;
public JTableButton()
{
super("JTableButton Demo");
TableCellRenderer defaultRenderer;
table = new JTable(new JTableButtonModel());
table.setRowHeight( table.getRowHeight() + 20 );
defaultRenderer = table.getDefaultRenderer(MyTableComponent.class);
table.setDefaultRenderer(MyTableComponent.class,
new JTableButtonRenderer(defaultRenderer));
table.setPreferredScrollableViewportSize(new Dimension(400, 200));
table.addMouseListener(new JTableButtonMouseListener(table));
scrollPane = new JScrollPane(table);
setContentPane(scrollPane);
}
public static void main(String[] args)
{
Frame frame;
WindowListener exitListener;
exitListener = new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
Window window = e.getWindow();
window.setVisible(false);
window.dispose();
System.exit(0);
}
};
frame = new JTableButton();
frame.addWindowListener(exitListener);
frame.pack();
frame.setVisible(true);
}
}
class JTableButtonMouseListener implements MouseListener
{
private JTable table;
private TableFileChooser tfc;
public JTableButtonMouseListener(JTable table)
{
this.table = table;
}
private void forwardEventToButton(MouseEvent e)
{
TableColumnModel columnModel = this.table.getColumnModel();
int column = columnModel.getColumnIndexAtX(e.getX());
int row = e.getY() / this.table.getRowHeight();
Object value;
MouseEvent tfcEvent;
if(row >= this.table.getRowCount() || row < 0 ||
column >= this.table.getColumnCount() || column < 0)
{
return;
}
value = this.table.getValueAt(row, column);
if(!(value instanceof TableFileChooser))
{
return;
}
else
{
tfc = (TableFileChooser) value;
tfcEvent = (MouseEvent)SwingUtilities.convertMouseEvent(this.table, e, tfc);
if (tfc instanceof TableFileChooser && e.getButton() == MouseEvent.BUTTON1)
{
System.out.println("alles klar");
tfc.dispatchEvent(tfcEvent);
this.table.repaint();
}
}
}
public void mouseClicked(MouseEvent e)
{
forwardEventToButton(e);
}
public void mouseEntered(MouseEvent e) {
//forwardEventToButton(e);
}
public void mouseExited(MouseEvent e) {
//forwardEventToButton(e);
}
public void mousePressed(MouseEvent e)
{
//forwardEventToButton(e);
}
public void mouseReleased(MouseEvent e) {
//forwardEventToButton(e);
}
}