Problem mit Listener und Tab-Inhalt auslesen!

Status
Nicht offen für weitere Antworten.

Spyder

Mitglied
Hallo,

habe ein Programm wo mehrere Tabs dynamisch erstellt werden und
auf diesen befinden sich dann wieder dynamisch erstellte JComboBoxs.
Auf Butto-Druck sollen dann die Inhalte des jeweiligen Tabs in eine Datenbank
geschrieben werden. Mein Problem liegt darin, dass nur der erste Tab
funktionier und bei den anderen eine Nullpointerexception ausgeworfen wird.

Ich denke das Problem liegt darin das der Listener nicht auf die ComboBoxen der
richtigen Instanz vom Tab zugreift, sondern nur auf die zu letzt erstellte Instanz.
Meine Frage ist nun, wie ich auf die richtige zugreifen kann.

Die Tabs befinden sich im Array group[] und die ComboBoxen in den Array heim[] und gast[].

Code:
public class dialog_setpreround extends JDialog
{
	JPanel mainpanel = new JPanel();
	JPanel[] group = new JPanel[10];
	private DatabaseMetaData mcoMetaData = null;
	
	//Hilfsvariablen
	int i=1, j=0;
	int stunden;
	int minuten;
	
	public dialog_setpreround(Frame owner){
		super(owner, "Vorrunde generieren", true);
		this.getContentPane().setLayout(new BorderLayout());
	    this.setLocation(100,100);
	    this.setSize(600,600);
	    generatetabs();
	    this.setVisible(true);
	}
	
	/*
	 * gerneratetabs() liest Tabellennamen (nur Gruppe*)
	 * aus der DB und erstellt daraus Tabs, speichert diese in group[]
	 * ->Ruft setTabContent auf
	 */
	public void generatetabs(){........}
	
	/*
	 * setTabContent setze alle Oberflächenelemente der Tabs
	 * ->Ruft getColumn(String table, String column) auf
	 */
	private void setTabContent(final int tab){
		int pause = Integer.parseInt(getColumn("System", "Pause")[0]);
		int dauer = Integer.parseInt(getColumn("System", "Spielzeit")[0]);
		final int length = Integer.parseInt(getColumn("System", "Vorrundenpaarungen")[0]);
		String startzeit = getColumn("System","Startzeit")[0];
		
		group[i].setLayout(null);
		
		final JComboBox[] heim = new JComboBox[50];
		final JComboBox[] gast = new JComboBox[50];
		final JComboBox[] feld = new JComboBox[50];
		final JLabel[] time = new JLabel[50];
		
		JLabel timehl = new JLabel("Startzeit:");
		timehl.setBounds(new Rectangle(120, 50, 120, 20));
		JLabel feldhl = new JLabel("Spielfeld:");
		feldhl.setBounds(new Rectangle(50, 50, 100, 20));
		JButton end = new JButton("Fertig");
		end.setBounds(new Rectangle(480, 450, 70, 20));
		
		int anzahl=Integer.parseInt(getColumn("System", "Spielfelder")[0]);
		int t;
		for (t=1; t<=length; t++){
			minuten=minuten+dauer+pause;
			if(minuten>=60){
				minuten=minuten-60;
				stunden=stunden+1;
			}
			
			String felder[] = new String[anzahl];
			for (int p=0; p<anzahl; p++){
				felder[p]=""+(p+1);
			}
			JLabel time1 = new JLabel("Uhr");
			time1.setBounds(new Rectangle(155, t*30+50, 120, 20));
			JLabel gegen = new JLabel("-");
			gegen.setBounds(new Rectangle(355, t*30+50, 120, 20));
			
			feld[j] = new JComboBox(felder);
			feld[j].setBounds(new Rectangle(50, t*30+50, 40, 20));
			feld[j].setSelectedIndex(i-1);
			time[j] = new JLabel(""+stunden+":"+minuten);
			time[j].setBounds(new Rectangle(120, t*30+50, 120, 20));
			heim[j] = new JComboBox(getColumn("Gruppe"+i, "Mannschaft"));
			heim[j].setBounds(new Rectangle(210, t*30+50, 120, 20));
			gast[j] = new JComboBox(getColumn("Gruppe"+i, "Mannschaft"));
			gast[j].setBounds(new Rectangle(380, t*30+50, 120, 20));
			
			group[i].add(heim[j]);
			group[i].add(gast[j]);
			group[i].add(time[j]);
			group[i].add(feld[j]);
			group[i].add(time1);
			group[i].add(gegen);
			j++;
		}
		
		JButton insert = new JButton("Eintragen");
		insert.setBounds(new Rectangle(400, t*30+100, 100, 20));
		
		group[i].add(timehl);
		group[i].add(feldhl);
		group[i].add(insert);
		group[i].add(end);
		

//Denke HIER ist das PROBLEM
		insert.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				String heim1, gast1, start;

				for (int p=0; p<length; p++){
					heim1 = (String) group[i].heim[p].getSelectedItem();
					gast1 = (String) gast[p].getSelectedItem();
					start = time[p].getText();
					int field = Integer.parseInt((String) feld[p].getSelectedItem());
					insertMatch(tab+1, field, start, heim1, gast1);
					System.out.println(heim1+gast1+start+field);
					System.out.println(tab);
				}
			}
		});
		
	}
	
	/*
	 * getTeam(String table, String column) gibt
	 * die Spalte Column aus der Tabelle table aus
	 * und schreibt alle Einträge in ein Array
	 */
	private String[] getColumn(String table, String column){........}

	/*
	 * instertMatch schreibt Paarung in DB
	 */
	private void insertMatch(int group, int field, String time, String heim, String gast){.....}
}
 

Murray

Top Contributor
Ich sehe nicht, wo die Variable i variiert wird; teilweise sieht es so aus, als sollte i eine Art Schleifenindex sein, andererseits ist es aber auch ein "normales" Class-Member :bahnhof:
Du schreibst, dass generatetabs setTabContent aufruft; die Stelle würde mich mal interessieren: wird setTabContent dort einmal oder aber in einer Schleife aufgerufen?
 

Spyder

Mitglied
Hi, und danke für deine Antwort.
Bin noch Anfänger im Programmieren und hab bestimmt irgeneinen dummen Denkfehler
drin, find den aber nicht...
Achja die Methode generatetabs() wird ganz normal einmal im Konstruktor aufgerufen.
Hier der Code wo die Methode aufgerufen wird:


Code:
public void generatetabs(){
		JTabbedPane pane = new JTabbedPane();
	    try 
	    {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            Connection con = java.sql.DriverManager.getConnection("jdbc:odbc:turnier");
            
            mcoMetaData = con.getMetaData();
            ResultSet rs = mcoMetaData.getTables(null,null,null,null);
            
            while(rs.next())
            {
                String name = rs.getString("TABLE_NAME");
                
                if (name.equals("MSysRelationships")){
                }
                else if (name.equals("MSysAccessObjects")){
                }
                else if (name.equals("MSysACEs")){
                }
                else if (name.equals("MSysObjects")){
                }
                else if (name.equals("MSysQueries")){
                }
                else if (name.startsWith("Paarungen")){
                }
                else if (name.equals("System")){
                }
                else {
                	group[i] = new JPanel();
                	setTabContent(i);
                	pane.addTab(name, group[i]);
        		    i++;
                }
            }
            con.close();
	    }
	    catch (Exception e) {System.out.println("generateTabs Fehler: " + e.getMessage());}
	    
	    setContentPane(pane);
	}
 

Murray

Top Contributor
Das Problem besteht darin, dass i am Ende von gerateTabs ja auf dem Endwert steht. Alle ActionListener verwenden also den gleichen Wert für i.

Lösen kannst Du das, indem Du den ActionListeners bei der Erzeugung die jeweiligen Indices mitgibst. Du könntest z.B. eine eigene Klasse für die ActionListener definieren:

Code:
public class MyActionListener implements ActionListener{

private int idx;

public MyActionListener( int idx) {
  this.idx = idx;
}

public void actionPerformed(ActionEvent e) {
            String heim1, gast1, start;

            for (int p=0; p<length; p++){
               heim1 = (String) group[ idx].heim[p].getSelectedItem();
               gast1 = (String) gast[p].getSelectedItem();
               start = time[p].getText();
               int field = Integer.parseInt((String) feld[p].getSelectedItem());
               insertMatch(tab+1, field, start, heim1, gast1);
               System.out.println(heim1+gast1+start+field);
               System.out.println(tab);
            }
         } 
}

In setTabContent werden die Listener dann so eingehängt:
Code:
     insert.addActionListener(new MyActionListener( i));

An Deiner Stelle würde ich die globale Variable i eliminieren und daraus eine lokale Hilfsvariable in generatetabs() machen. setTabContent könnte dann den jeweiligen Index als Parameter übergeben bekommen.
 

Spyder

Mitglied
Hi,
erstmal vielen Dank für deine Hilfe.
Hab den Listener jetzt in einer extra Klasse und die Variable i nur
noch lokal in der generatetabs methode.

Der Listener funktioniert auch soweit, das heißt er horcht am richtigen Tab, habe nur noch nicht ganz verstanden wie ich das in dem Listener implementieren muss damit der Inhalt aus den richtigen JComboBoxs geholt wird. Bekomme immer eine NullpointerException.

Code:
public void generatetabs(){
		JTabbedPane pane = new JTabbedPane();
		
	    try 
	    {
            int i=1;
            while(rs.next())
            {
               .........
                else {
                	group[i] = new JPanel();
                	setTabContent(i);
                	pane.addTab(name, group[i]);
        		    i++;
                }
            }

	    setContentPane(pane);
	}


Code:
private void setTabContent(int tab){
.........
insert.addActionListener(new preroundlistener(tab));
}

Wie muss jetzt der Zugriff auf die verschiedenen ComboBoxes aussehen? Hab da wohl irgendwie ein Blackout oder noch nicht das richtige Verständnis.

Code:
public class preroundlistener implements ActionListener{ 

	private int idx;

	public preroundlistener(int idx) {
	  this.idx = idx;
	}

	public void actionPerformed(ActionEvent e) {
	            String heim1, gast1, start;
	            int length = Integer.parseInt(getColumn("System", "Vorrundenpaarungen")[0]);
	            for (int p=0; p<length; p++){
	               //heim1 = (String) heim[p].getSelectedItem();
	               //gast1 = (String) gast[p].getSelectedItem();
	               //start = bla.time[p].getText();
	               //int field = Integer.parseInt((String) bla.feld[p].getSelectedItem());
	               //bla.insertMatch(idx, field, start, heim1, gast1);
	               //System.out.println(heim1+gast1+start+field);
	               System.out.println(idx);
	            }
	         } 
	
}

So funktioniert es noch nicht, hab schon etwas rumprobiert mit anderen Variablen übergeben und so, aber bekomme irgendwie nicht raus wie ich auf die richtigen Instanzen von heim[], gast[], etc zugreife.
 

Murray

Top Contributor
Sorry, ich hatte Deinen Code nicht genau genug gelesen.

Ok, Du hast jetzt im Listener das richtige JPanel-Objekt (group[ tab]) und brauchst jetzt daraus jetzt bestimmte Elemente. Eine Möglichkeit: da Du ja die Reihenfolge steuerst, in der die Components in den Container eingehängt werden, kannst Du sie auch per Index herausbekommen.

In setTabContent werde jawohl (length)-mal jeweils 6 Components eingehängt: im ersten Durchlauf hat dadurch heim[j] den Index 0 und gast[j] den Index 2, im zweiten Durchlauf hat heim[j] den Index 7 und gast[j] den Index 8 usw.


Also könnte das im Listener dann so aussehen:
Code:
public void actionPerformed(ActionEvent e) {
               String heim1, gast1, start;
               int length = Integer.parseInt(getColumn("System", "Vorrundenpaarungen")[0]);
               for (int p=0; p<length; p++){
                  JComboBox heim = (JComboBox)(group[idx].get( p*6 + 0));
                  JComboBox gast = (JComboBox)(group[idx].get( p*6 + 1));
                  JLabel time = (JLabel)(group[idx].get( p*6 + 2));
                  JComboBox feld = (JComboBox)(group[idx].get( p*6 + 3));
               }
            }
 

Spyder

Mitglied
Hi,
nochmal Danke für deine Hilfe.
Mein Problem lag genau darin, dass ich nicht wusste wie ich auf die
einzelnen Elemente aus den Panels lese.
Die get-Methode die in Java implementiert ist funktioniert leider
nicht, bekomme den Fehler "The method get(int) is undefined for the type JPanel". Habe hier im Forum auch keine Lösung dazu gefunden.

Muss ich die get-Methode selber implementieren, wenn wie muss die aussehen, hab schon was versucht, hat aber nicht geklappt.

Danke für deine Gedult mit mir....


Gruß Christian
 

Murray

Top Contributor
Sch***, da habe ich Dir Blödsinn geschreiben: die Methode heisst getComponent( int n) und wird von java.awt.Container geerbt.

Sorry!!
 

Spyder

Mitglied
Ok,
komisch habe selber nach ner Methode in der Java API gesucht aber nix gefunden, muss ich wohl übersehen habem.

Vielen Dank nochmal, endlich hab ich das lästige Problem gelöst.
Du hast mich ein ganzes Stück weiter gebracht
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
kaoZ Swing Architektonisches Problem / Listener / MVC AWT, Swing, JavaFX & SWT 14
H Problem mit dem Action listener.... AWT, Swing, JavaFX & SWT 2
El_Lobo Swing Problem bei Methodenaufruf in innerer Klasse bei Listener AWT, Swing, JavaFX & SWT 3
P JTabel Listener Problem / Editierbarkeit AWT, Swing, JavaFX & SWT 8
G 2 Panels, 2 Listener, 1 Problem AWT, Swing, JavaFX & SWT 2
F Problem mit Action Listener in privater inneren Klasse AWT, Swing, JavaFX & SWT 6
M Listener Problem AWT, Swing, JavaFX & SWT 11
P SWT unelegant? Problem mit Listener.eventHandle(Event e) AWT, Swing, JavaFX & SWT 10
G Event / Listener problem AWT, Swing, JavaFX & SWT 9
V Listener Problem im JFrame AWT, Swing, JavaFX & SWT 4
Juelin Problem mit TextField.requestFocus(); AWT, Swing, JavaFX & SWT 17
Juelin Problem beim Laden Controller AWT, Swing, JavaFX & SWT 2
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
H 2D-Grafik Problem mit Paint AWT, Swing, JavaFX & SWT 1
S Layout - Problem AWT, Swing, JavaFX & SWT 1
Tassos JavaFX/Problem mit der Maussteuerung in Stackpane AWT, Swing, JavaFX & SWT 7
sserio Java Fx - Problem AWT, Swing, JavaFX & SWT 3
A Problem Spiel auf Panel der GUI zu bringen AWT, Swing, JavaFX & SWT 1
A JavaFX Controller Problem AWT, Swing, JavaFX & SWT 1
TheWhiteShadow JavaFX ListView Problem beim Entfernen von Elementen AWT, Swing, JavaFX & SWT 1
E LayoutManager Welcher Layout-Mix löst mein Problem? AWT, Swing, JavaFX & SWT 3
Umb3rus JavaFX Problem mit PropertyValueFactory: can not read from unreadable property AWT, Swing, JavaFX & SWT 1
T Problem mit paintComponent() AWT, Swing, JavaFX & SWT 17
AmsananKING Java Menü-Problem AWT, Swing, JavaFX & SWT 1
K JavaFX Resizing-Problem beim BorderLayout (Center Component) beim Arbeiten mit mehreren FXMLs AWT, Swing, JavaFX & SWT 2
G Instance OF Problem AWT, Swing, JavaFX & SWT 9
FrittenFritze Ein Problem mit der CSSBox, die Größe wird nicht angepasst AWT, Swing, JavaFX & SWT 5
M Problem mit dem Anzeigen von Frames im Vordergrund AWT, Swing, JavaFX & SWT 5
Badebay Problem mit JButton AWT, Swing, JavaFX & SWT 2
newJavaGeek Grid-Layout problem AWT, Swing, JavaFX & SWT 7
J JavaFX Löschen im Tabelview macht Problem AWT, Swing, JavaFX & SWT 15
JavaTalksToMe JavaFx ExekutorService Problem AWT, Swing, JavaFX & SWT 2
Zrebna Problem bei Eventhandling (Value soll nach jedem erneutem Klick gelöscht werden) AWT, Swing, JavaFX & SWT 4
B Problem mit JavaFX AWT, Swing, JavaFX & SWT 5
J css Problem AWT, Swing, JavaFX & SWT 5
B JavaFX habe mein Problem fett markiert AWT, Swing, JavaFX & SWT 2
A Swing Filter-Problem AWT, Swing, JavaFX & SWT 1
temi JavaFX Problem mit IntelliJ und JavaFx 11 unter XUbuntu AWT, Swing, JavaFX & SWT 3
L Java FX Problem mit Ubuntu 18 und JavaFx AWT, Swing, JavaFX & SWT 27
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
kodela Swing Problem mit Warten-Dialog AWT, Swing, JavaFX & SWT 16
B JavaFx Scene Builder Problem AWT, Swing, JavaFX & SWT 2
B [Problem] Java öffnet Word-Datein nicht AWT, Swing, JavaFX & SWT 14
T DataBinding Problem AWT, Swing, JavaFX & SWT 5
Blender3D Problem mit € Symbol Font Gotham Windows 10 Swing AWT, Swing, JavaFX & SWT 11
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
J Problem mit Platfrom run later AWT, Swing, JavaFX & SWT 15
J Problem mit Platfrom run later AWT, Swing, JavaFX & SWT 0
D Swing SwingUtils / Thread Problem AWT, Swing, JavaFX & SWT 3
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
T Swing Problem mit Datum und FormattedTextField AWT, Swing, JavaFX & SWT 2
S AWT Java print dialog Problem AWT, Swing, JavaFX & SWT 0
olfibits JavaFX Problem mit HTMLEditor AWT, Swing, JavaFX & SWT 0
W SWT hover-background-problem with first column in TreeViewer AWT, Swing, JavaFX & SWT 0
M Problem mit Add JScrollPane AWT, Swing, JavaFX & SWT 25
Mario1409 Swing JTextArea scroll Problem AWT, Swing, JavaFX & SWT 0
N Swing Problem mit loop AWT, Swing, JavaFX & SWT 2
S Swing Problem mit Button und ActionListener AWT, Swing, JavaFX & SWT 5
S Swing & Clean und build Problem AWT, Swing, JavaFX & SWT 12
S JLabel setText() Problem AWT, Swing, JavaFX & SWT 6
I 2D-Grafik Problem beim Ändern der Farbe eine 2d Objekts AWT, Swing, JavaFX & SWT 3
G Swing Splitpane Problem AWT, Swing, JavaFX & SWT 1
F Problem mit der FXML Rectangle Shape AWT, Swing, JavaFX & SWT 2
N JavaFX Stranges Problem mit der Autoscroll-Eigenschaft von Textareas AWT, Swing, JavaFX & SWT 0
E Java FX FXML Problem mit html Scriptausführung AWT, Swing, JavaFX & SWT 2
J JavaFX Intersect Problem mit Shapes AWT, Swing, JavaFX & SWT 10
R JavaFX MediaPlayer AVI-Problem AWT, Swing, JavaFX & SWT 1
M Swing Problem mit ListCellRenderer AWT, Swing, JavaFX & SWT 7
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
F GUI Auflösung ändern - Koordianten und Proportions Problem AWT, Swing, JavaFX & SWT 21
J Problem mit Button darstellung AWT, Swing, JavaFX & SWT 23
M Problem mit Layoutmanagern... Hilfe wäre sehr nett. AWT, Swing, JavaFX & SWT 2
S 2D-Grafik Problem mit Variablen AWT, Swing, JavaFX & SWT 4
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
M Swing AttributiveCellTableModel addRow() Problem AWT, Swing, JavaFX & SWT 1
J Swing Problem mit Graphics Methode AWT, Swing, JavaFX & SWT 4
N JavaFX Problem mit table multiple selection AWT, Swing, JavaFX & SWT 5
K CheckBox Problem AWT, Swing, JavaFX & SWT 5
Grevak DisplayMode Problem seit Windows 10 AWT, Swing, JavaFX & SWT 2
S Swing Eigene JComboBox Problem! AWT, Swing, JavaFX & SWT 1
B Swing Problem mit Bildpfad AWT, Swing, JavaFX & SWT 4
N Swing Problem beim Scrollen mit JScrollPane AWT, Swing, JavaFX & SWT 6
V Graphics g - drawOval problem mit background AWT, Swing, JavaFX & SWT 1
C AWT Problem mit Protokol Fenster AWT, Swing, JavaFX & SWT 0
M Swing pack() Problem mit Taskleiste AWT, Swing, JavaFX & SWT 4
N Swing Choice- Problem! AWT, Swing, JavaFX & SWT 8
Q "AWT-EventQueue-0" Exception Problem AWT, Swing, JavaFX & SWT 4
D jButton Problem, ein Rieser Button bedeckt das ganze frame AWT, Swing, JavaFX & SWT 1
A Problem: repaint() - Schleife AWT, Swing, JavaFX & SWT 3
J Anfänger GUI Problem bei der Ausführung eines sehr einfachen Programms AWT, Swing, JavaFX & SWT 2
P AWT Problem mit Platzierung (GridBagLayout) AWT, Swing, JavaFX & SWT 2
N Swing JTree Problem beim erstellen der Knoten AWT, Swing, JavaFX & SWT 0
N Swing CardLayout: Problem beim Wechsel zwischen den JPanels AWT, Swing, JavaFX & SWT 3
A Mini-Menu-Schriften. Ein Problem bei hohen DPI Zahlen AWT, Swing, JavaFX & SWT 2
Z Canvas in Frame einfügen. Problem mit 4-Gewinnt AWT, Swing, JavaFX & SWT 1
C Thread-/ Simulations- Problem AWT, Swing, JavaFX & SWT 18
G Swing Setvisible problem AWT, Swing, JavaFX & SWT 1
J JTabbedPane: close Button Problem AWT, Swing, JavaFX & SWT 2
Tom299 JavaFX -> fxmlLoader -> getResourceAsStream Problem AWT, Swing, JavaFX & SWT 1
T Problem: ComboBox und addItem AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben