JTable Zeile ausblenden bzw.deaktivieren

ohli

Grünschnabel
Hallo Leute,

Ich habe ein JTable welches von AbstractTableModel abgeleitet ist.Man kann Zeilen selektieren und über ein popupmenu zeilen löschen und zufügen.Funktioniert auch alles.

Nun zu meinem Problem:

Ich möchte über das popupmenu eine selektierte Zeile deaktivieren(ausgrauen).

Die Zeilen werden übrigens in einem Vector gespeichert.

Ich hoffe mir kann jemand helfen.

Renderer:
Code:
package gui;

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;

import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class AnlSpglCellRenderer extends DefaultTableCellRenderer {

    private static final long serialVersionUID = 1L;

    // Konstruktor
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int col) {
        
        

        JLabel lab = (JLabel)super.getTableCellRendererComponent(table, value,
                isSelected, hasFocus, row, col);
        
         Component c = super.getTableCellRendererComponent(table, value,
                   isSelected, hasFocus, row, col);

        // Tabelleninhalte werden zentriert
        lab.setHorizontalAlignment(JLabel.CENTER);

        // Schriftart für Tabelle und Header
        lab.setFont(new java.awt.Font("Century Gothic", Font.PLAIN, 10));
        table.getTableHeader().setFont(
                new java.awt.Font("Century Gothic", Font.PLAIN, 10));

        if (col == 0) {
            lab.setHorizontalAlignment(JLabel.LEFT);
        }
    
        // Farbzuweisung für Spalten
        if (col == 1 || col == 7 || col == 12) {
            Color hauptFarbe = new Color(94, 142, 169);
            lab.setBackground(hauptFarbe);
        }

        else

        if (isSelected) {
            lab.setBackground(Color.GRAY);

        } else {
            lab.setBackground(Color.WHITE);
        }

        return lab;
    }
}
Methode im Tablemodel:
Leider wird immer die ganze Tabelle deaktiviert
Code:
void disableRow(int row) { 
                 
                DefaultTableCellRenderer render = new AnlSpglCellRenderer(); 
                anlageSpiegel.tabAnlSpgl.setDefaultRenderer(String.class, render); 
                 
                int selectRow = anlageSpiegel.tabAnlSpgl.getSelectedRow(); 
                int selectCol = anlageSpiegel.tabAnlSpgl.getSelectedColumn(); 
                 
                Component c = (Component) anlageSpiegel.tabAnlSpgl.getCellRenderer( 
                                selectRow, selectCol); 
                         
                                c.setEnabled(false); 
                 
                fireTableDataChanged(); 
                 
        }
Gruß
Ohli...
 
Moin!
Setzt der Renderer einmalig wenn du die Tabelle erstellt, und nicht in der Methode disableRow die wohl jedesmal aufgerufen wird, wenn du eine Zeile ausgrauen möchtest...
Und warum setzt du im Renderer die Schriftart für den TableHeader? Das macht doch keinen Sinn!

Probiers mal eher derart (deactivatedRows ist der Vector mit den zu deaktivierenden Zeilen):

Code:
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int col) {
        
        

        JLabel lab = (JLabel)super.getTableCellRendererComponent(table, value,
                isSelected, hasFocus, row, col);
        
         // Tabelleninhalte werden zentriert
        lab.setHorizontalAlignment(JLabel.CENTER);

        // Schriftart für Tabelle und Header
        lab.setFont(new java.awt.Font("Century Gothic", Font.PLAIN, 10));
        
         table.getTableHeader().setFont(
                new java.awt.Font("Century Gothic", Font.PLAIN, 10));

        if (col == 0) {
            lab.setHorizontalAlignment(JLabel.LEFT);
        }
    
        // Farbzuweisung für Spalten
        if (col == 1 || col == 7 || col == 12) {
            Color hauptFarbe = new Color(94, 142, 169);
            lab.setBackground(hauptFarbe);
        }

        else

        if (isSelected) {
            lab.setBackground(Color.GRAY);

        } else {
            lab.setBackground(Color.WHITE);
        }
        if(deactivatedRows.contains(row)) 
              lab.setEnabled(false);
        return lab;
    }
}
Code:
void disableRow(int deactivateRow) { 
                 deactivatedRows.add(deactivateRow);
                 fireTableDataChanged(); 
                 
        }
 
Zuletzt bearbeitet von einem Moderator:
Hallo MeinerEiner_80,

hab grad nen Brett vorm Kopf.Wie erzeuge ich denn einen Vector mit deaktivierten Zeilen, bzw. wie hole ich mir denn die deaktivierten Zeilen?

Die Zeilen in meinem Table werden übrigens aus einem Objekt erzeugt und in einem Vector gespeichert.Dieser Vector wird dann vom TableModel aufgerufen.Wie baue ich denn jetzt den Vector mit den deaktivierten Zeilen noch mit ein?Ich poste einen Teil meines TableModels zur Erklärung.

Code:
package gui;

import java.awt.Color;
import java.awt.Component;
import java.awt.Point;
import java.awt.Rectangle;
import java.text.DecimalFormat;
import java.util.EventObject;
import java.util.Vector;

import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.*;
import javax.swing.text.TabableView;
import javax.swing.text.TableView.TableRow;

import logic.AnlageSpiegelObjekt;
import logic.TypBPanelObjekt;

public class AnlSpglTableModel extends AbstractTableModel {

    private static final long serialVersionUID = 1L;

    private String[] headers = { "", "", "AW", "Zu", "Ab", "Umb", "EW", "",
            "AW", "Zu", "Ab", "EW", "", "AW", "EW" };

    private AnlageSpiegel anlageSpiegel;

    private Vector<AnlageSpiegelObjekt> vec_Anlagespiegel;
    
    public AnlSpglTableModel(AnlageSpiegel _anlageSpiegel) {

        anlageSpiegel = _anlageSpiegel;

        vec_Anlagespiegel = new Vector<AnlageSpiegelObjekt>();
        vec_Anlagespiegel.add(new AnlageSpiegelObjekt());
        vec_Anlagespiegel.add(new AnlageSpiegelObjekt());
        vec_Anlagespiegel.add(new AnlageSpiegelObjekt());

    }

    // Anzahl der Zeilen
    public int getRowCount() {
        return vec_Anlagespiegel.size();
    }

    // Anzahl der Spalten
    public int getColumnCount() {
        return 15;
    }

    // Spaltenköpfe werden angezeigt
    public String getColumnName(int columnIndex) {
        return headers[columnIndex];
    }

    //
    public Class getColumnClass(int columnIndex) {
        return String.class;
    }

    // Editierbarkeit der Zellen
    public boolean isCellEditable(int rowIndex, int columnIndex) {
    
            return true;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {

        Object object = new Object();

        if (rowIndex < vec_Anlagespiegel.size()) {
            AnlageSpiegelObjekt anlspObj = vec_Anlagespiegel.get(rowIndex);
            
            // Spalte 0
            if (columnIndex == 0) {
                object = "" + anlspObj.getKtoName();
            }
Gruß
ohli...
 
Ich versteh dich nicht so ganz.. du hast und nutzt doch doch die Methode disableRow(int row)? Wo hast du die denn aufgerufen? Ich hab angenommen, du wüsstest schon längst, welche Zeile zum deaktiveren gerade selektiert wurde und diese Zeile wurde dann der disableRow Methode übergeben? Oder was sollte diese Methode sonst machen?

*grüssle*
MeinerEiner
 
Moin,

Die Methode wird im Table in der Methode popUpMenu() aufgerufen.
Ich hatte gedacht die selektierte Zeile hole ich mir mit :

((AnlSpglTableModel)tabAnlSpgl.getModel()).disableRow(tabAnlSpgl.getSelectedRow());

Leider wird hier bei getSelectedRow() immer -1 ausgegeben.

Ich weiss halt nicht wie ich int disabledRow übergeben kann, bzw. sie im Vektor speichern kann.

Ich habe übrigens mal probiert im CellRenderer die methode

if (row == 2){
((JComponent)lab).setEnabled(false);
}
else{
((JComponent)lab).setEnabled(true);
}

zu setzen.Dann setzt er die 3te zeile auf disabled.Aber ich will das ja nicht statisch,sondern über das PopUpMenu setzen.

Ich hoffe du hast jetzt etwas mehr Überblick über mein Chaos bekommen.

Code:
// Popupmenu 
    void PopUpMenu() {
        popUpMenu = new JPopupMenu();
        JMenuItem hinzufuegen = new JMenuItem("Zeile hinzufügen");
        JMenuItem loeschen = new JMenuItem("Zeile löschen");
        JMenuItem einblenden = new JMenuItem("Zeile einblenden");
        JMenuItem ausblenden = new JMenuItem("Zeile ausblenden");
        

        // Kontext wird zu Popupmenu zugefügt
        popUpMenu.add(hinzufuegen);
        popUpMenu.add(loeschen);
        popUpMenu.add(einblenden);
        popUpMenu.add(ausblenden);
        

        // Actionlistener

        //Zeilen sollen ausgeblendet werden
        ausblenden.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {

                ((AnlSpglTableModel) tabAnlSpgl.getModel())
                        .disableRow(tabAnlSpgl.getSelectedRow());
                        
            }
        });
        
        // Listener für rechte Maustaste
        tabAnlSpgl.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
    
                if (evt.getButton() == java.awt.event.MouseEvent.BUTTON3) {
                    popUpMenu.show(tabAnlSpgl, evt.getX(), evt.getY());
                }
            }
        });

gruß
ohli...
 
Moin!
Ich hab dir mal skizziert, wie du die zu deaktivierende Zeile erhälst...

Code:
       // Listener für rechte Maustaste
        tabAnlSpgl.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
    
                if (evt.getButton() == java.awt.event.MouseEvent.BUTTON3) {
                    Point p = evt.getPoint();
                    disablerow = tabAnlSpgl.rowAtPoint(p);					
                    popUpMenu.show(tabAnlSpgl, evt.getX(), evt.getY());
                }
            }
        });

Diese disableRow Variable solltest du dir merken, und wenn du dann im PopupMenu auswählst, das du die Zeile deaktivieren willst, übergibst du sie der Methode..



Code:
        //Zeilen sollen ausgeblendet werden
        ausblenden.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {

                ((AnlSpglTableModel) tabAnlSpgl.getModel())
                        .disableRow(disablerow);
                        
            }
        });

Der Rest ist dann wie gehabt..

*grüssle*
MeinerEiner
 
Moin,

irgendwie hat das alles nicht so funktioniert, wie ich mir das vorgestellt habe.Ich habe es jetzt aber anders gelöst.Ich habe die Methode disableRow() in den CellRenderer geschoben und habe sie so umgeschrieben, das sich beim aktivieren des Popupmenus die zeile verkleinert, so das sie fast nicht mehr sichtbar ist.Ist auch ne recht gute lösung wie ich finde:) Danke für deine Hilfe @Meiner_Einer.Du hast mich in die richtige Richtung geführt.

Gruß
ohli...
 

Neue Beiträge

Zurück