0

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?

mKorbel
  • 109,525
  • 20
  • 134
  • 319
chrisapotek
  • 6,007
  • 14
  • 51
  • 85
  • 1
    JTableHeader 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 Answers1

0

You can try to use something like this. This code provides visual effect with JToggleButton.

enter image description here

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