Swing Einzelne Zeile in jTable selektieren klappt nicht

VfL_Freak

Top Contributor
Moin zusammen,
ich habe in einer Anwendung div. Reiter mit jeweils eigenen Tables.
Dort werden u. a. weitere Anwendungen (Clients) und ihre Lizenzen verwaltet. Zu jeder Client-Tabelle gehört eine entsprechende Lizenz-Tabelle.

Während man nun in den Lizenz-Tabelle lustig per Mouseclick einizelne Zeilen markieren kann, klappt dies in den Client-Tabellen leider nicht. Dort bekomme ich rein gar nix markiert .... :-(

Beispiel:
Java:
    private void createTableWorkerLiz()
   {
       m_DataReportWorkerLizenzen = new LicenseDBWorkerDataReport( this );
       m_TableWorkerLizenzen = new JTable();
       m_TableWorkerLizenzen.setAutoCreateColumnsFromModel( false );
       m_TableWorkerLizenzen.setModel( m_DataReportWorkerLizenzen );
       for( int spalte = 0; spalte < LicenseDBWorkerDataReport.m_columns.length; spalte++ )
       {
           TableCellRenderer renderer;
           switch( spalte )
           {
               case LicenseDBWorkerDataReport.COL_AKTIV:
               case LicenseDBWorkerDataReport.COL_FEATUREPUTONHOLD:
        // und weitere ...
               {
                   renderer = new CheckCellRenderer();
                   break;
               }

               case LicenseDBWorkerDataReport.COL_BTNEDIT:
               case LicenseDBWorkerDataReport.COL_BTNDELETE:
               {
                   renderer = new LicenseDBButtonRenderer();
                   break;
               }

               default:
               {
                   ColoredLicenseTableCellRenderer ctr = new ColoredLicenseTableCellRenderer();
                   ctr.setHorizontalAlignment( LicenseDBWorkerDataReport.m_columns[spalte].m_alignment );
                   renderer = ctr;
               }
           } // switch

           TableCellEditor editor = null;
           switch( spalte )
           {
               case LicenseDBWorkerDataReport.COL_AKTIV:
               {
                   JCheckBox cbActive = new JCheckBox();
                   cbActive.setHorizontalAlignment( JCheckBox.CENTER );
                   cbActive.setBackground( m_TableWorkerLizenzen.getBackground() );
                   editor = new DefaultCellEditor( cbActive );
                   ((DefaultCellEditor)editor).setClickCountToStart( 2 );
                   cbActive.addActionListener( new mainFrame_jCheckBoxWorkerLicenseActive_actionAdapter(this) );
                   break;
               }
        // weitere cases für alle Spalten
               case LicenseDBWorkerDataReport.COL_BTNEDIT:
               case LicenseDBWorkerDataReport.COL_BTNDELETE:
               {
                   editor = new LicenseDBButtonEditor( this, new JCheckBox(), "Push me!", "Ouch", LT_WORKER );
                   editor.addCellEditorListener( new LicenseDBCellListener(m_TableWorkerLizenzen,spalte,"Side A","Side B") );
                   break;
               }

               default:
                   editor = null;
           } // switch

           TableColumn column = new TableColumn( spalte, LicenseDBWorkerDataReport.m_columns[spalte].m_width, renderer, editor );
           column.setHeaderRenderer( createDefaultRenderer() );
           m_TableWorkerLizenzen.addColumn( column );
       } // for

       JTableHeader headerWorker = m_TableWorkerLizenzen.getTableHeader();
       headerWorker.setUpdateTableInRealTime( true );
       headerWorker.addMouseListener( new WorkerLizenzColumnListener() );
       headerWorker.setReorderingAllowed( true );
       spnWorkerLizenzen.getViewport().add( m_TableWorkerLizenzen );

       rowHeaderTableWorkerLizenzen = new JList<Object>( new TableListModel(m_TableWorkerLizenzen) );
       rowHeaderTableWorkerLizenzen.setFixedCellWidth( 30 );
       rowHeaderTableWorkerLizenzen.setBackground( spnWorkerLizenzen.getBackground() );
       rowHeaderTableWorkerLizenzen.setFixedCellHeight( m_TableWorkerLizenzen.getRowHeight() );
       rowHeaderTableWorkerLizenzen.setCellRenderer( new RowHeaderRenderer(m_TableWorkerLizenzen) );
       rowHeaderTableWorkerLizenzen.addMouseListener( new MouseAdapter()
       {
           public void mouseClicked( MouseEvent e )
           {
               int index = rowHeaderTableWorkerLizenzen.locationToIndex( e.getPoint() );
               m_TableWorkerLizenzen.setRowSelectionInterval( index, index );
               m_TableWorkerLizenzen.requestFocus();
           }
       });
       spnWorkerLizenzen.setRowHeaderView( rowHeaderTableWorkerLizenzen );
       rowHeaderTableWorkerLizenzen.repaint();
   } // createTableWorkerLiz
Java:
    /**
    * @brief Erzeugt eine JTable für den Reiter <tt>Worker</tt> und fügt sie in das zugehörige Panel ein
    */
   private void createTableWorker()
   {
       m_DataReportWorker = new WorkerDataReport( this, LT_WORKER );
       m_TableWorker = new JTable();
       m_TableWorker.setAutoCreateColumnsFromModel( false );
       m_TableWorker.setModel( m_DataReportWorker );

    // #######################################################
    // ##### diese drei Zeilen habe ich neu eingefügt !! #####
       m_TableWorker.setSelectionMode( ListSelectionModel.SINGLE_INTERVAL_SELECTION );
       m_TableWorker.setColumnSelectionAllowed( false );
       m_TableWorker.setRowSelectionAllowed( true );
    // #######################################################

       for( int k = 0; k < WorkerDataReport.m_columns.length; k++ )
       {
           TableCellRenderer renderer;
           if( k == WorkerDataReport.COL_LICENSE_AKTIV )
           {
               renderer = new CheckCellRenderer();
           }
           else
           {
               ColoredWorkerTableCellRenderer ctr = new ColoredWorkerTableCellRenderer();
               ctr.setHorizontalAlignment( WorkerDataReport.m_columns[k].m_alignment );
               renderer = ctr;
           }

           TableCellEditor editor;
           if( k == WorkerDataReport.COL_LICENSE_AKTIV )
           {
               JCheckBox cbActive = new JCheckBox();
               cbActive.setHorizontalAlignment(JCheckBox.CENTER);
               cbActive.setBackground(m_TableWorker.getBackground());
               editor = new DefaultCellEditor(cbActive);
               ((DefaultCellEditor)editor).setClickCountToStart( 2 );
               cbActive.addActionListener( new mainFrame_jCheckBoxWorkerIsLicenseActive_actionAdapter(this) );
           }
           else
           {
               editor = new DefaultCellEditor(new JTextField());
           }
           TableColumn column = new TableColumn( k, WorkerDataReport.m_columns[k].m_width, renderer, editor );
           column.setHeaderRenderer( createDefaultRenderer() );
           m_TableWorker.addColumn( column );
       }

       JTableHeader headerWorker = m_TableWorker.getTableHeader();
       headerWorker.setUpdateTableInRealTime( true );
       headerWorker.addMouseListener( new WorkerColumnListener() );
       headerWorker.setReorderingAllowed( true );
       spnWorkerData.getViewport().add( m_TableWorker );

       rowHeaderTableWorker = new JList<Object>( new TableListModel(m_TableWorker) );
       rowHeaderTableWorker.setFixedCellWidth( 30 );
       rowHeaderTableWorker.setBackground( spnWorkerData.getBackground() );
       rowHeaderTableWorker.setFixedCellHeight( m_TableWorker.getRowHeight() );
       rowHeaderTableWorker.setCellRenderer( new RowHeaderRenderer(m_TableWorker) );
       rowHeaderTableWorker.addMouseListener( new MouseAdapter()
       {
           public void mouseClicked( MouseEvent e )
           {
               int index = rowHeaderTableWorker.locationToIndex( e.getPoint() );
               m_TableWorker.setRowSelectionInterval( index, index );
               m_TableWorker.requestFocus();
           }
       });

       spnWorkerData.setRowHeaderView( rowHeaderTableWorker );
       rowHeaderTableWorker.repaint();
   } // createTableWorker
Ich habe im zweiten Beispiel versucht, mit "setSelectionMode" etc. die Tabelle zum Markieren zu bewegen, aber leider ergebnislos, obwohl dies im Web vielfach beschrieben so wird!

Die jeweils verwendeten Renderer dürften doch keine Rolle spielen, oder ?

Ich hoffe, dass irgendwem ein Lapsus meinerseits aufällt ...

Danke und VG
Klaus
 

truesoul

Top Contributor
Hallo.
schon mal mit setCellSelectionEnabled(true) versucht?

Ich vermute du hast auch schon setSelectionMode geändert?
Könnte setColumnSelectionAllowed( false ); vielleicht das Problem sein?

Habe schon länger nichts mit JTable gemacht aber das sind, mit kurzen Blick, die Sache die auffällig sind.

Vielleicht hat etwas anderes den Fokus dauerhaft?

Alles nur Vermutung. :)

Grüße
 

VfL_Freak

Top Contributor
Moinsen,
schon mal mit setCellSelectionEnabled(true) versucht?
ja, gerade ;-) bewirkt aber auch nichts!

Ich vermute du hast auch schon setSelectionMode geändert?
ja, habe ich im Beispiel "funktioniert nicht" ganz oben eingefügt!
ist auch in den funktionierenden Tabelle NICHT vorhanden ...

Könnte setColumnSelectionAllowed( false ); vielleicht das Problem sein?
So wie ich es verstanden habe, muss ich doch "RowSelectionAllowed" auf TRUE und "ColumnSelectionAllowed" auf FALSE setzen, damit klar ist, dass zeilen und keine Spalten selektiert werden sollen, oder ??

VG Klaus
 

truesoul

Top Contributor
So wie ich es verstanden habe, muss ich doch "RowSelectionAllowed" auf TRUE und "ColumnSelectionAllowed" auf FALSE setzen, damit klar ist, dass zeilen und keine Spalten selektiert werden sollen, oder ??

Ganz ehrlich, weiß ich nicht, aber ich würde beides auf True setzen. Was du aber sicher schon gemacht hast.

Und sowas wie das:

Java:
jTable1.addMouseListener(new java.awt.event.MouseAdapter() {
@Override
public void mouseClicked(java.awt.event.MouseEvent evt) {
    int row = jTable1.rowAtPoint(evt.getPoint());
    int col = jTable1.columnAtPoint(evt.getPoint());
    
}
});

Grüße
 

truesoul

Top Contributor
So... ein Beispiel:

Java:
public static void main(String[] a) {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    final JTable table;

    String[] columnTitles = { "A", "B", "C", "D" };
    Object[][] rowData = { { "11", "12", "13", "14" }, { "21", "22", "23", "24" }, { "31", "32", "33", "34" },
            { "41", "42", "44", "44" } };

    table = new JTable(rowData, columnTitles);

    table.setCellSelectionEnabled(true);
    ListSelectionModel cellSelectionModel = table.getSelectionModel();
    cellSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
    table.setColumnSelectionAllowed(false);
    table.setRowSelectionAllowed(false);

    cellSelectionModel.addListSelectionListener(new ListSelectionListener() {
        public void valueChanged(ListSelectionEvent e) {
            String selectedData = null;

            int[] selectedRow = table.getSelectedRows();
            int[] selectedColumns = table.getSelectedColumns();

            for (int i = 0; i < selectedRow.length; i++) {
                for (int j = 0; j < selectedColumns.length; j++) {
                    selectedData = (String) table.getValueAt(selectedRow[i], selectedColumns[j]);
                }
            }
            System.out.println("Selected: " + selectedData);
        }

    });

    frame.add(new JScrollPane(table));

    frame.setSize(300, 200);
    frame.setVisible(true);
}

Wenn du die zwei Zeilen

Java:
    table.setColumnSelectionAllowed(false);
    table.setRowSelectionAllowed(false);

auskommentierst oder wenn du beides auf True setzt werden Zellen markiert. Ansonsten verhält es sich anders.
 

VfL_Freak

Top Contributor
hmm, ich sehe zwar im SysOut dem jeweiligen Zellenwert, aber von Selektion keine Spur :(
Und bis auf den Listener ist ja auch dass, was ich in meinen beiden Code auch drin habe ....
Habe mir nochmal die Renderer angeschaut, aber auch machen hier nix Aufregendes!

Bin inzwischen reichlich ratlos ... :mad:
 

VfL_Freak

Top Contributor
Moin,
Konntest du es denn mittlerweile raus finden?
ja, gestern Abend bin ich drauf gekommen, dass es noch einen weiteren CellRender gab, der von mir (bedingt durch eine sehr unglückliche Namensgebung seitens meines Vorgängers) stumpf übersehen worden war :(
Hier fehlte dann das spezifische Setzen des “SelectionFore/Backgrounds” …
Jetzt funktionierts :)

Wenn nicht, neu machen
Das wäre bei DER Anwendung nun wirklich keine Option gewesen ..... :p

VG Klaus
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P JTextArea - einzelne Zeile löschen bzw einfügn AWT, Swing, JavaFX & SWT 2
A Mit JavaFX einzelne Zeilen in TableView farbig markieren AWT, Swing, JavaFX & SWT 5
P AWT Einzelne Komponenten zur Laufzeit austauschen? AWT, Swing, JavaFX & SWT 3
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
J JavaFX TabPane / Wie füge ich einzelne items ? AWT, Swing, JavaFX & SWT 1
S JavaFX TableView einzelne Zelle Layout zuweisen AWT, Swing, JavaFX & SWT 3
T AWT Grafik"Array" einzelne Elemente verschieben AWT, Swing, JavaFX & SWT 1
S Swing JTable - Einzelne Rows einfärben AWT, Swing, JavaFX & SWT 11
L Swing CellRenderer für einzelne Zellen? AWT, Swing, JavaFX & SWT 5
N jFreeChart einzelne Punkte anwählen und Formatieren AWT, Swing, JavaFX & SWT 0
M JavaFX TextArea einzelne Buchstaben färben AWT, Swing, JavaFX & SWT 3
T Swing Einzelne Teile eines Textes färben? AWT, Swing, JavaFX & SWT 10
M Einzelne Ordner im JFileChooser ausgrauen? AWT, Swing, JavaFX & SWT 4
D Swing Mit TableCellRenderer einzelne Zellen markieren AWT, Swing, JavaFX & SWT 3
R einzelne Zeichen in jTable einlesen AWT, Swing, JavaFX & SWT 10
M Swing Einzelne Fenster schließen AWT, Swing, JavaFX & SWT 2
V JTable: Zugriff auf einzelne Zellen AWT, Swing, JavaFX & SWT 4
K Swing CellEditor für einzelne Zellen AWT, Swing, JavaFX & SWT 2
K Swing JTable Editierfunktion für einzelne Zellen ausschalten AWT, Swing, JavaFX & SWT 3
S Einzelne JComboBox in JTable austauschen AWT, Swing, JavaFX & SWT 4
F Einzelne TreeNode an einem JTree editierbar machen AWT, Swing, JavaFX & SWT 3
C JTree Einzelne Objekte färben AWT, Swing, JavaFX & SWT 4
C Spielfeld Gitter - Einzelne Zellen verändern AWT, Swing, JavaFX & SWT 18
J CellRenderer einzelne zellen Hintergrund AWT, Swing, JavaFX & SWT 9
B Swing Einzelne Zelle in JTable soll NICHT auswählbar sein AWT, Swing, JavaFX & SWT 9
M JTable einzelne Zeilen färben AWT, Swing, JavaFX & SWT 2
A Swing JTree Editable einzelne Nodes editierbar machen! AWT, Swing, JavaFX & SWT 2
T einzelne Zelle einer JTable auswählen und Hintergrundfarbe ändern AWT, Swing, JavaFX & SWT 2
T JTable - Einzelne Spalte nicht sortieren? AWT, Swing, JavaFX & SWT 2
R JTable einzelne Zellen selektieren AWT, Swing, JavaFX & SWT 7
H Einzelne Pixel auf Transparenz überprüfen? AWT, Swing, JavaFX & SWT 3
J JTable: Einzelne Zelle selektieren AWT, Swing, JavaFX & SWT 6
X Einzelne Border setzen AWT, Swing, JavaFX & SWT 2
F png-Datei erstellen und einzelne Pixel schreiben AWT, Swing, JavaFX & SWT 2
J MVC- einzelne Sichten auf einer Hauptsicht anzeigen AWT, Swing, JavaFX & SWT 3
S Einzelne Frame Fenster schließen AWT, Swing, JavaFX & SWT 2
S Einzelne Frame Fenster schließen AWT, Swing, JavaFX & SWT 2
G Einzelne Objekte neu zeichnen AWT, Swing, JavaFX & SWT 8
B einzelne Zellen scrollbar machen innerhalb einer Tabelle AWT, Swing, JavaFX & SWT 3
E JTable einzelne reihe editierbar machen AWT, Swing, JavaFX & SWT 2
I einzelne Zellen bei JTable markieren AWT, Swing, JavaFX & SWT 3
C JTable: Einzelne Spalten nicht editierbar machen AWT, Swing, JavaFX & SWT 2
M JavaFX TableView nur erste Zeile editable machen und gelb markieren AWT, Swing, JavaFX & SWT 0
F Zeile in mehreren Jtables bei Selektion markieren AWT, Swing, JavaFX & SWT 11
missy72 JavaFX TableRow / RowFactory Zeile einfärben AWT, Swing, JavaFX & SWT 9
T Zelle- und die Zeile-Farbenwechsel bei der Selektion in der Tabelle AWT, Swing, JavaFX & SWT 4
M TableView Zeile hinzufügen AWT, Swing, JavaFX & SWT 5
I JLabel neue Zeile AWT, Swing, JavaFX & SWT 4
B JavaFX TableView eine Zeile markieren AWT, Swing, JavaFX & SWT 5
C SWT Breadcrumb Zeile mit entsprechenden Hyperlinks erstellen AWT, Swing, JavaFX & SWT 0
Bluedaishi JTextArea gefundene Zeile nach Oben Scrollen AWT, Swing, JavaFX & SWT 13
B Zeile einer Tabelle selektieren AWT, Swing, JavaFX & SWT 1
T Swing Tabelle mit Button - Anzeigefehler nach Zeile entfernen AWT, Swing, JavaFX & SWT 1
T Swing JTable Zeile mit ausgelesenen Werten mit Hilfe von einem Button hinzufügen AWT, Swing, JavaFX & SWT 1
D JLabel bei Aufruf neue Zeile AWT, Swing, JavaFX & SWT 5
C Button Text in JList neue Zeile AWT, Swing, JavaFX & SWT 6
J Swing JTable Zeile nicht auswählbar machen AWT, Swing, JavaFX & SWT 0
F Swing String[] in JTextArea ausgeben. Jeder Eintrag in neue Zeile, aber ohne "\n"- Geht das? AWT, Swing, JavaFX & SWT 3
N AWT Markierte Zeile jList aus mySQL DB löschen AWT, Swing, JavaFX & SWT 2
J JTable Zeile anklicken und neues Frame öffnen AWT, Swing, JavaFX & SWT 4
S JTable nach aktualisierung - neue Zeile nicht "klickbar" AWT, Swing, JavaFX & SWT 0
D Swing Letzte Zeile einer JTable nicht über RowSorter sotieren AWT, Swing, JavaFX & SWT 2
M Text Area 1. Zeile oben AWT, Swing, JavaFX & SWT 4
I ausgewählte Zeile mit Hilfe der Tastatur löschen! AWT, Swing, JavaFX & SWT 3
B jTable ganze Zeile anhand eines Kriterium färben AWT, Swing, JavaFX & SWT 6
T JtextPane Zeile aktualisieren AWT, Swing, JavaFX & SWT 3
M JTextArea Zeile hinzufügen AWT, Swing, JavaFX & SWT 4
M Swing JScrollPane (Parent JTextArea) aktualisieren + neue Zeile AWT, Swing, JavaFX & SWT 5
P Swing Alle Zeilen einer Spalte (jTable) zusammen zählen und in eine eigene Zeile das Ergebnis schreiben. AWT, Swing, JavaFX & SWT 7
Ollek Swing JTable - Zeile löschen mit AbstractTableModel AWT, Swing, JavaFX & SWT 20
S Swing Kopieren einer vollständigen Zeile einer JTable AWT, Swing, JavaFX & SWT 3
F GroupableTableHeader zeigt nur eine Zeile AWT, Swing, JavaFX & SWT 4
H Unterschiedliche JComboBox je JTable Zeile AWT, Swing, JavaFX & SWT 4
N Swing FileReader Zeile lesen AWT, Swing, JavaFX & SWT 5
C SWT Wie greife ich auf den Inhalt einer bestimmten Zeile zu? (TableViewer) AWT, Swing, JavaFX & SWT 7
F SWT Tabelle Zeile auslesen AWT, Swing, JavaFX & SWT 3
J Swing JTable: Komplette Zeile aber ohne Spalten markieren AWT, Swing, JavaFX & SWT 11
K Zeile verbinden AWT, Swing, JavaFX & SWT 2
G Zeile in JTable durch rechte Maustaste manipulieren AWT, Swing, JavaFX & SWT 4
S Swing AWT-Exception bei JTable mit JComboBox beim Löschen der letzten Zeile AWT, Swing, JavaFX & SWT 3
S Tabelle sortieren, mit Ausnahme der letzten Zeile AWT, Swing, JavaFX & SWT 9
P Aktuelle Zeile in JTextPane farblich hervorheben AWT, Swing, JavaFX & SWT 3
H Swing JComboBox in einer Zeile AWT, Swing, JavaFX & SWT 3
Meldanor Swing JTable - Eine neue Zeile vor einer bestehenden Einfügen AWT, Swing, JavaFX & SWT 2
F Zusätzliche Zeile in der GUI AWT, Swing, JavaFX & SWT 4
H Zeile in DefaultTableModel hinzufügen, ProgressBar AWT, Swing, JavaFX & SWT 4
H Markierte Zeile löschen AbstractTableModel AWT, Swing, JavaFX & SWT 10
R Zeile in JTable anhand von Wert einfärben AWT, Swing, JavaFX & SWT 2
M Jframe wie bekommt man bei den zeile einen header erzeugen AWT, Swing, JavaFX & SWT 2
N JTable, Zeile bleibt immer selektiert.... AWT, Swing, JavaFX & SWT 3
Dit_ JTextArea zu Zeile X scrollen AWT, Swing, JavaFX & SWT 4
M [erledigt] Bestimmte Zeile aus JTextArea löschen AWT, Swing, JavaFX & SWT 3
F Swing JTable: Problem beim zeile löschen AWT, Swing, JavaFX & SWT 3
J Swing JList... mehrere Strings in Zeile AWT, Swing, JavaFX & SWT 8
N Methode zum ermitteln der editierte Zeile/Zelle in jTable AWT, Swing, JavaFX & SWT 8
C Mit SelectionListener herausfinden welche zeile in Jtable angeklickt wurde AWT, Swing, JavaFX & SWT 5
E In JTable neue Zeile mit Tabulator einfügen AWT, Swing, JavaFX & SWT 5
M Text in txt-Datei in letzte Zeile schreiben? AWT, Swing, JavaFX & SWT 14
R JTable Hintergrund der Zeile abhängig von Inhalt einer Zelle verändern AWT, Swing, JavaFX & SWT 3
Developer_X Swing text von bestimmter zeile in jtextarea herausbekommen. AWT, Swing, JavaFX & SWT 12

Ähnliche Java Themen

Neue Themen


Oben