Tried everything but I cannot get a JButton inside a JTable header. I was able to make it show there and use a mouse listener to trap clicks, but there is no visual clicking effect. Can someone provide a simple example with the right way of doing this?
Asked
Active
Viewed 1,505 times
0
-
1JTableHeader by default doesn't support Editor only Renderer, Renderer is only illusion from painting, not real JComponent, search here for JCheckBox in JTableHeader, sure that nothing solve something about how to paint, simulating JButton.isPressed/isArmed/isSelected – mKorbel Oct 17 '13 at 18:55
-
This [example](http://stackoverflow.com/a/7137801/230513) alters the text to signify the change. – trashgod Oct 17 '13 at 20:43
1 Answers
0
You can try to use something like this. This code provides visual effect with JToggleButton.
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
public class Test {
private static JTable table;
public static void main(String[] args) {
table = new JTable(new Object[][]{{1,2},{2,3}},new Object[]
{"test", "test2"});
TableColumn column = table.getColumnModel().getColumn(0);
column.setHeaderRenderer(new BtnRenderer(column.getHeaderValue()));
column = table.getColumnModel().getColumn(1);
column.setHeaderRenderer(new BtnRenderer(column.getHeaderValue()));
table.getTableHeader().addMouseListener(getHeaderMouseListener());
JFrame f = new JFrame();
f.add(new JScrollPane(table));
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setVisible(true);
}
private static MouseListener getHeaderMouseListener() {
return new MouseAdapter() {
@Override
public void mousePressed(MouseEvent arg0) {
if(arg0.getButton() == 1){
int columnAtPoint =
table.columnAtPoint(arg0.getPoint());
/* Get the header portion of the table, and its column model */
JTableHeader header = table.getTableHeader();
TableColumnModel columnModel = header.getColumnModel();
TableColumn column = columnModel.getColumn(columnAtPoint);
BtnRenderer headerRenderer =
(BtnRenderer) column.getHeaderRenderer();
headerRenderer.actionPerformed();
} else {
super.mousePressed(arg0);
}
}
};
}
}
class BtnRenderer implements TableCellRenderer {
private JToggleButton btn;
public BtnRenderer(Object headerValue) {
btn = new JToggleButton();
btn.addActionListener(System.out::println);
btn.setText(headerValue.toString());
}
@Override
public Component getTableCellRendererComponent(
JTable arg0,
Object arg1,
boolean arg2,
boolean arg3,
int arg4,
int arg5) {
return btn;
}
public void actionPerformed() {
btn.setSelected(!btn.isSelected());
}
}

Filip Allberg
- 3,941
- 3
- 20
- 37

alex2410
- 10,904
- 3
- 25
- 41