Dispatching event for specific component only in java

210 Views Asked by At

I would like to customize JTableHeader so it would offer serval actions (for example 2 buttons which one of them would sort column and second show properties of this column etc). Unfortunately it is not possible to set CellEditor for JTableHeader so i'm stuck with using mouse adapter. But maybe it is possible to dispatch event from this particular JTableHeader component so it will show up a popup menu which will contains all options i desire and it would dispatch event if option other than sorting would be chosen. This way standard JTable sorting operation will be available, along with my operations and it will maintain a decent visual apperance. So my question is - Is it possible and how it should be done.


In response to trashgod comment - i understand that you mean to treat defaultheader as an ordinary component and just use "add" function to add Components. It doesnt work well with JTableHeader. After reading trashgod example i wrote this:

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 is applied to JTableHeader. HeaderRender is an extension of JPanel that contains 2 JButtons. Strange thing happens in line

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

When i left lines

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

uncommented, function "getComponentAt" seems to work allmost fine (allmost because it never goes for else condition even when mouse is targeting second button, and it does not repaint clicked buttons[Strangely its repainting buttons in test dialog window]),otherwise it allways returns null object.

I dont know if it is important but i set Header renderer globally by invoking "setDefaultRenderer" on JTableHeader.

Im pretty much running out of ideas so i would appreciate any help.

1

There are 1 best solutions below

1
On

This example shows the basic infrastructure, while this answer offers several important caveats regarding usability. This example shows how to change the RowFilter dynamically, but changing the RowSorter is similar. Both examples use JToggleButton to manage two states, but a JComboBox could be used to select from among more alternatives.