JTable Spalten mittels Header PopuMenu aus- und einblenden

ThirdKeeper

Mitglied
Einsatzbereich:
Es wird ein JTable dargestellt in dem Daten über ein TableModel dynamisch gesetzt werden
und dazu dynamisch der dazugehörige ColumnHeader erzeugt wird.
Innerhalb der Tabelle verwende ich ein JPopupMenu was auch funktioniert.

Problemstellung:
Ich würde gern mit einem Rechtsklick auf den Spaltenkopf (nicht auf die Zellen)
ein PopupMenu öffnen in dem die Spalten dargestellt werden und mittels einer Checkbox
aus-
bzw. wieder eingeblendet werden können.

:confused:
 
Zuletzt bearbeitet:
So wie unten zu sehen sieht ein Teil des verhandenen Quell-Codes aus:

Code:
private void addHeaderPopupMenu() {
        headerMenu = new JPopupMenu(); 
        Action headerAction = new AbstractAction( "SpalteX" ) {
            public void actionPerformed( ActionEvent evt ) { 
                setColumnInvisible("SpalteX");}}; 
        headerMenu.addSeparator();
        headerMenu.add(headerAction);
        this.getTabelleDatensatz().getTableHeader().add(headerMenu);
        
        this.getTabelleDatensatz().getTableHeader().addMouseListener(
            new MouseAdapter(){
                public void mouseReleased(MouseEvent e) {
                    if(e.getButton()==(MouseEvent.BUTTON3)&&e.getClickCount()==1){
                        AbstractTableWorkspace.this.headerMenu.setVisible(true);
            }}});
}

public void setColumnInvisible(String spaltenname){
 .....
}

Nur leider wird das PopupMenu völlig falsch positioniert und eine Funktion zum Spaltenausblenden existiert auch nicht!?
 
Zuletzt bearbeitet:
Dann beantworte ich schon mal einen Teil meines Problems für die Nachwelt selbst! ;-)

Zunächst ein PopupListerner für den Rechtsklick auf den TableHeader:
Code:
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JPopupMenu;

class PopupListener extends MouseAdapter {
    JPopupMenu popupMenu;
    
    public PopupListener(JPopupMenu popup){
        this.popupMenu = popup;}
    
    public void mousePressed(MouseEvent me) {
        showPopup(me);}

    public void mouseReleased(MouseEvent me) {
        showPopup(me);}

    private void showPopup(MouseEvent me) {
        if (me.isPopupTrigger()) {
            popupMenu.show(me.getComponent(), me.getX(), me.getY());
    }}
}

Hier die Operation die den PopupListener einsetzt:
Code:
private void addHeaderPopupMenu() {
    headerMenu = new JPopupMenu(); 
    Action headerAction = new AbstractAction( "Spalte(n) ein-/ausblenden" ) {
        public void actionPerformed( ActionEvent evt ) { 
            System.out.println("Header clicked");
        }};
        headerMenu.add(headerAction);
        this.getTabelle().getTableHeader().addMouseListener(
            new PopupListener(headerMenu));
}

Damit ist wenigstens schon mal das Problem für das PopupMenu gelöst.
Jetzt muss nur noch anstelle von System.out.println("Header clicked")
eine nützliche Funktion zum ein und ausblenden der Spalten gefunden werden.

Vielleicht findet sich ja nun jemand der mir weiterhelfen kann. :-(
 
Moin!
Danke für den Link! @MeinerEiner_80

Habe das ganze mal überarbeitet und es funktioniert nun.
Deshalb mal hier der Codeausschnitt für alles die ein ähnliches Problem haben. :)

Code:
private void addHeaderPopupMenu() {
    headerMenu = new JPopupMenu();
    JMenu columnMenu = new JMenu("Spalte(n) ein-/ausblenden");
    headerMenu.add(columnMenu);
    Enumeration en = 
        this.getTable().getTableHeader().getColumnModel().getColumns();
    while(en.hasMoreElements()){
        TableColumn column = (TableColumn)en.nextElement();
        JCheckBoxMenuItem mi = new JCheckBoxMenuItem(new AbstractAction(
            column.getHeaderValue().toString() ) {
                public void actionPerformed( ActionEvent evt ) { 
                    AbstractTable.this.checkTableView(evt);
                    //AbstractTable ist hier der Klassenname
                }});
        if(column.getPreferredWidth()!=0)mi.setSelected(true);
        else mi.setSelected(false);
        columnMenu.add(mi);
    }
    this.getTable().getTableHeader().addMouseListener(new 
        PopupListener(headerMenu));
}
protected void checkTableView(ActionEvent evt){
    String cmd = evt.getActionCommand();
    int colIndex = 
        this.getTable().getTableHeader().getColumnModel().getColumnIndex(cmd);
    TableColumn column = 
        this.getTable().getTableHeader().getColumnModel().getColumn(colIndex);
    if(column.getPreferredWidth()!=0){
        this.tableHeaderSizeX[colIndex] [0]= column.getPreferredWidth();
        this.tableHeaderSizeX[colIndex] [1]= column.getMinWidth();
        this.tableHeaderSizeX[colIndex] [2]= column.getMaxWidth();
        column.setMinWidth(0);
        column.setMaxWidth(0);
        column.setPreferredWidth(0);
    }else{
        column.setMinWidth(this.tableHeaderSizeX[colIndex] [1]);
        column.setMaxWidth(this.tableHeaderSizeX[colIndex] [2]);
        column.setPreferredWidth(this.tableHeaderSizeX[colIndex] [0]);
        column.sizeWidthToFit();
    }
}
 
Zurück