仅在java中为特定组件分派事件

仅在java中为特定组件分派事件,java,swing,jtable,event-dispatching,jtableheader,Java,Swing,Jtable,Event Dispatching,Jtableheader,我想定制JTableHeader,这样它就可以提供一些操作(例如,两个按钮,其中一个将对列进行排序,第二个显示此列的属性等)。不幸的是,无法为JTableHeader设置CellEditor,所以我只能使用鼠标适配器。但也许可以从这个特定的JTableHeader组件中分派事件,因此它将显示一个弹出菜单,其中包含我想要的所有选项,如果选择排序以外的选项,它将分派事件。这样,标准的JTable排序操作将与我的操作一起提供,并将保持良好的视觉外观。所以我的问题是——这可能吗?应该怎么做 作为对垃圾

我想定制JTableHeader,这样它就可以提供一些操作(例如,两个按钮,其中一个将对列进行排序,第二个显示此列的属性等)。不幸的是,无法为JTableHeader设置CellEditor,所以我只能使用鼠标适配器。但也许可以从这个特定的JTableHeader组件中分派事件,因此它将显示一个弹出菜单,其中包含我想要的所有选项,如果选择排序以外的选项,它将分派事件。这样,标准的JTable排序操作将与我的操作一起提供,并将保持良好的视觉外观。所以我的问题是——这可能吗?应该怎么做


作为对垃圾神评论的回应-我理解您的意思是将defaultheader视为普通组件,只需使用“add”函数来添加组件。它不能很好地与JTableHeader配合使用。在阅读了垃圾神的例子后,我写了以下内容:

private class mouseList extends MouseAdapter {

    @Override
    public void mouseClicked(MouseEvent e) {

        TableColumnModel thisColumnModel = thisTable.getColumnModel();
        int xCor = e.getX();
        //int Cols = thisColumnModel.getColumnCount();
        int thisColNum = thisColumnModel.getColumnIndexAtX(xCor);
        int prevWidth=0;
        for(int i = 0 ;i<thisColNum;i++)
        {
            prevWidth+=thisColumnModel.getColumn(i).getWidth();
        }

        int width = xCor-prevWidth;
        /////////////////////////////////////////////////////////////////////////////////////

       customHeader thisHeader =  (customHeader)((JTableHeader)e.getSource()).getDefaultRenderer();
       System.out.println(thisHeader.mainB.getText() + " text of thisHeader");
       //////////////////////////////////////////////////
       test thisTest = new test(null,false,thisHeader);
       thisTest.setVisible(true);
       ///////////////////////////////////////////////////////////////
       //System.out.println(width + " width of the header");
       Object thisComp = thisHeader.getComponentAt(width, e.getY());
       System.out.println(thisComp + "\n" + width + " + " + e.getY() +"\n" + thisHeader.getMainButton().getText());

       ((JTableHeader)e.getSource()).repaint();
       if(thisComp instanceof JButton)
       {
           //System.out.println("sdfdsf");
           String name = ((JButton)thisComp).getName();
           if(name.equals("mainB"))
           {
               System.out.println("its working on main");
               ((JButton)thisComp).doClick(1000);
           }else{
               System.out.println("its working on menu");
               ((JButton)thisComp).doClick(1000);
           }
       }
       ((JTableHeader)e.getSource()).repaint();
    }
}
当我离开时

test thisTest = new test(null,false,thisHeader);
       thisTest.setVisible(true);
(This dialog shows selected component)
未注释的函数“getComponentAt”似乎工作得非常好(因为即使鼠标指向第二个按钮,它也不会执行else条件,并且它不会重新绘制单击的按钮[奇怪的是,它在测试对话框窗口中重新绘制按钮]),否则它总是返回空对象

我不知道这是否重要,但我通过调用JTableHeader上的“setDefaultRenderer”全局设置了Header渲染器


我几乎没有什么想法了,所以我非常感谢您的帮助。

这展示了基本的基础设施,同时提供了一些关于可用性的重要注意事项。这显示了如何动态更改
行过滤器
,但更改
行分类器
类似。这两个示例都使用
JToggleButton
来管理两种状态,但可以使用
JComboBox
从更多备选方案中进行选择。

这显示了基本的基础结构,同时提供了有关可用性的几个重要注意事项。这显示了如何动态更改
行过滤器
,但更改
行分类器
类似。两个示例都使用
JToggleButton
来管理两种状态,但是可以使用
JComboBox
从更多备选方案中进行选择。

本主题的讲座可能重复似乎不太可能本主题的讲座可能重复似乎不太可能+1(无法设置)移除JTableHeader并将JPanel(北面)与标准JComponents放在一起,以便与JTable同步,对于每个JComponents+1 Rob adviced(无法设置),移除JTableHeader并将JPanel(北面)与标准JComponents放在一起,以便与JTable同步,并为每个JComponents同步
test thisTest = new test(null,false,thisHeader);
       thisTest.setVisible(true);
(This dialog shows selected component)