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
 
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
 
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
 
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
 
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.
 
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 ... 😡
 
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 ..... 😛

VG Klaus
 

Zurück
Oben