JButton in einer Zelle von JTable

Status
Nicht offen für weitere Antworten.

e9926044

Bekanntes Mitglied
Guten Morgen, auch wenns bei mir orkanartig regnet,

gibts irgendein Beispiel im Netz, wo ein JButton in einer Zelle einer JTable ist?? Hab noch nicht s gefunden und hab jetzt auch keine Idee, ob ich da ein JPanel in die Zelle legen muss und dann den JButton drauf oder geht das direkt?
 

outbreaker

Bekanntes Mitglied
Ich habe dir mal versucht ein einfaches Beispiel zu schreiben

Als erstes brauchst du einen Renderer der dir den Button anzeigt auf der Tabelle:

Code:
public class JButtonRenderer extends DefaultTableCellRenderer {

	/**
	 * 
	 */
	private static final long serialVersionUID = -4853509522303880332L;

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

Des Weiteren braucht du einen Editor damit du auch auf den Button klicken kannst:

Code:
public class MyTableEditor extends DefaultCellEditor {

	/**
	 * 
	 */
	private static final long serialVersionUID = 3052947778058597660L;

	public MyTableEditor(JTextField textField) {
		super(textField);
	}

	@Override
	public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
		return (JButton)value;
	}
}

Als nächstes musst du JTable überschreiben und dort einen MouseMotionListener ranhängen ohne diesen müsstest du einen doppelklick auf den Button machen damit er ausgelöst wird. Wenn du das möchtest dann brauchst du JTable nicht zu überschreiben sondern einfach nur eine JTable nutzen:

Code:
public class MyTable extends JTable implements MouseMotionListener{


	/**
	 * 
	 */
	private static final long serialVersionUID = -7985913044410714472L;

	public MyTable(MyTableModel model) {
		super(model);
		addMouseMotionListener(this);
	}
	
	public void mouseDragged(MouseEvent e) {
		// TODO Auto-generated method stub
	}

	public void mouseMoved(MouseEvent me) {
		int col = ((TableColumnModel)getColumnModel()).getColumnIndexAtX(me.getX());
		
		if (col == 1)
		{
			editCellAt(rowAtPoint(me.getPoint()), ((TableColumnModel)getColumnModel()).getColumnIndexAtX(me.getX()));
		}
	}

}

Dann brauchst du noch ein TableModel welches die Daten hält und sagt welche Klasse sich in welcher Spalte befindet
sonst weis der Rendere nicht um was für eine Klasse es sich handelt:

Code:
public class MyTableModel extends AbstractTableModel {

	/**
	 * 
	 */
	private static final long serialVersionUID = -9181487403748353628L;
	private Vector<String> s = new Vector<String>();
	private Vector<JButton> b = new Vector<JButton>();
	
	public MyTableModel() {
		createTestDaten();
	}
	
	private void createTestDaten(){
		s.add("Button1");
		s.add("Button2");
		s.add("Button3");
		s.add("Button4");
		b.add(new JButton("Erster"));
		b.add(new JButton("Zweiter"));
		b.add(new JButton("Dritter"));
		b.add(new JButton("Vierter"));
	}
	
	public int getColumnCount() {
		return 2;
	}

	public int getRowCount() {
		return s.size();
	}
	
	@Override
	public Class<?> getColumnClass(int columnIndex) {
		if (columnIndex == 0)
		{
			return String.class;
		}
		else if (columnIndex == 1)
		{
			return JButton.class;
		}
		else
		{
			return super.getColumnClass(columnIndex);
		}
	}

	public Object getValueAt(int rowIndex, int columnIndex) {
		if (columnIndex == 0)
		{
			return s.elementAt(rowIndex);
		}
		else
		{
			return b.elementAt(rowIndex);
		}
	}
	
	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		return true;
	}

}

Das ganze noch zusammenbasteln, auf einen Frame legen und starten:

Code:
public class Main {

	public static void main(String[] args) {
		MyTable table = new MyTable(new MyTableModel());
		table.setDefaultRenderer(JButton.class, new JButtonRenderer());
		table.setDefaultEditor(JButton.class, new MyTableEditor(new JTextField()));
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(table);
		frame.setSize(new Dimension(200,100));
		frame.setVisible(true);
	}
}

Ich hoffe das Beispielt hilft dir weiter und ist gut zu verstehen

mfg
 

e9926044

Bekanntes Mitglied
Vielen Dank,

Mein Problem ist aber noch, dass ich schon einen TableRenderer habe der so wie unten aussiet und ich das auch beibehalten möchte, ich möchte nur in der letzten Spalte einen JButton (also eine JComponent haben)


Code:
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
   {
       
     JLabel label = new JLabel((String)value);
     label.setOpaque(true);
     Border b = BorderFactory.createEmptyBorder(1, 1, 1, 1);
     label.setBorder(b);
     label.setFont(table.getFont());
     label.setForeground(table.getForeground());
     label.setBackground(table.getBackground());
     if (hasFocus) { 
       label.setBackground(new Color( 64,  64, 128));
       label.setForeground(Color.white);
     } else if (isSelected) {
       label.setBackground(new Color(160, 160, 255));
     } else {
 
       label.setHorizontalAlignment(JLabel.CENTER);            
           
                }
            }  
     }
     return label; 
   }
 

Marco13

Top Contributor
if (column==x) return button;
else return label;

Abgesehen davon sollte nicht bei jedem Aufruf dieser Methode ein neues Label erzeugt werden!
 

André Uhres

Top Contributor
Man kann auch mehrere Renderer für eine JTable haben. Beispiel:
Code:
...
        table.setDefaultRenderer( JComponent.class, new JComponentCellRenderer() );
        table.setDefaultRenderer( String.class, new StringCellRenderer() );
...
class StringCellRenderer implements TableCellRenderer {
    private JLabel label;
    private Color color1 = new Color( 64,  64, 128);
    private Color color2 = new Color(160, 160, 255);
    public StringCellRenderer(){
        label = new JLabel();
        label.setOpaque(true);
        Border b = BorderFactory.createEmptyBorder(1, 1, 1, 1);
        label.setBorder(b);
    }
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        label.setText((String)value);
        label.setFont(table.getFont());
        label.setForeground(table.getForeground());
        label.setBackground(table.getBackground());
        if (hasFocus) {
            label.setBackground(color1);
            label.setForeground(Color.white);
        } else if (isSelected) {
            label.setBackground(color2);
        } else {
            label.setHorizontalAlignment(JLabel.CENTER);
        }
        return label;
    }
}
 

e9926044

Bekanntes Mitglied
herzlichen Dank für die Hilfe,

Eine Frage hätte ich noch, ich hab jetzt die JButtons in meiner JTable ganz rechts in der letzten Spalte, wenn ich nun einen JButton in einer Zeile drücke, dann soll diese Zeile makiert werden und in der Zeile etwas passieren,
Wenn alle Zellen in einer Zeile automatisch (durch mein Programm) voll werden, dann wird diese Zeile removed, Auch liste ich die Einträge rückwärts auf (die neuesten Einträge sind oben),

Wie könnte ich jetzt herausfinden, in welcher Zeile ich den JButton drücke.

Ich habe schon versucht, beim hinzufügen der JButtons mit setName(x) Namen nach der Reihenfolge zu vergeben aber das funktioniert nicht, da sich ja Zeilen automatisch löschen bzw. wenn ich mit einem JButton die dazugehörende Zeile vervollständige, dann wird diese Zeile auch gelöscht und die Reihenfolge, die ich mit setName den JButtons zugeordnet habe, funktioniert nicht mehr,

so ungefähr solls aussehen
Code:
JButton      Zeile
1               1
2               2
3               3
4               4

// Wenn jetzt 2 herausgenommen wird:
1               1
3               2
4               3






Hat jamend vielleicht eine Idee, wie ich das machen könnte,

lg
 

e9926044

Bekanntes Mitglied
Hallo,

Könnte mir jemand noch kurz erklären, wie das mit dem Beispiel oben geht (Link)

Ich muss also das Interface CellEditor implementieren und bei der Methode shouldSelectCell true zurückgeben, was ich aber in der actionPerformed(..) - Methode machen muss, das ist mir nicht klar, wie ich in der Methode actionPerformed das invokeLater und table.getSelectedRow bzw. table.getSelectedColumn implemetiere.

Wäre sehr dank bar für Eure Hilfe!!

lg



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

André Uhres

Top Contributor
Code:
               SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        int row = table.getSelectedRow();
                        int column = table.getSelectedColumn();
                    }
                });
 

e9926044

Bekanntes Mitglied
Ich komm noch nicht ganz hin,

ich habe in meiner Klasse geschrieben:


Code:
public class MyKlasse implements CellEditor

dann habe ich alle Methoden von CellEditor implementiert:

Code:
 public Object getCellEditorValue() {
        return null;
        }

    public boolean isCellEditable(EventObject anEvent) {
        return false;
        }

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

    public boolean stopCellEditing() {
        return false;
        }

    public void cancelCellEditing() 
        {
        }

    public void addCellEditorListener(CellEditorListener l) 
        {     
        }

    public void removeCellEditorListener(CellEditorListener l) 
        {
        }

und dann habe ich in meiner actionPerformed()- Methode geschrieben:

Code:
if (e.getActionCommand().equals("button1"))                                                                                          
            { 
            SwingUtilities.invokeLater(new Runnable()                               
                {
                public void run() 
                    {
                    int row = tableList[1].getSelectedRow();
                    int column = tableList[1].getSelectedColumn();
                    System.out.println("Ausgabe: " + row + ", " + column);
                    }
                });


Nur muss ich jetzt eine Zeile selektieren, damit ich die Zeile und die Spale in der actionPerformed- Methode bekomme Wie kann ich es machen, dass ich keine Zeile selektiere und trotzdem die Zeile des gedrückten JButtons in der JTable bekomme,

vielen Dank
lg
 

e9926044

Bekanntes Mitglied
Ich glaube es liegt daran, dass ich nur einer Spalte den Renderer gebe:


Code:
columnModel.getColumn(6).setCellEditor(new myEditor());

oder müsste das so auch funktionieren?

lg
 

André Uhres

Top Contributor
Versuch's mal so:
Kopier erstmal das Beispiel. Du brauchst im Wesentlichen gar nix anzupassen. Das heisst:
1. Lass die anonyme Unterklasse von JTable so wie sie ist, mit ihren Methoden getCellRenderer und getCellEditor.
2. Lass den DefaultRenderer und DefaultEditor für die JComponent Klasse gesetzt.
3. Lass die Klassen "JComponentCellRenderer" und "JComponentCellEditor" genau so wie sie sind
(bei shouldSelectCell änderst du lediglich die Zeile "return false;" auf "return true;").
 

e9926044

Bekanntes Mitglied
DankeSchön für die Hilfe,

ich hatte meine Tabelle so definiert:


Code:
public MyTable(DefaultTableModel model, TableColumnModel columnModel) 
        {
        super(model, columnModel);
        addMouseMotionListener(this);
        }

und dann:


tableList = new MyTable(model, columnModel)
                    { usw

und daher gings nicht, mit

Code:
tableList = new MyTable(0, 7) {.. }

funktionierts,
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N JButton Konflikt mit Graphics Allgemeine Java-Themen 14
F JButton und ActionListener Allgemeine Java-Themen 3
H Schiffe versenken JButton Schiffe mit GUI verbinden Hilfe! Allgemeine Java-Themen 2
Aruetiise Interface Position durch JButton ermitteln Allgemeine Java-Themen 5
Aruetiise LayoutManager JButton in den Hintergrund Allgemeine Java-Themen 7
O Mein JButton Array funktioniert nicht Allgemeine Java-Themen 3
D AWT JButton und KeyAdapter Allgemeine Java-Themen 1
M JButton setEnabled(false) seltsames Ereignis Allgemeine Java-Themen 1
R via JButton in JTextArea printen Allgemeine Java-Themen 2
S Mit einem jButton eine andere Klasse öffnen Allgemeine Java-Themen 2
H JButton Ursprungsfarbe Allgemeine Java-Themen 2
Developer_X JButton Aktion Allgemeine Java-Themen 5
Developer_X JButton soll gar nichts machen Allgemeine Java-Themen 8
G Serialisieren eines JButton mit Icon Allgemeine Java-Themen 8
G JButton Allgemeine Java-Themen 7
S eigene Klasse die JButton extended - als Liste! Allgemeine Java-Themen 6
P JButton klonen Allgemeine Java-Themen 8
P JButton dnd Allgemeine Java-Themen 29
G Plug-in: Wie JButton einfügen? Allgemeine Java-Themen 12
M Swing JButton Farbe zurücksetzen Allgemeine Java-Themen 6
O JButton oder Checkboxes als Array ? Allgemeine Java-Themen 3
T Allgemeinklasse zu JPanel, JButton. Allgemeine Java-Themen 26
P eigener Thread für einen JButton Allgemeine Java-Themen 32
E JButton bleibt in der JTable Allgemeine Java-Themen 2
S JButton als Hyperlink ? Allgemeine Java-Themen 32
MQue JButton erkennen Allgemeine Java-Themen 2
MQue JButton an verschiedenen Variablen Allgemeine Java-Themen 2
MQue JButton zu JPanel hinzufügen Allgemeine Java-Themen 7
B Vermeiden das JButton schneller hintereinander drücken Allgemeine Java-Themen 3
G Hilfe - JButton in JTable (Spalte) einfügen! Allgemeine Java-Themen 6
M JButton verursacht einen HeapSpace Error? Allgemeine Java-Themen 6
N JList mit Mausklick auf einen JButton scrollen Allgemeine Java-Themen 28
thE_29 JButton einfärben Allgemeine Java-Themen 10
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
T JNA, Aufruf der Funktionen einer dll Allgemeine Java-Themen 5
I Vom Monolith zu Services in einer Webseite Allgemeine Java-Themen 1
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
O Werte einer Generic LinkedList zusammenrechenen Allgemeine Java-Themen 14
C Sortieren und Selektieren einer ArrayList<Point3D> Allgemeine Java-Themen 6
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Wie kann ich den Wert aus einer If abfrage ausgeben Allgemeine Java-Themen 23
S HTML einer Webseite 1:1 so bekommen wie es auch der Browser anzeigt? Allgemeine Java-Themen 14
melaniemueller Einzelne Zeile aus einer txt Datei in einem String speichern Allgemeine Java-Themen 12
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
J (Geplante) Änderungen an einer Datei vorübergehend speichern und anwenden? Allgemeine Java-Themen 12
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
_user_q Obfuscate einer .jar-Datei mit ProGuard? Allgemeine Java-Themen 2
_user_q Verknüpfung einer .jar-Datei (liegt z. B. auf dem Desktop) im Autostart-Ordner erstellen? Allgemeine Java-Themen 20
C Parsen einer sich updatenden Html mithilfe von jsoup Allgemeine Java-Themen 4
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Performance einer Monte-Carlo-Simulation verbessern Allgemeine Java-Themen 6
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
E Variablen Nach Übergabe einer Variable den Constructor aufrufen Allgemeine Java-Themen 16
Zeppi NullPointerException in einer if-Abfrage Allgemeine Java-Themen 6
D Abbruch einer ViewScoped Bean in Arbeit Allgemeine Java-Themen 2
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
Lukas2904 Wie kann man cps (ClicksPerSecond) in einer GUI anzeigen lassen? Allgemeine Java-Themen 4
O Produziert das Tool "jpackage" (ab JDK 14) .exe Dateien, die auf einer Zielumgebung ohne JRE lauffähig sind ?` Allgemeine Java-Themen 7
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
N BlueJ Implementation einer Analoguhr Allgemeine Java-Themen 0
O Formatierte String ausgabe bei vier Variablen in einer Zeile Allgemeine Java-Themen 1
N Speicherort einer Datei im Explorer ändern Allgemeine Java-Themen 8
O Datentypen Wie kann ich den Typ einer ArrayList abfragen ? Allgemeine Java-Themen 7
O Leerzeichen und Umlaute im Pfad einer Java Applikation machen Probleme Allgemeine Java-Themen 13
H Mehrere PNG-Files in einer Datei Allgemeine Java-Themen 9
G Java Editor Löschen doppelter Zahlen einer Liste Allgemeine Java-Themen 2
J JSON Daten von einer Webseite erhalten Allgemeine Java-Themen 2
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
J Zerlegen einer Zahl Allgemeine Java-Themen 6
Zrebna Wie kann man endgültig aus einer Rekursion ausbrechen? Allgemeine Java-Themen 14
MiMa Person in einer Arraylist hinzugügen mit Prüfung ? Allgemeine Java-Themen 6
Meeresgott Effizientester Weg um nach der Value einer verschachtelten Map aufzulösen Allgemeine Java-Themen 5
H Mehrere Datentypen in einer Arraylist speichern Allgemeine Java-Themen 9
MiMa Prüfziffer einer EAN Nummer berechnen Allgemeine Java-Themen 4
MiMa Erstellungsdatum einer Datei Allgemeine Java-Themen 10
Drachenbauer Wie kann ich einer existierenden Enum von außerhalb veränderte Werte zuweisen? Allgemeine Java-Themen 5
S HTML den ich von einer URL hole nicht identisch mit dem HTML im Browser Allgemeine Java-Themen 1
S Rückgabe einer HttpURLConnection für eine Seite einlesen bei der man eingeloggt ist..? Allgemeine Java-Themen 5
O Java-Applikation tut in Netbeans, als JAR nicht, wegen Pfadangaben einer benötigten Datei Allgemeine Java-Themen 8
M Hilfe bei einer Java Programmieraufgabe! Ab morgen Montag um 08:00 Uhr Allgemeine Java-Themen 5
J Algorithmen Analyse einer Schleife Allgemeine Java-Themen 6
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
J Die Letzte Zahl aus einer Text datei lesen Allgemeine Java-Themen 8
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
A Mithilfe von einer Nummer einen Namen finden n-Beziehung Allgemeine Java-Themen 8
Scream_ilias Auf einer Website die anmeldedaten eingeben Allgemeine Java-Themen 9
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
I Lohnt sich heutzutage der Aufwand einer Portierung für MacOS Allgemeine Java-Themen 8
J Suchen von einer Scannereingabe in einem HashSet Allgemeine Java-Themen 1
M Konstruktor einer Methode Allgemeine Java-Themen 35
L Echtzeitdaten aus einer Webseite ziehen mit Java Allgemeine Java-Themen 19
V EMail, Attachments auslesen von einer Email Allgemeine Java-Themen 0

Ähnliche Java Themen

Neue Themen


Oben