Actionlistener vor änderung der Selectedrow(JTable)

Status
Nicht offen für weitere Antworten.

weljo

Bekanntes Mitglied
Hi leute hab jetzt nach einigen problemen meine tabelle umgedreht was mir einiges erleichtert hat ... jetzt habe ich eine tabelle bei der edit... in der ersten spalte auf JComboBox gesetzt wurde und jede JComboBox einen Actionlistener hat .... wenn nun ein item in einer Combobox gewählt wird sollten sich die werte in der entsprechenden zeile auch ändern ... mein problem ist jetzt dass wenn ich z.b. in zeile 3 bin und auf die Combobox der Zeile 6 klick komm ich in den Actionlistener. jedoch wenn ich jetzt im actionlistener getSelectedRow aufrufe glaubt er immer noch in der 3. reihe zu sein.

hab bereits versucht um das problem zu lösen nur darauf zu achten wenn ein anderes item in der Combobox gewählt wird indem ich nur etwas gemacht habe wenn man sich in einer anderen zeile befindet und das gewählte item sich vom uhrsprünglichen unterscheident (dabei bin ich auf den fehler draufgekommen)

und habs auch mit ItemListener versucht jedoch wird der einfach doppelt so oft wie der Actionlistener aufgerufen

hat wer eine lösung ....
 
G

Gast2

Gast
Ja wahrscheinlich ist noch die falsche Zeile in deiner Tabelle makiert...

und das mit dem ItemListener ist auch logisch dass er doppelt so oft aufgerufen wird
dafür gibt es
Code:
ItemEvent.SELECTED und ItemEvent.DESELECTED
 

weljo

Bekanntes Mitglied
ma thx für die schnelle antwort ... jedoch soweit war ich auch bereits ... nur wie kann ich das problem lösen damit ich bereits im listener die richtige zeile hab??? ( "etwas anders" ausgedrückt: wie kann ich der Tabelle vorrang vor dem listener verschaffen.)
 
Zuletzt bearbeitet:
G

Gast2

Gast
1. Hat er im ItemListener die richtige Zeile?
2. Wird die Zeile überhaupt(visuell) irgendwann mal richtig makiert?
3. KSKB?
 

weljo

Bekanntes Mitglied
1. ItemListener selbes problem wie mit ActionListener
2. ja wird mit freiem auge betrachtet sofort richtig markiert (aber anscheinend minimal später)
3. was ist KSKB???

man könnte das problem auch lösen indem ich wirklich nur beim ändern in der ComboBox etwas mach und nicht schon beim selectieren ... jedoch hab ich das ohne das zeilenproblem zu vermeiden nicht geschafft
 

Ebenius

Top Contributor
Nochmal langsam: Du hast JComboBoxes als CellEditor in der JTable? Wozu rufst Du getSelectedRow() auf? Das klingt seltsam. Mach einfach mal ein kleines Beispiel-Programm!

Die Frage, wie Du die Listener zu irgendwelchem Vorrang bringst deutet deutlich darauf hin, dass Du irgendwie auf dem Holzweg gelandet bist. Listener feuern eigentlich immer in unvorhersagbarer Reihenfolge und daran sollte man nichts ändern.

KSKB: Halt mal die Maus über "KSKB" ...

Ebenius
 

weljo

Bekanntes Mitglied
also rufe es im action listener auf will in meinem container der die Daten beinhaltet etwas ändern und damit ich weis welcher index es ist brauch ich die zeile

naja kurz ist relativ

Java:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;

import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;


public class MainFrame extends javax.swing.JFrame implements  ActionListener{
	private JPanel north;
	private JPanel south;
	private JButton complete;
	private JButton add;
	private JButton createnew;
	
	public static JTable table; 
	public static Vector<Container> container;
	public static Vector<String> columnname;
	public static Vector<Vector<String>> tablecontent;
	public static TableModel tablemodel;
	
	public static Vector<Combo> combos = new Vector<Combo>(); 
	public static Vector<String> names = new Vector<String>();	
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				container = new Vector<Container>();
				container.add(new Container("H2O", "20°", "1 min", "-", "-"));
				
				names.add("R2D2");
				names.add("Shure SM 58");
				names.add("delirium");
				names.add("blabla");				
				
				MainFrame inst = new MainFrame();
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);
			}
		});
	}
	
	public MainFrame() {
		super();
		tablecontent = new Vector<Vector<String>>();
		tablemodel = new DefaultTableModel();
		columnname = new Vector<String>();
		initGUI();
	}
	
	public static void reload()
	{		
		tablecontent.clear();
		columnname.clear();
		int z = container.size();
		
		for(int y=0; y<z ; y++)
		{
			tablecontent.add(new Vector<String>());
			for(int i=0; i<5 ; i++)				
			{
				tablecontent.lastElement().add(container.elementAt(y).getName());
				tablecontent.lastElement().add(container.elementAt(y).getTemp());
				tablecontent.lastElement().add(container.elementAt(y).getTime());
				tablecontent.lastElement().add(container.elementAt(y).getDilution());
				tablecontent.lastElement().add(container.elementAt(y).getInfo());
			}
		}
		
		columnname.add("name");
		columnname.add("temp");
		columnname.add("time");
		columnname.add("dilution");
		columnname.add("info");
		
		tablemodel = new DefaultTableModel(tablecontent, columnname);
		table.setModel(tablemodel);
		table.getColumn("name").setCellEditor(new DefaultCellEditor(new Names(names)));
	}
	
	private void initGUI() {
		try {
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
			
			{
				north = new JPanel();

				getContentPane().add(north, BorderLayout.CENTER);
				{
					table = new JTable();
					north.add(table);
				}
			}			
			{
				south = new JPanel();
				getContentPane().add(south, BorderLayout.SOUTH);
				{
					createnew = new JButton();
					south.add(createnew);
					createnew.setText("new");
					createnew.addActionListener(this);
				}
				{
					add = new JButton();
					south.add(add);
					add.setText("+");
					add.addActionListener(this);
				}
				{
					complete = new JButton();
					south.add(complete);
					complete.setText("fertigstellen");
					complete.addActionListener(this);
				}
			}
			pack();
			this.setSize(588, 342);
		} catch (Exception e) {
			e.printStackTrace();
		}
		reload();
	}
	
	@Override
	public void actionPerformed(ActionEvent e) 
	{
		if(e.getSource()== createnew)
		{
			int i = JOptionPane.showConfirmDialog(null,"wenn Sie neu beginnen wollen gehen die alten Informationin verlohren. Möchten Sie vortfahren?", "Warnung", JOptionPane.YES_NO_OPTION);
			if(i == 0)
			{
				container.clear();
				container.add(new Container("H2O", "20°", "1 min", "-", "-"));
				reload();
			}
		}
		
		if(e.getSource()== add)
		{
			container.add(new Container("H2O", "20°", "1 min", "-", "-"));
			reload();
		}
	}
}
Java:
public class Combo 
{	
	String name;
	String temp;
	String time ;
	String dilution;
	long conter;
	
	public Combo(String name, String temp, String time, String dilution) {
		super();
		this.name = name;
		this.temp = temp;
		this.time = time;
		this.dilution = dilution;
	}

	public String getName() {
		return name;
	}

	public String getTemp() {
		return temp;
	}

	public String getTime() {
		return time;
	}

	public String getDilution() {
		return dilution;
	}

	public long getConter() {
		return conter;
	}

	public void setConter(long conter) {
		this.conter = conter;
	}
}
Java:
import java.io.Serializable;


public class Container implements Serializable 
{
	private String name;
	private String temp;
	private String time;
	private String dilution;
	private String info;	
	
	public Container() {
		super();
	}
	
	public Container(String name, String temp, String time, String dilution, String info) {
		super();
		this.name = name;
		this.temp = temp;
		this.time = time;
		this.dilution = dilution;
		this.info = info;
	}
		
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getTemp() {
		return temp;
	}
	public void setTemp(String temp) {
		this.temp = temp;
	}
	public String getTime() {
		return time;
	}
	public void setTime(String time) {
		this.time = time;
	}
	public String getDilution() {
		return dilution;
	}
	public void setDilution(String delution) {
		this.dilution = delution;
	}
	public String getInfo() {
		return info;
	}
	public void setInfo(String info) {
		this.info = info;
	}	
}
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;

import javax.swing.JComboBox;



public class Names extends JComboBox implements ActionListener
{
	private CBAction cbaction =new CBAction();
	
	
	public Names(Vector<?> items) {
		super(items);
		this.setEditable(true);
		this.addActionListener(cbaction);
	}
	
	public class CBAction implements ActionListener
	{
		boolean found;
		int v;
		int selectedrow = -1;
		int lastselectedrow = -1;
		String selecteditem = "";
		String lastselecteditem = "";
		public void actionPerformed(ActionEvent e) 
		{
			found = false;
			v=0;
//			war ein versuch nur etwas zu machen wenn wirklich was geändet wurde und nicht nur selectiert
//			selectedrow = MainFrame.table.getSelectedRow();
//			selecteditem = getSelectedItem().toString();
//			if(selectedrow == lastselectedrow)// wird ausgeführt wenn es nicht die gleiche reihe wie zuvor und nicht den gleichen namen trägt
//			{
//				System.out.println(selectedrow);
//				System.out.println(lastselectedrow);
//				if(selecteditem.compareTo(lastselecteditem) != 0)
//				{
					if(MainFrame.table.getSelectedRow()>=0)
					{
						System.out.println(MainFrame.table.getEditingRow());
						
						// das weitere ist in dem fall unwichtig aber beschreibt wiso ich die reihe benötige
						
						MainFrame.container.elementAt(MainFrame.table.getSelectedRow()).setName(getSelectedItem().toString());
						while(!found)// sucht die meistgewählten zusatzinfos
						{
							if(v<MainFrame.combos.size())
							{
								if(getSelectedItem().toString().compareTo(MainFrame.combos.elementAt(v).getName()) == 0)
								{
									MainFrame.container.elementAt(MainFrame.table.getSelectedRow()).setTemp(MainFrame.combos.elementAt(v).getTemp());
									MainFrame.container.elementAt(MainFrame.table.getSelectedRow()).setTime(MainFrame.combos.elementAt(v).getTime());
									MainFrame.container.elementAt(MainFrame.table.getSelectedRow()).setDilution(MainFrame.combos.elementAt(v).getDilution());
									found=true;
								}
								else
								{
									v++;
								}
							}
							else
							{
								found = true;
							}							
						}
					}
//				}
//			}
//				
//			lastselectedrow = selectedrow;
//			lastselecteditem = selecteditem;
		}
	}
}
 
Zuletzt bearbeitet:
G

Gast2

Gast
Du sollst auch nicht alles schicken sondern es kürzen so dass der effekt einfach nachvollziehbar ist...
 

weljo

Bekanntes Mitglied
Hab bereits den großteil an code entfernt jedoch heist es ja kompilierbar ... hätt noch bei names das popup entfernen können

aber das wirklich wichtige ist eigentlich nur names und MainFrame die beiden anderen sind nur 2 container

ps: um den effekt zu sehn einfach ein bischen mit der ersten spalte spielen und auf die die console achten

getEditingRow klingt zwar gut funktioniert jedoch auch nicht (bekomm nur -1 als würde nicht editiert werden, hab dem DefaultCellEditor(JComboBox) verwendet)
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
getSelectedRow ist in dem Fall wohl nicht das richtige, was Du brauchst ist [...]
==>
also rufe es im action listener auf will in meinem container der die Daten beinhaltet etwas ändern und damit ich weis welcher index es ist brauch ich die zeile
An beide: Nein. Es geht hier um Änderungen am Modell. Also ActionListener wegwerfen und dem Tabellenmodell zuhören. Ein CellEditor verändert das Modell nicht (auch nicht über Listener nach außen). Das tut die JTable über [c]TableModel.setValueAt(...)[/c]. Das Modell selbst gibt Bescheid, wann es sich geändert hat; dem kann man dann zuhören.

Ebenius
 

Ebenius

Top Contributor
TableModelListener ans Modell hängen; das hast Du sicher schon rausgefunden. Wenn das Thema erledigt ist, kannst Du bitte den Knopf neben "Antworten" (gibt's über und unter der Beitragsliste) drücken, um das Thema als "[Erledigt]" zu markieren.

Übrigens immer eine brauchbare Referenz: Sun Java™ Tutorial: How to Use Tables. Das ganze Tutorial ist nicht schlecht. :)

[EDIT] Den Knopf hast Du offenbar schon gefunden. :)

Ebenius
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Button ActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
H Viele ActionListener (MouseListener) - Performance AWT, Swing, JavaFX & SWT 24
pkm MainFrame durch Actionlistener auffrischen, aber wie? AWT, Swing, JavaFX & SWT 2
L actionListener für Button AWT, Swing, JavaFX & SWT 97
R Actionlistener funktioniert nicht AWT, Swing, JavaFX & SWT 4
N Bilder auf Button einfügen und mehrmals ändern (ein Button, mehrere ActionListener) AWT, Swing, JavaFX & SWT 2
R ActionListener in Actionlistener AWT, Swing, JavaFX & SWT 6
S Swing Variable in Actionlistener aufrufen AWT, Swing, JavaFX & SWT 10
P Swing ActionListener überschreibt einen Wert aus der Hauptklasse nicht AWT, Swing, JavaFX & SWT 5
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
M AWT Kann meinen Fehler beim ActionListener nicht finden AWT, Swing, JavaFX & SWT 5
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
coolian ActionListener funktonirt nicht richtig auf JMenuItem AWT, Swing, JavaFX & SWT 4
L ActionListener zu Button in Panel hinzufügen AWT, Swing, JavaFX & SWT 10
R Kann JLabel in ActionListener nicht aufrufen AWT, Swing, JavaFX & SWT 4
Blender3D einzelner ActionListener vs anonyme ActionListener AWT, Swing, JavaFX & SWT 10
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
xYurisha ActionListener Methoden Buttons zuweisen! AWT, Swing, JavaFX & SWT 16
J ActionListener bei Buttons AWT, Swing, JavaFX & SWT 14
S Swing Problem mit Button und ActionListener AWT, Swing, JavaFX & SWT 5
it_is_all ActionListener umlenken/ updaten mit AddActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 3
it_is_all Event Handling ActionListener in anderer Klasse klappt nicht AWT, Swing, JavaFX & SWT 4
F "ActionListener" funktioniert nicht AWT, Swing, JavaFX & SWT 4
Z ActionListener Variable übergeben AWT, Swing, JavaFX & SWT 12
T JProgressbar während actionListener updaten AWT, Swing, JavaFX & SWT 1
S While Schleife im Actionlistener AWT, Swing, JavaFX & SWT 1
S ActionListener für alle Buttons AWT, Swing, JavaFX & SWT 26
R Swing ActionListener bei JButton AWT, Swing, JavaFX & SWT 9
T ActionListener nimmt JTextField nicht mehr an. AWT, Swing, JavaFX & SWT 2
P ActionListener Graphics Einbauen AWT, Swing, JavaFX & SWT 0
S actionlistener mit 2 fenster integrieren AWT, Swing, JavaFX & SWT 11
Liondary GUI - ActionListener AWT, Swing, JavaFX & SWT 7
J ActionListener erkennt Variable nicht AWT, Swing, JavaFX & SWT 6
E ActionListener führt falsche Funktion aus AWT, Swing, JavaFX & SWT 6
Sin137 ActionListener in MVC AWT, Swing, JavaFX & SWT 7
M ActionListener und mathematische Methoden AWT, Swing, JavaFX & SWT 13
A Oberfläche mit zwei Klassen und actionlistener verbinden AWT, Swing, JavaFX & SWT 7
Paul15 ActionListener Variablen AWT, Swing, JavaFX & SWT 13
Y ActionListener AWT, Swing, JavaFX & SWT 2
K Ereignisbehandlung, ActionListener, ActionEvent AWT, Swing, JavaFX & SWT 3
A Gui für Vokabeltrainer (ActionListener) AWT, Swing, JavaFX & SWT 14
C Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen AWT, Swing, JavaFX & SWT 2
M JTextArea wird nicht aktualisiert (ActionListener-Problem) AWT, Swing, JavaFX & SWT 1
J Event Handling JOptionPane ActionListener setzen. AWT, Swing, JavaFX & SWT 3
S ActionListener Klasse aufrufen AWT, Swing, JavaFX & SWT 4
R Swing Problem: IOException bei ActionListener AWT, Swing, JavaFX & SWT 1
J ActionListener soll auf paint() Methode zugreifen AWT, Swing, JavaFX & SWT 1
A JButton wird bei ActionListener nicht "angenommen" AWT, Swing, JavaFX & SWT 7
T Einfaches Problem mit ActionListener AWT, Swing, JavaFX & SWT 2
K ActionListener mit KeyListener AWT, Swing, JavaFX & SWT 7
K GUI, Button, ActionListener - ein paar Einsteigerprobleme AWT, Swing, JavaFX & SWT 1
W Verschachtelter ActionListener AWT, Swing, JavaFX & SWT 0
N gewünschte ActionListener bei RadioButton mit isSelected geht nicht AWT, Swing, JavaFX & SWT 2
C Probleme mit Buttons und einem ActionListener AWT, Swing, JavaFX & SWT 2
K Swing JMenu und ActionListener AWT, Swing, JavaFX & SWT 4
A Swing ActionListener AWT, Swing, JavaFX & SWT 8
V ActionListener Abhängigkeitenproblem AWT, Swing, JavaFX & SWT 6
M ActionListener für mehrere Klassen AWT, Swing, JavaFX & SWT 4
J ActionListener für Buttons AWT, Swing, JavaFX & SWT 3
M Event Handling ActionListener übergeben ich checks net AWT, Swing, JavaFX & SWT 4
C Swing ComboBox - ActionListener deaktivieren AWT, Swing, JavaFX & SWT 2
S Button (ActionListener) funktioniert nicht, wenn y-Koordinate verändert wird AWT, Swing, JavaFX & SWT 5
L Swing ActionListener führt seine Aufgabe nur teilweise aus. AWT, Swing, JavaFX & SWT 7
A Swing ActionListener kann nicht hinzugefügt werden AWT, Swing, JavaFX & SWT 4
P Actionlistener - 3 klassen - kompliziert - auf methoden zugreifen AWT, Swing, JavaFX & SWT 3
Q CardLayout, ausgelagerte Panels, ActionListener AWT, Swing, JavaFX & SWT 5
M ProgressBar in ActionListener AWT, Swing, JavaFX & SWT 4
D AWT eigenem Knopf ActionListener zuweisen AWT, Swing, JavaFX & SWT 24
E Wert aus ActionListener geben AWT, Swing, JavaFX & SWT 4
J ActionListener per Innere Klasse oder e.getActionCommand() if-Abfrage? AWT, Swing, JavaFX & SWT 12
L Swing ActionListener zugriff auf bestimmte Elemente AWT, Swing, JavaFX & SWT 3
P Swing Seltsames ActionListener-Verhalten AWT, Swing, JavaFX & SWT 7
Oliver530 ActionListener von eigener ButtonKlasse AWT, Swing, JavaFX & SWT 16
Kenan89 statischer ActionListener keine Wirkung? AWT, Swing, JavaFX & SWT 2
Kenan89 statischer ActionListener keine Wirkung? AWT, Swing, JavaFX & SWT 3
C In der Schleife ActionListener aktivieren AWT, Swing, JavaFX & SWT 3
B Swing Problem beim ActionListener AWT, Swing, JavaFX & SWT 5
P Swing JPanel mit ActionListener mehrfach verwenden AWT, Swing, JavaFX & SWT 8
1 ActionEvent generieren und an ActionListener weiterleiten AWT, Swing, JavaFX & SWT 12
N Swing Klasse erbt von JDialog - Problem mit innerer ActionListener-Klasse AWT, Swing, JavaFX & SWT 6
N JCombobox und Actionlistener Aktion nur ausführen, wenn Useraktion ihn auslöst AWT, Swing, JavaFX & SWT 4
N Componente und Actionlistener AWT, Swing, JavaFX & SWT 5
C ActionListener AWT, Swing, JavaFX & SWT 6
Corben ActionListener Error AWT, Swing, JavaFX & SWT 2
F Wert durch ActionListener an Klasse übergeben AWT, Swing, JavaFX & SWT 3
I Swing Problem mit InputMap bei JButton (ActionListener) AWT, Swing, JavaFX & SWT 3
S Swing JButton mit ActionListener innerhalb einer JTable AWT, Swing, JavaFX & SWT 4
P Variablen in einem ActionListener zurücksetzen AWT, Swing, JavaFX & SWT 6
M AWT Problem mit ActionListener AWT, Swing, JavaFX & SWT 2
A Swing Bug in Swing? Wenn checkbox disabled reagiert ActionListener nicht AWT, Swing, JavaFX & SWT 5
S ActionListener "nach oben weitergeben" AWT, Swing, JavaFX & SWT 10
M Anonymer ActionListener AWT, Swing, JavaFX & SWT 4
L SWT Actionlistener Combobox öffnen AWT, Swing, JavaFX & SWT 4
S MenuBar ActionListener Event ... AWT, Swing, JavaFX & SWT 6
B Swing Formular mit mehreren Elementen - wie die ActionListener-Verarbeitung lösen? AWT, Swing, JavaFX & SWT 2
M getSource() findet Button nicht - ActionListener AWT, Swing, JavaFX & SWT 4
S Swing mit ActionListener auf Objekte einer anderen Klasse zugreifen AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen


Oben