我想自定义JTableHeader,因此它会提供serval操作(例如2个按钮,其中一个按钮会对列进行排序,第二个按钮显示此列的属性等)。不幸的是,无法为JTableHeader设置CellEditor,所以我坚持使用鼠标适配器。但也许有可能从这个特定的JTableHeader组件调度事件,因此它将显示一个弹出菜单,其中包含我想要的所有选项,如果选择除了排序之外的选项,它将调度事件。这样就可以使用标准的JTable排序操作,以及我的操作,它将保持良好的视觉外观。所以我的问题是 - 它是否可能以及应该如何完成。
响应trashgod评论 - 我明白你的意思是将defaultheader视为普通组件,只需使用“添加”功能来添加组件。它与JTableHeader不兼容。在阅读了trashgod的例子后,我写了这个:
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”似乎工作得非常好(最重要的是因为即使鼠标指向第二个按钮它也永远不会用于其他条件,并且它不会重新点击点击按钮[奇怪地在测试对话框窗口中重新绘制按钮]),否则它总是返回null对象。
我不知道它是否重要,但我通过在JTableHeader上调用“setDefaultRenderer”来全局设置Header渲染器。
我几乎没有想法,所以我会感激任何帮助。