JButton in Zelle von JTable

Olli123

Mitglied
Hallo liebe Java-Community!

Mein erster Beitrag ist gleich eine Frage zum Thema "Wie bekomme ich einen JButton in eine Zelle von einem JTable". Nachdem ich mehrere Stunden mich mit dem Thema Cellrenderer befasst habe, stellt sich bei mir die Frage ob es auch möglich ist nur in eine einzige Zelle einen Button zu implementieren, der sich nach einmaligen drücken "auflöst" und einen String mit der aktuellen Uhrzeit hinterlässt, die ich zuvor in einem JLabel generieren lasse.
Das heißt der Benutzer soll die Möglichkeit haben den Button zu klicken, sodass in diese Zelle wo der Button sich befindet, sich danach die Uhrzeit befindet.

Ich habe dafür schon einige Überlegungen angestellt wie ich das programmieren könnte und habe folgende Quelltexte für euch:


*Buttonrenderer* erschafft einen Button in einer Tabelle, die übergegeben werden muss.
Java:
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
/**
 *
 * @author Olli
 */
public class Buttonrenderer implements TableCellRenderer {

    JButton button = new JButton();

    public Component getTableCellRendererComponent(JTable table,
                                                   Object value,
                                                   boolean isSelected,
                                                   boolean hasFocus,
                                                   int row, int column) {
        button.setText(value.toString());
        return button;
}
}


*ButtonEditor* gibt die Möglichkeit dem Button eine Funktion beim Klicken zuzuweisen
Java:
import java.awt.*;
import java.awt.event.*;
import java.util.EventObject;
import javax.swing.*;
import javax.swing.table.*;
/**
 *
 * @author Olli
 */
public class ButtonEditor extends AbstractCellEditor implements TableCellEditor,
                                                         ActionListener {
    JTable table;
    JButton button = new JButton();
    int clickCountToStart = 1;

    public ButtonEditor(JTable table) {
        this.table = table;
        button.addActionListener(this);
    }

    public void actionPerformed(ActionEvent e) {

        meineMainClass.insertTime();// hier steht dann die Methode zum Zeitübertragen in die Zelle
        table.remove(button); // funktionniert nicht so wie ich es mir vorstelle xD
    }

    public Component getTableCellEditorComponent(JTable table,
                                                 Object value,
                                                 boolean isSelected,
                                                 int row, int column) {
        button.setText(value.toString());
        return button;
    }

    public Object getCellEditorValue() {
        return button.getText();
    }

    public boolean isCellEditable(EventObject anEvent) {
        if(anEvent instanceof MouseEvent) {
            return ((MouseEvent)anEvent).getClickCount() >= clickCountToStart;
        }
        return true;
    }

    public boolean shouldSelectCell(EventObject anEvent) {
        return true;
    }

    public boolean stopCellEditing() {
        return super.stopCellEditing();
    }

    public void cancelCellEditing() {
        super.cancelCellEditing();
    }
}



im Konstruktor der Main-Klasse:
Java:
        buttonrenderer = new Buttonrenderer();
        meineTabelle.getColumnModel().getColumn(7).setCellRenderer(buttonrenderer);
        meineTabelle.getColumnModel().getColumn(7).setCellEditor(new ButtonEditor(meineTabelle));



Methode insertTime() in der MainClass:
Java:
meineTabelle.setValueAt(jLabel.getText(), currentRow, 7); 
// jLabel generiert die Zeit und currentRow mit Column Platz "7" ist quasi der Vektor oder die Referenz auf die gewünschte Zelle






Ich hoffe ich habe alles Nötige dazu gepostet und würde mich riesig freuen wenn mir dabei jemand weiterhelfen könnte. Falls Erklärungen noch fehlen sollten, reiche ich diese natürlich gerne nach, welches hoffentlich nicht der Fall sein sollte =).

Vielen Dank schon mal im Vorraus ;)

Grüße Olli123
 

Michael...

Top Contributor
Nachdem ich mehrere Stunden mich mit dem Thema Cellrenderer befasst habe, stellt sich bei mir die Frage ob es auch möglich ist nur in eine einzige Zelle einen Button zu implementieren, der sich nach einmaligen drücken "auflöst" und einen String mit der aktuellen Uhrzeit hinterlässt, die ich zuvor in einem JLabel generieren lasse.
Ja sowas ist recht einfach umzusetzen, wobei das JLabel in dem die Uhrzeit "generiert" wird eher überflüssig zu sein scheint - ausser es wird irgendwo im GUI eingebaut.
Die Lösung liegt hier im TableModel und im Renderer.

Ein ButtonEditor ist m.M. nicht unbedingt nötig, sowas wäre auch mit einem simplen MouseListener/Adapter möglich.

Man könnte dem TableModel für die "Button" Zellen ein eigens definiertes Objekt übergeben. Für diese Objektklasse setzt man per setDefaultTableCellRenderer(...) einen ButtonRenderer (wenn's unbedingt aussehen muss wie ein JButton). Wird auf die Zelle geklickt, setzt der MouseListener/ButtonEditor einfach die Zeit als String ins TableModel und schon wird der normale Renderer für Strings verwendet.
 

Olli123

Mitglied
das JLabel ist in der gui verankert und wird dort auch benötigt.

Man könnte dem TableModel für die "Button" Zellen ein eigens definiertes Objekt übergeben. Für diese Objektklasse setzt man per setDefaultTableCellRenderer(...) einen ButtonRenderer (wenn's unbedingt aussehen muss wie ein JButton). Wird auf die Zelle geklickt, setzt der MouseListener/ButtonEditor einfach die Zeit als String ins TableModel und schon wird der normale Renderer für Strings verwendet.

Wie meinst du das? Könntest du wenn es geht mal nen kleinen Ausschnitt schreiben? Wäre echt nett, da ich gerade nicht verstehe was du genau meinst... Oder wo müsste ich das denn einbauen?

Viele Grüße

Olli123
 

Michael...

Top Contributor
Hatte nicht bedacht, dass die JTable bzw. das TableModel den Datentyp auch nur spaltenweise definieren kann.

Hier mal ein Bsp mit einem "doppelten" Renderer:
Java:
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.DateFormat;
import java.util.Calendar;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class AnotherTableDemo extends JFrame {

	class Hurz {}

	public AnotherTableDemo() {
		final Hurz hurz = new Hurz();
		final JTable table = new JTable(
				new Object[][] {{hurz}, {hurz}, {"a string"},{hurz}, {"another string"}},
				new String[] {"Press To Change"}) {
			public boolean isCellEditable(int row, int column) {
				return false;
			}
		};
		table.setDefaultRenderer(Object.class, new HurzRenderer());
		this.getContentPane().add(new JScrollPane(table));
		
		table.addMouseListener(new MouseAdapter() {
			DateFormat df = DateFormat.getTimeInstance();
			public void mouseClicked(MouseEvent e) {
				int row = table.rowAtPoint(e.getPoint());
				int column = table.columnAtPoint(e.getPoint());
				if (table.getValueAt(row, column) instanceof Hurz) {
					Calendar calendar = Calendar.getInstance();
					table.setValueAt(df.format(calendar.getTime()), row, column);
				}
			}
		});
	}

	class HurzRenderer extends DefaultTableCellRenderer {
		private JButton button = new JButton("Press Me!");

		public Component getTableCellRendererComponent(JTable table,
				Object value, boolean isSelected, boolean hasFocus, int row, int col) {
			if (value instanceof Hurz)
				return button;
			super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
			return this;
		}
	}

	public static void main(String[] s) {
		JFrame frame = new AnotherTableDemo();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setBounds(0, 0, 300, 300);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}
}
 

Olli123

Mitglied
Boar stark!!! Viiiiiiiiiiiiiiieeeeeeeeeeelen lieben Dank!!! es funktionniert super!! :applaus::applaus::applaus: genau so soll es funktionieren =). habs ein wenig angepasst und es funktioniert wunderbar!

Ich denke das thema ist damit erledigt =)


grüße

olli123
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G JButton mit importFiles-Funktion auf JDrawPane AWT, Swing, JavaFX & SWT 5
B JButton Search AWT, Swing, JavaFX & SWT 8
B Swing JButton mit KeyListener AWT, Swing, JavaFX & SWT 3
L JButton durch Mausklick auslösen und Enter-Taste AWT, Swing, JavaFX & SWT 2
N Erlennen ob JButton gedrückt ist AWT, Swing, JavaFX & SWT 6
D JButton Form verändern AWT, Swing, JavaFX & SWT 4
R Grafik per JButton laden und austauschen lassen AWT, Swing, JavaFX & SWT 14
SvenPittelkow Programm soll auf JButton warten bis der geklickt wurde AWT, Swing, JavaFX & SWT 1
Badebay Problem mit JButton AWT, Swing, JavaFX & SWT 2
Z Swing Drag and Drop mit einem JButton AWT, Swing, JavaFX & SWT 1
Z Swing Kann man auf JButton zeichenen AWT, Swing, JavaFX & SWT 3
J JButton Icon hinzufügen AWT, Swing, JavaFX & SWT 5
U Swing JButton mit Icon AWT, Swing, JavaFX & SWT 7
ms_cikar Jbutton erzeugt neue Buttons AWT, Swing, JavaFX & SWT 2
Drachenbauer Swing Wie ändere ich die Farbe der Konturen von jButton und jCombobox? AWT, Swing, JavaFX & SWT 18
Drachenbauer Swing Wie ändere ich die helle geklickt-Farbe von einem JButton? AWT, Swing, JavaFX & SWT 4
A Swing JButton mit Pfeiltasten bewegen AWT, Swing, JavaFX & SWT 6
F Swing Scrollbare Liste von JButton AWT, Swing, JavaFX & SWT 4
Hatsi09 JButton text layout AWT, Swing, JavaFX & SWT 9
J JButton zum ändern Der Schriftart/Schriftgröße AWT, Swing, JavaFX & SWT 2
A Swing JButton aussehen AWT, Swing, JavaFX & SWT 12
J jButton soll nach klicken eine Variable um 1 erhöhen AWT, Swing, JavaFX & SWT 2
Legi Swing JButton Icon verschiebt sich AWT, Swing, JavaFX & SWT 2
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
S Swing JButton verschwindet nach Compilieren AWT, Swing, JavaFX & SWT 8
B Swing Posistion von JButton auslesen gibt immer 0 aus AWT, Swing, JavaFX & SWT 1
J Thread kennt JButton nicht. AWT, Swing, JavaFX & SWT 11
G Swing JButton ändert (unerwünscht) Größe bei Ausführung AWT, Swing, JavaFX & SWT 4
MR._FIRE_Flower Variable setzten mit JButton AWT, Swing, JavaFX & SWT 5
S Mit JButton neues Fester öffnen und das alte schließen AWT, Swing, JavaFX & SWT 3
T JButton wird beim vergrößern des Fensters erst sichtbar AWT, Swing, JavaFX & SWT 4
R Swing Verändern der Ausrichtung JButton und neu anzeigen AWT, Swing, JavaFX & SWT 2
G Swing JButton - Keine Klickanimation AWT, Swing, JavaFX & SWT 4
Joker4632 JButton nicht sichtbar, aber funktionsfähig AWT, Swing, JavaFX & SWT 8
B Swing JButton deaktivieren, wenn nicht alle JTextFields ausgefüllt sind. AWT, Swing, JavaFX & SWT 2
D JButton per Tastenkombi auswählen AWT, Swing, JavaFX & SWT 2
K JButton nicht sichtbar machen für User 2 AWT, Swing, JavaFX & SWT 4
L Swing JButton soll link öffnen AWT, Swing, JavaFX & SWT 1
K JButton auf anderer Klasse AWT, Swing, JavaFX & SWT 6
A JButton soll durch anklicken die Farbe wechseln AWT, Swing, JavaFX & SWT 8
T KeyListener funktioniert nicht wenn ich ein JButton hinzufüge AWT, Swing, JavaFX & SWT 1
R Swing ActionListener bei JButton AWT, Swing, JavaFX & SWT 9
B JButton -> Rahmen wegbekommen AWT, Swing, JavaFX & SWT 7
N JButton über benutzerdefinierte paintComponent setzen AWT, Swing, JavaFX & SWT 3
T JButton überlagern sich und werden erst beim Mausscrollen sichtbar AWT, Swing, JavaFX & SWT 2
B JButton erscheint in JFrame, obwohl er diesem nicht zugeordnet wurde! AWT, Swing, JavaFX & SWT 1
M JButton Probleme AWT, Swing, JavaFX & SWT 14
T Klasse über JButton schließen AWT, Swing, JavaFX & SWT 4
M Textfarbe JButton verändern AWT, Swing, JavaFX & SWT 2
N JButton ausblenden AWT, Swing, JavaFX & SWT 2
M Swing jButton Text verschwindet AWT, Swing, JavaFX & SWT 2
C Swing JButton wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
stylegangsta JLabel durch Klick auf JButton einblenden AWT, Swing, JavaFX & SWT 16
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
stylegangsta MouseEvents aus JButton aufrufen AWT, Swing, JavaFX & SWT 3
stylegangsta JButton Transparent anzeigen AWT, Swing, JavaFX & SWT 9
stylegangsta JButton Fehelr javax.swing.ImageIcon.<init>(Unknown Source) AWT, Swing, JavaFX & SWT 24
X Swing JButton's zum JScrollPane hinzufügen geht nicht. Bitte um Hilfe. AWT, Swing, JavaFX & SWT 9
D JButton - Nur Icon anzeigen / transparenter Hintergrund AWT, Swing, JavaFX & SWT 2
S JButton-Label vergrößern AWT, Swing, JavaFX & SWT 2
J Swing Basics - JButton funktioniert nicht. AWT, Swing, JavaFX & SWT 1
L JButton mit ImageIcon/Fehlermeldung AWT, Swing, JavaFX & SWT 1
D jButton Problem, ein Rieser Button bedeckt das ganze frame AWT, Swing, JavaFX & SWT 1
L Array mit JButton, wie rausfinden auf welche JButton geklickt wurde + index des JButtons ausgeben AWT, Swing, JavaFX & SWT 4
K (GUI) JButton Farbe bei druck ändern AWT, Swing, JavaFX & SWT 3
L JButton mit Image AWT, Swing, JavaFX & SWT 5
fLooojava JButton [Focus) AWT, Swing, JavaFX & SWT 4
M JButton - Listener AWT, Swing, JavaFX & SWT 1
D jButton auf von jFrame erzeugtem jDialog AWT, Swing, JavaFX & SWT 16
L JButton flackern - Programm hängt sich auf AWT, Swing, JavaFX & SWT 3
L JButton - Größe anders als erwartet AWT, Swing, JavaFX & SWT 2
1 JButton nach Klick ausblenden AWT, Swing, JavaFX & SWT 6
X Swing 1 JButton bedeckt meine ganze Frame aber Warum? AWT, Swing, JavaFX & SWT 2
S Größe und Farbe vom JButton festlegen AWT, Swing, JavaFX & SWT 2
H Swing JList/JTable mit JButton, JTextField, Image, JComboBox und JLable AWT, Swing, JavaFX & SWT 2
J JButton neu zeichnen lassen AWT, Swing, JavaFX & SWT 9
S JButton u. Label auf paint-Methode AWT, Swing, JavaFX & SWT 1
HoloYoitsu Swing JButton in verschiedenen Winkeln drehen AWT, Swing, JavaFX & SWT 0
J vocab1 = new JButton(""+voc1.get(nr).toString()+""); AWT, Swing, JavaFX & SWT 16
A JButton wird bei ActionListener nicht "angenommen" AWT, Swing, JavaFX & SWT 7
BRoll JButton Text nicht ausblenden ("...") AWT, Swing, JavaFX & SWT 2
I JFrame mit JButton schließen? AWT, Swing, JavaFX & SWT 0
D JList&JButton erst nach Resize des JFRame sichtbar AWT, Swing, JavaFX & SWT 2
J Swing JFrame slideout, wenn JButton gedrückt wurde AWT, Swing, JavaFX & SWT 0
S Swing Rückmeldung für JButton AWT, Swing, JavaFX & SWT 4
R AWT JLabel oder JButton aktualisieren AWT, Swing, JavaFX & SWT 1
L JButton im Frame fest verankern AWT, Swing, JavaFX & SWT 0
M Swing Mix JComboBox - JButton? AWT, Swing, JavaFX & SWT 6
U Event Handling JButton Actionevent: starte Spiel AWT, Swing, JavaFX & SWT 4
E JButton füllt ganzes JPanel auf AWT, Swing, JavaFX & SWT 6
P Verbuggte custom JButton unter Windows AWT, Swing, JavaFX & SWT 9
W Swing JButton lässt sich nicht anzeigen AWT, Swing, JavaFX & SWT 8
Kandum Swing JButton - onclick -> Grafikfehler AWT, Swing, JavaFX & SWT 2
R JButton durch Enter auslösen AWT, Swing, JavaFX & SWT 7
T Swing JButton per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 5
M Problem mit FlowLayout, JLabel und JButton AWT, Swing, JavaFX & SWT 4
M JButton wird von JTree überdeckt AWT, Swing, JavaFX & SWT 4
D Swing JButton.setenabled(true) funktioniert nicht AWT, Swing, JavaFX & SWT 12
B JButton ausblenden AWT, Swing, JavaFX & SWT 12
G JButton deaktivieren greift nicht AWT, Swing, JavaFX & SWT 14

Ähnliche Java Themen

Neue Themen


Oben