Variablen an anonyme Funktion

ocean.driver

Mitglied
Hallo,

Ich habe ein Fenster entwickelt, welches ein zwei Parameter hat: Ein Abstraktes Tabellenmodell und einen rowIndex.

Das Fenster generiert automatisch eine Oberfläche für das gegebene Tabellenmodell um Datensätze hinzuzufügen oder zu editieren.

Jetzt ist mein Tabellenmodell wie folgt erweitert:

Es steht eine Methode zur Verfügung die für bestimmte Spalten eine ArrayList von gültigen Werten zurückgibt (sonst null).
Zusätlich reagiere ich unterschiedlich, je nach dem ob ein Attribut mehrere Werte aufnehmen kann oder nur eines.

Für den Fall einer Einzelauswahl wird eine ComboBox generiert.

Jetzt kommen wir dem wichtigen Punkt, dass ein Feld beliebig viele Werte annehmen kann und nur bestimmte werte angenommen werden können.
Für diesen Fall hab ich ein weiteres Fenster entworfen. Dort sind zwei JList drauf zwischen denen die Werte übergeben werden.
Jetzt habe ich meinem Fenster zwei Variablen:
- ausgewählte Werte
- nicht ausgewählte Werte

Da dies aber für mehrere Werte sein kann, tauchen öfters die anonymen Funktion auf. Aber wie krieg ich die Variablen vernünftig hin?
Ich hab hier die wichtigen Codeausschnitte einmal zusammengestellt:


Java:
	public DataModificationWindow(final AbstractMediaTableModel atm, int rowIndex)
	{
		double[] cols = {80,100,80,100};
		double[] rows = new double[(int) Math.ceil((double)atm.getColumnCount() / 2)+1];
		for(int i=0; i < rows.length; i++)
			rows[i] = 25;		
		
		double size[][] = {cols,rows};

		TableLayout tl = new TableLayout(size);
		panel = new JPanel(tl);
		
		boolean isOdd = (atm.getColumnCount() % 2) == 1;
		
		final ArrayList<Object[]> col_sources = new ArrayList<Object[]>();
		
		for(int i=0; i < atm.getColumnCount(); i++)
			col_sources.add(atm.getColumnKeys(i));
		
		
		final ArrayList<String> not_selected_vals = new ArrayList<String>();
		final ArrayList<String> selected_vals = new ArrayList<String>();

		
		for(int i=0; i < atm.getColumnCount(); i=i+2)
		{
			/*
			 * Der Ausdruck:
			 * 	(isOdd && (atm.getColumnCount()-i) == 1 ? 2:4)
			 * liefert im Falle des letzten Elementes eine 2 zurück, sonst 4 
			 */
			for(int j=0   ;   j < (isOdd && (atm.getColumnCount()-i) == 1 ? 2:4)  ;   j=j+2)
			{		
				....
				....
				....
				
						temp.addMouseListener(new MouseAdapter() {
													
							@Override
							public void mouseClicked(MouseEvent e) {

								new ListSelector(not_selected_vals, selected_vals);
							}
						});
						
						panel.add(temp, datafield_pos);
					
					}
					else
					{
						System.out.println("Value is no ArrayList");
						panel.add(new JComboBox(col_sources.get(i+(j/2))),datafield_pos);						
					}
				}


					
			}
		}
				....
				....
				....
		
	}

Danke schoneinmal für die Hilfe
 

Marco13

Top Contributor
Etwas weniger text und etwas weniger Code, dafür spezifischer... Meinst du sowas wie

Java:
int someValue = 123;

something.addSomeListener(new Listener()
{
    void somethingHappened(Event event)
    {
        System.out.println("Value: "+someValue); // GEHT NICHT!
    }
});
?

Falls ja:
Java:
int someValue = 123;
final int someFinalValue = someValue;
something.addSomeListener(new Listener()
{
    void somethingHappened(Event event)
    {
        System.out.println("Value: "+someFinalValue); // GEHT
    }
});
 

Marco13

Top Contributor
Poste ein zusammenhängendes Codestück, beginnend bei der Deklaration der Variablen, über die Zuweisung, bis zu der Stelle, wo das Problem ist
Java:
int variable; // <- diese Variable

...

variable = 123;

...


doSomething(variable); // <- soll  hier verwendet werden

Aber ohne "..." dazwischen. Vielleicht hilft das.
 

ocean.driver

Mitglied
Hi,

Hier der komplette Code

Java:
	public DataModificationWindow(final AbstractMediaTableModel atm, int rowIndex)
	{
		double[] cols = {80,100,80,100};
		double[] rows = new double[(int) Math.ceil((double)atm.getColumnCount() / 2)+1];
		for(int i=0; i < rows.length; i++)
			rows[i] = 25;		
		
		double size[][] = {cols,rows};

		TableLayout tl = new TableLayout(size);
		panel = new JPanel(tl);
		
		boolean isOdd = (atm.getColumnCount() % 2) == 1;
		
		final ArrayList<Object[]> col_sources = new ArrayList<Object[]>();
		
		for(int i=0; i < atm.getColumnCount(); i++)
			col_sources.add(atm.getColumnKeys(i));
		
		
		final ArrayList<String> not_selected_vals = new ArrayList<String>();
		final ArrayList<String> selected_vals = new ArrayList<String>();

		
		for(int i=0; i < atm.getColumnCount(); i=i+2)
		{
			/*
			 * Der Ausdruck:
			 * 	(isOdd && (atm.getColumnCount()-i) == 1 ? 2:4)
			 * liefert im Falle des letzten Elementes eine 2 zurück, sonst 4 
			 */
			for(int j=0   ;   j < (isOdd && (atm.getColumnCount()-i) == 1 ? 2:4)  ;   j=j+2)
			{		
				panel.add(new JLabel(atm.getColumnName(i+(j/2)) + ": "),j+"," + (i/2)+",r" );
				
				System.out.println("i+(j/2) = " + Integer.valueOf(i+(j/2)));
				final Object[] col_source = atm.getColumnKeys(i+(j/2));
								
				
				String datafield_pos = (j+1)+","+(i/2);
				
				if(col_source == null)
				{
					System.out.println("col_source == null");
					panel.add(new JTextField (""),datafield_pos);	
				}
				else
				{
					if (atm.getValueAt(0, i+(j/2)) instanceof ArrayList)
					{
						System.out.println("Value is ArrayList");
						JButton temp = new JButton("Verwalten");
						
						not_selected_vals.clear();
						selected_vals.clear();						

						ArrayList<String> temp_selected_vals = (ArrayList<String>) atm.getValueAt(rowIndex, i+(j/2));

						System.out.println("i+(j/2) = " + (i+j/2));
						

						for(int k=0; k < col_source.length; k++)
							not_selected_vals.add(atm.getColumnKeyValue(i+(j/2), (String)col_source[k]));

						for(int k=0; k < temp_selected_vals.size(); k++)
							selected_vals.add(atm.getColumnKeyValue(i+(j/2),(String)temp_selected_vals.get(k)));



						//not_selected_vals = not_selected_vals - selected_vals
						for(int k=0; k < not_selected_vals.size(); k++)
							if(selected_vals.contains(not_selected_vals.get(k)))
								not_selected_vals.set(k, null);
						
						while(not_selected_vals.remove(null));
						
						
						System.out.println("notSelected");
						for(String s: not_selected_vals)
							System.out.println("\t"+s);
						
						System.out.println("selected");
						for(String s: selected_vals)
							System.out.println("\t"+s);

						
						
						temp.addMouseListener(new MouseAdapter() {
													
							@Override
							public void mouseClicked(MouseEvent e) {

								
								
								new ListSelector(not_selected_vals, selected_vals);
							}
						});
						
						panel.add(temp, datafield_pos);
					
					}
					else
					{
						System.out.println("Value is no ArrayList");
						panel.add(new JComboBox(col_sources.get(i+(j/2))),datafield_pos);						
					}
				}


					
			}
		}
		
		if(rowIndex == AbstractMediaTableModel.CREATE_NEW)
		{
			atm.setValueAt("", (int)rowIndex, 0);
			rowIndex = atm.getRowCount()-1;
		}
		else
		{
			Component comp;
	    	for(int i=1; i < panel.getComponents().length; i=i+2)    /* 1,3,5,7,9,11,... */
	    	{
	    		comp = panel.getComponent(i);
	    		
	    		if(comp instanceof JTextField)
	    			((JTextField)comp).setText((String) atm.getValueAt((int)rowIndex, (int)i/2).toString());
	    		
	    		else if(comp instanceof JComboBox)
	    			((JComboBox)comp).setSelectedItem(atm.getValueAt((int)rowIndex, (int)i/2));
	    		
	    	}
		}


		JButton jb_save = new JButton("speichern");
		
		jb_save.addMouseListener(new MouseAdapter(){
			
			
			//muss geändert werden
		    public void mouseClicked(MouseEvent e) 
		    {
		    	Component comp;
		    	String text="";
		    	for(int i=1; i < panel.getComponents().length; i=i+2)    /* 1,3,5,7,9,11,... */
		    	{														 
		    		comp = panel.getComponent(i);
		    		
		    		if(comp instanceof JTextField)
		    			text = ((JTextField)comp).getText();
		    		
		    		else if(comp instanceof JComboBox)
		    			text = ((JComboBox)comp).getSelectedItem().toString();
		    		
		    		atm.setValueAt(text, 0, (int)i/2);
		    	}
		    	atm.fireTableDataChanged();
		    	
		    	setVisible(false);
		    	dispose();		    	
		    }
		});
		
		if(isOdd) 
			panel.add(jb_save,"1,"+ ((int)(atm.getColumnCount()/2)+1+",c,c")); /* ungerade Spaltenanzahl */
		else
			panel.add(jb_save,"1,"+ ((int)(atm.getColumnCount()/2)+",c,c")); /* gerade Spaltenanzahl */

		getContentPane().add(panel);


		setTitle("Eintrag bearbeiten / hinzufügen");
		setResizable(true);
		setVisible(true);
		pack();
	}
 

ocean.driver

Mitglied
An Zeile 105 sollen die beiden Listen übergeben werden, die aber prinzipiell nicht final sein dürfen.

Es geht mir hier auch garnicht um eine konkrete Lösung, sondern um den allgemeinen Weg wie sowas zu realisieren ist.
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Ach, die beiden Listen...
[c]panel.add(new JComboBox(col_sources.get(i+(j/2))),datafield_pos);[/c]
?
(Bin ich der einzige, der nicht kapiert, wo hier die Frage ist? ???:L )
*seufz*

finalisieren geht nicht, da ich ja über alle Spalten des Tabellenmodells iteriere und so der Wert quasi jede Runde nen anderen Wert erhält.
Das ändert ja nichts daran, dass man etwas finales an die inneren Klassen übergeben kann... Hilft vielleicht das
Code:
for (int notFinalValue=0; notFinalValue<10; notFinalValue++)
{
    final int finalValue = notFinalValue;
    something.addSomeListener(new Listener()
    {
        void somethingHappened(Event event)
        {
            System.out.println("Value: "+finalValue); // GEHT
        }
    });
}

?!?
 

ocean.driver

Mitglied
Hi,

ALso not_selected_vals und selected_vals sind gemeint. Ja aber wie soll ich etwas als final an die Methode übergeben, was sich jede Runde ändert?
Ich kann ja nicht in der nächsten iteration einen finalen Wert überschreiben,oder?
 

Marco13

Top Contributor
Also... was du da genau mit diesen beiden Listen machst..
Code:
// holen ?!
ArrayList<String> temp_selected_vals = (ArrayList<String>) atm.getValueAt(rowIndex, i+(j/2));
// ... äh füllen
for(int k=0; k < temp_selected_vals.size(); k++)
    selected_vals.add(atm.getColumnKeyValue(i+(j/2),(String)temp_selected_vals.get(k)));
// wtf?!
while(not_selected_vals.remove(null));
.... ist egal: Kurz bevor du die Anonyme Klasse erstellst, solltest du

Code:
[b]final[/b] List<String> finalInstanceOfWhatever = new ArrayList<String>(theThingThatChangesInEachIteration);
machen können, und DIE dann in der inneren Klasse verwenden können.
 

Antoras

Top Contributor
Dein Code, der ist so kaputt, den bekommst du wahrscheinlich nie zum laufen.

Bau da mal ein vernünftiges Konzept ein, damit ein Außenstehender erkennen kann was der Code überhaupt machen soll. Zusammenhängende Codeteile gehören in eine eigne Methode. Jeglicher Code, der nicht direkt bei der Initialisierung eines Objektes beteiligt ist, hat nichts im Konstruktor verloren (was bei dir so ziemlich alles wäre).
Dein Code in den anonymen Klassen hat da auch nichts verloren. Wenn du aus den Listenern heraus einfach nur eine Methode des Objektes aufrufst brauchst du auch keine finalen Variablen mehr. Z.B.:
Java:
@Override
public void mouseClicked(MouseEvent e) {
  handleMouseClick();
}

Das bisschen Refactoring muss einfach sein, sonst wird das nichts.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Variablen an eine Form binden? AWT, Swing, JavaFX & SWT 2
S JavaFX Variablen in einem FXML File verwenden AWT, Swing, JavaFX & SWT 8
L Auf Variablen zugreifen AWT, Swing, JavaFX & SWT 6
S 2D-Grafik Problem mit Variablen AWT, Swing, JavaFX & SWT 4
J JavaFX Zugriff auf FXML-Variablen eines anderen Controllers AWT, Swing, JavaFX & SWT 2
Paul15 ActionListener Variablen AWT, Swing, JavaFX & SWT 13
F MouseMotionListerener & Verfügbarkeit von Variablen AWT, Swing, JavaFX & SWT 5
B Event Handling MouseListener Behält seine Variablen, auch wenn ich ein neus Objekt erstelle AWT, Swing, JavaFX & SWT 2
T Einen Variablen Wert in einem TextField AWT, Swing, JavaFX & SWT 4
H SWT NullPointerException bei Zugriff auf Variablen des Hauptfensters AWT, Swing, JavaFX & SWT 6
B Variable ist leer / Scope von Variablen AWT, Swing, JavaFX & SWT 2
P non-static variablen benutzen AWT, Swing, JavaFX & SWT 7
P Variablen in einem ActionListener zurücksetzen AWT, Swing, JavaFX & SWT 6
N Variablen in Events AWT, Swing, JavaFX & SWT 4
M Zugriff auf Variablen eines Objektes ohne sie auf static zu setzen AWT, Swing, JavaFX & SWT 9
C SWT Textfeld mit festem und variablen Inhalt AWT, Swing, JavaFX & SWT 13
F Variablen zwischen Frames AWT, Swing, JavaFX & SWT 5
N Variablen an JDialog übergeben AWT, Swing, JavaFX & SWT 2
hdi Fenster mit variablen Components AWT, Swing, JavaFX & SWT 3
isowiz Wie kann ich Variablen aus einer Innerklasse heraus ändern? AWT, Swing, JavaFX & SWT 5
B Variablen-Namen erfragen AWT, Swing, JavaFX & SWT 5
A problem mit variablen und dialod AWT, Swing, JavaFX & SWT 2
N JLabel o.ä. mit Variablen verknüpfen AWT, Swing, JavaFX & SWT 10
S Wie Variablen Übergabe an Dialog?? AWT, Swing, JavaFX & SWT 2
M variablen uebergabe ?? AWT, Swing, JavaFX & SWT 2
S Stream API, Anonyme Klasse AWT, Swing, JavaFX & SWT 8
Blender3D einzelner ActionListener vs anonyme ActionListener AWT, Swing, JavaFX & SWT 10
G Anonyme Instanz von JXImageView erstellen und mit Bild initialisieren AWT, Swing, JavaFX & SWT 7
B SWT Anonyme Eventlistener wegräumen? AWT, Swing, JavaFX & SWT 4
J Anonyme Klasse - Button ansprechen - Warum muss Button final sein? AWT, Swing, JavaFX & SWT 4
S SWT Konstruktor anonyme Klasse AWT, Swing, JavaFX & SWT 10
B abstrakte klassen / anonyme klassen AWT, Swing, JavaFX & SWT 4
G Listener (anonyme Klasse) jedem Element eines Array zuweisen AWT, Swing, JavaFX & SWT 5
A Vektor in Anonyme Klasse übergeben AWT, Swing, JavaFX & SWT 2
Juelin JavaFX Netbeans Aufruf Funktion aus Scenebuilder AWT, Swing, JavaFX & SWT 8
G JButton mit importFiles-Funktion auf JDrawPane AWT, Swing, JavaFX & SWT 5
L JavaFx Textformatierung mittels Datenbank und Funktion anpassen AWT, Swing, JavaFX & SWT 5
T Combobox mit Autocomplete-Funktion AWT, Swing, JavaFX & SWT 7
C Swing Aufruf der Funktion (die ein Dialog anzeigt) über Symbol anzeigen lassen AWT, Swing, JavaFX & SWT 4
L Button Funktion zuweisen in WindowBuilder AWT, Swing, JavaFX & SWT 22
A Button mit Speicher-Funktion AWT, Swing, JavaFX & SWT 8
F main-Funktion bei Swing AWT, Swing, JavaFX & SWT 4
kilopack15 Buttons ohne Funktion AWT, Swing, JavaFX & SWT 2
J Event Handling Frage zu der Funktion addActionListener AWT, Swing, JavaFX & SWT 2
D SWT Button mit F5-Funktion AWT, Swing, JavaFX & SWT 1
E ActionListener führt falsche Funktion aus AWT, Swing, JavaFX & SWT 6
C Swing JTextField Funktion zuweisen - Löschen von Buchstaben/Sonderzeichen AWT, Swing, JavaFX & SWT 6
K Funktion für das Bewegen des Balles AWT, Swing, JavaFX & SWT 5
A Trennung GUI und Funktion AWT, Swing, JavaFX & SWT 5
A Textfeld.append/.setText ohne Funktion AWT, Swing, JavaFX & SWT 2
F Swing JTextField in JList (Funktion beibehalten) AWT, Swing, JavaFX & SWT 2
U Disable-Funktion AWT, Swing, JavaFX & SWT 1
C Swing Durch Inhaltsänderung eines JTextfields eine Funktion aufrufen AWT, Swing, JavaFX & SWT 5
J Swing Nach SwingWorker Funktion aus der GUI Klasse aufrufen AWT, Swing, JavaFX & SWT 5
W Funktion aus einer Java Datei in eine andere einbauen AWT, Swing, JavaFX & SWT 25
W Funktion per Tastendruck aufrufen. AWT, Swing, JavaFX & SWT 10
T ableitung übermalt die funktion AWT, Swing, JavaFX & SWT 3
N Swing Funktion repaint() updated nicht AWT, Swing, JavaFX & SWT 5
lumo SWT Image funktion auf ImageDaten AWT, Swing, JavaFX & SWT 9
R mathematische Funktion x^2 AWT, Swing, JavaFX & SWT 6
R mathemathische Funktion x^2 AWT, Swing, JavaFX & SWT 2
J Progressbar mit einfacher Funktion AWT, Swing, JavaFX & SWT 6
L Swing Funktion animieren AWT, Swing, JavaFX & SWT 10
D Funktion JList.getSelectedValues() gibt nicht alle values zurück AWT, Swing, JavaFX & SWT 2
G Swing Update-Funktion für Swing-Anwendung AWT, Swing, JavaFX & SWT 5
J Swing JDialog mit static-Funktion anzeigen -> Rückgabewert AWT, Swing, JavaFX & SWT 3
I JTextArea mit Copy Paste Funktion AWT, Swing, JavaFX & SWT 7
H Funktion ausführen wenn Button gedrückt wird. AWT, Swing, JavaFX & SWT 2
B Restart-Funktion für einen Updatemechanismus?????? AWT, Swing, JavaFX & SWT 4
G F6 Funktion AWT, Swing, JavaFX & SWT 2
S Swing Button mit Funktion abbilden AWT, Swing, JavaFX & SWT 3
P Funktion ist nicht MAC kompatibel, warum? AWT, Swing, JavaFX & SWT 12
S Funktion nur ausführen, wenn Maus über Componente ist AWT, Swing, JavaFX & SWT 2
A Sleep Funktion / Thread-Problem ! AWT, Swing, JavaFX & SWT 11
GilbertGrape bei "Enter" Funktion ausführen, egal wo der Fokus AWT, Swing, JavaFX & SWT 2
F Jframe Exit Funktion überladen AWT, Swing, JavaFX & SWT 3
G kreis malen -> welche funktion? AWT, Swing, JavaFX & SWT 3
D SWT: Funktion zum Auslesen der Schriftgröße AWT, Swing, JavaFX & SWT 2
D GroupLayout an un plötzlich is CardLayout Funktion tot? AWT, Swing, JavaFX & SWT 10
R Editor mit "Gehe zu"-Funktion AWT, Swing, JavaFX & SWT 4
W Unterdrückung von FrameIcon-Funktion im JInternalFrame AWT, Swing, JavaFX & SWT 5
G Funktion für PopUp Menü AWT, Swing, JavaFX & SWT 32
F ZOOM Funktion in JTextPane AWT, Swing, JavaFX & SWT 6
D paint-Funktion wird nicht ausgeführt AWT, Swing, JavaFX & SWT 6
A Drag and Drop Funktion mit JLabel AWT, Swing, JavaFX & SWT 5
E Beim Schließen des Fensters eigene Funktion aufrufen AWT, Swing, JavaFX & SWT 8
L JOP.showInputDialog: Abbrechen Button-Funktion beenden AWT, Swing, JavaFX & SWT 5
D setPreferredSize(), setMaximumSize() ohne Funktion? AWT, Swing, JavaFX & SWT 4
S JComboBox -> undo Funktion hinzufügen! AWT, Swing, JavaFX & SWT 2
Z Welche Funktion von JTextArea muß ich überschreiben? AWT, Swing, JavaFX & SWT 4
R TAB-Funktion in Fenster ändern - genauer: STRG+TAB AWT, Swing, JavaFX & SWT 5
P Rückgängig-Funktion im Malprogramm AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben