Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用点击视觉效果在JTable标题中创建JButton?_Java_Swing_Jtable_Jbutton_Jtableheader - Fatal编程技术网

Java 如何使用点击视觉效果在JTable标题中创建JButton?

Java 如何使用点击视觉效果在JTable标题中创建JButton?,java,swing,jtable,jbutton,jtableheader,Java,Swing,Jtable,Jbutton,Jtableheader,尝试了所有方法,但我无法在JTable标头中获得JButton。我能够让它显示在那里,并使用鼠标侦听器捕捉点击,但没有视觉点击效果。有人能提供一个简单的例子来说明正确的方法吗?您可以尝试使用类似的方法。此代码使用JToggleButton提供视觉效果 默认情况下,JTableHeader不支持仅编辑器的渲染器,渲染器只是绘画中的幻觉,而不是真实的JComponent,在这里搜索JTableHeader中的JCheckBox,确保没有解决有关如何绘制的问题,模拟JButton.isPressed

尝试了所有方法,但我无法在JTable标头中获得JButton。我能够让它显示在那里,并使用鼠标侦听器捕捉点击,但没有视觉点击效果。有人能提供一个简单的例子来说明正确的方法吗?

您可以尝试使用类似的方法。此代码使用JToggleButton提供视觉效果


默认情况下,JTableHeader不支持仅编辑器的渲染器,渲染器只是绘画中的幻觉,而不是真实的JComponent,在这里搜索JTableHeader中的JCheckBox,确保没有解决有关如何绘制的问题,模拟JButton.isPressed/isArmed/isselected这会更改文本以表示更改。
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());
    }
}