Fokusproblem mit Button in JTable

S

schiriki235

Hallo,

ich habe eine JTable, die mir Werte aus einer Datenbank liest und dann in drei zusätzlichen Spalten noch Buttons zum Editieren bereitstellt.

Die Struktur sieht so aus:

ID | Bezeichnung | momentane Länge | maximale Länge | Button 1 | Button 2 | Button 3

Wobei als einzige Spalte die "momentane Länge" editierbar ist.
Button 1 übernimmt die maximale Länge in die momentane Länge, Button 2 öffnet einen Weblink und Button 3 öffnet einen Dialog mit einer TextArea, damit man noch Kommentare speichern kann.

Mein Problem ist jetzt folgendes - wenn ich einen Button klicke, verliert die Zelle danach den Fokus nicht und ich muss erst eine andere Zelle fokussieren, damit ich den Button erneut klicken kann. Das ist bei Button 1 und Button 2 nicht so tragisch, weil man die im Normalfall nicht so oft direkt hintereinander klicken will. Bei Button 3 ist es aber richtig nervig.

Ich habe schon mit verschiedenen Kombinationen von CellRenderer, CellEditor und ActionListener herumgespielt, aber noch keine endgültige Lösung gefunden.

Meine momentane Lösung kommt ohne ActionListener aus und verwendet die folgenden Renderer bzw. Editor-Klasse:

Code:
	class ButtonCellRenderer extends DefaultTableCellRenderer implements TableCellRenderer {

		private JButton button;
		private ButtonColumn col;
		
		ButtonCellRenderer(ButtonColumn col) {
			this.col = col;
			
			button = new JButton();
			button.setText("");
			button.setFocusable(false);
			
			switch (col) {
			case COPY_VALUE:
				button.setIcon(icon_copy);
				break;
			case LINK:
				button.setIcon(icon_link);
				break;
			case NOTE:
				button.setText("...");
				button.setForeground(Color.RED);
			}
		}

		@Override
		public Component getTableCellRendererComponent(final JTable table, Object value,
                boolean isSelected, boolean hasFocus, final int rowIndex, int colIndex) {
			
			if (col == ButtonColumn.NOTE) {
				if (value instanceof Boolean && (Boolean) value)
					button.setForeground(Color.GREEN);
				else
					button.setForeground(Color.RED);
			}
			return button;
		}
	}

Code:
	class ButtonCellEditor  extends AbstractCellEditor implements TableCellEditor {

		JButton button = new JButton();
		private ButtonColumn col;
		
		ButtonCellEditor(ButtonColumn col) {
			this.col = col;
			button.setText("");
			button.setFocusable(false);
			
			switch (col) {
			case COPY_VALUE:
				button.setIcon(icon_copy);
				break;
			case LINK:
				button.setIcon(icon_link);
				break;
			case NOTE:
				button.setText("...");
				button.setForeground(Color.RED);
			}
		}
    
        public Component getTableCellEditorComponent(JTable table, Object value,
                boolean isSelected, int rowIndex, int colIndex) {
            
        	switch (col) {
			case COPY_VALUE:
				table.setValueAt(table.getValueAt(rowIndex, COL_MAXPOSTS), rowIndex, COL_POSTS);
				break;
			case LINK:
				try {
					java.awt.Desktop.getDesktop().browse(new URI("http://www.example.com"));
				} catch (Exception e) {
					JOptionPane.showMessageDialog(MainFrame.this, "Link konnte leider nicht geöffnet werden.");
				}
				break;
			case NOTE:
				NoteDialog nd = new NoteDialog(MainFrame.this, "Notiz");
				tid = table.getValueAt(rowIndex, COL_ID).toString();
				nd.setNote(DatabaseConnection.getNote(chosenArea, tid));
				nd.setVisible(true);
				
				String note = nd.getNote().trim();
				DatabaseConnection.storeNote(chosenArea, tid, note.length()!=0?note:null);
				
				value = note.length() != 0;
			}
            return button;
        }
        
        public Object getCellEditorValue() {
            return new Object();
        }
    }

Am liebsten wäre es mir, wenn man die entsprechenden Zellen einfach gar nicht fokussieren könnte. Bei normalen JButtons klappt es ja auch, dass man sie anklicken kann, ohne dass sie dabei den Fokus bekommen. Aber leider habe ich dafür bisher noch keine Möglichkeit gefunden.

Wie kann ich also die JButtons in die Tabelle einbinden, sodass ich sie auch mehrmals hintereinander anklicken kann, ohne den Fokus manuell vorher wegzunehmen bzw. wie kann ich den Fokus nach einem Klick auf den Button automatisch auf eine andere Zelle setzen, das würde das Problem ja auch mehr oder weniger lösen?

Danke :)
 
wie kann ich den Fokus nach einem Klick auf den Button automatisch auf eine andere Zelle setzen, das würde das Problem ja auch mehr oder weniger lösen?

Hm, n Listener auf den Button setzen und in diesem andereZelle.requestFocus aufrufen fällt mir grad spontan ein. Respektive: du wirst wohl sowieso schon n ActionListener drauf haben, also am Ende vom actionPerformed(...)
Java:
table.setCellSelectionEnabled(true);
table.changeSelection(gewünschteRow, gewünschteColumn, false, false);
table.requestFocus();

Ich hoffe ich habe dein Problem richtig verstanden ;)

Gruss
 
Zurück