1

我想自定义 JTableHeader 以便它提供服务操作(例如 2 个按钮,其中一个按钮对列进行排序,第二个显示该列的属性等)。不幸的是,无法为 JTableHeader 设置 CellEditor,所以我坚持使用鼠标适配器。但是也许可以从这个特定的 JTableHeader 组件调度事件,因此它会显示一个弹出菜单,其中包含我想要的所有选项,如果选择排序以外的选项,它将调度事件。这样,标准的 JTable 排序操作将与我的操作一起可用,并且将保持良好的视觉外观。所以我的问题是 - 是否有可能以及应该如何做。


作为对垃圾神评论的回应-我了解您的意思是将 defaultheader 视为普通组件,只需使用“添加”功能即可添加组件。它不适用于 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();
    }
}

MouseListener 应用于 JTableHeader。HeaderRender 是 JPanel 的扩展,包含 2 个 JButton。奇怪的事情发生在队列中

 Object thisComp = thisHeader.getComponentAt(width, e.getY());

当我离开台词

test thisTest = new test(null,false,thisHeader);
       thisTest.setVisible(true);
(This dialog shows selected component)

未注释,函数“getComponentAt”似乎工作得很好(几乎是因为即使鼠标瞄准第二个按钮,它也不会出现其他条件,并且它不会重新绘制单击的按钮[奇怪的是它在测试对话框窗口中重新绘制按钮]),否则它总是返回空对象。

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

我几乎没有想法,所以我将不胜感激。

4

1 回答 1

1

这个例子展示了基本的基础设施,而这个答案提供了几个关于可用性的重要警告。这个例子展示了如何RowFilter动态改变,但改变RowSorter是相似的。这两个示例都JToggleButton用于管理两种状态,但 aJComboBox可用于从更多备选方案中进行选择。

于 2012-06-02T14:48:50.283 回答