Auf eine variable/objekt eines frames zugrifen

screamboy14

Mitglied
huhu ich hab folgendes Problem ich hab ein frame mit einer JTable einer txtbox und mehreren buttons in das feld sind die anzahl der tabellenspalten einzutragen welche nach einem klick auf einen butten hinzugefügt werden sollen.

den code zum einlesen eines integerwertes hab ich seperat in einer "einlesen" klasse gepackt um ihn nicht immer wieder neu coden zu müssen

nun hab ich das problem, das ich aus der einlesen klasse heraus auf das textfeld zugriefen muss, um daraus mit der methode gettext den text lesen zu können.

ich habe versucht über einen getter in der frameklasse den eingegebenen text an die einlesen klasse zu übergeben was allerdings NUR klappt wenn ich das textfeld "static" mache ... aber genau das wollte ich verhindern ... wie kann es sein das ich über einen getter in der selben klasse nicht auf eine variable bzw ein textfeld zugrifen kann wenn es nicht static ist ?
ich habe auch versucht durch das erstellen einer instanz der klasse auf das feld zuzugreifen (was auch funktioniert allerdings beim ausführen des programms öffnet sich dann sofort das programm ein zweites mal ... das ist ja nicht sinn der sache ...

hoffe ihr könnt mir helfen ...
 
das passiert weil du ja den Konstuktor aufrufen musst dann , öffnet sich ein 2tes fenster, normalerweise musst du wenn du Logik vom Gui trennen willst dich mal mit MVC beschäftigen , mache ich auch grad ^^
 
Zuletzt bearbeitet:
wie kann es sein das ich über einen getter in der selben klasse nicht auf eine variable bzw ein textfeld zugrifen kann wenn es nicht static ist ?

hast du ggf noch keine Instanz deines Objektes erzeugt ?

denn dann kann es nur funktionieren wenn die variable static ist , ansonsten musst du halt dein Objekt instanzieren und dann auf denn getter zugreifen
 
ich hab im konstruktor die gui hab ich lediglich 3 selbstgeschriebene Methoden ( 1 zum zum initialisieren der componente eine zum adden der componente und eine für die eigenschaften des frames )

aus einem anderen neuerem beitrag dieses forums hab ich durch zufall entdeckt das es sinnvoller ist das setVisible in eine extra methode zu machen und diese dann über die main (externe klasse) über eine instanz aufzurufen

nun ist das 2te sich öffnente fenster weg allerdings gelingt mir nur nicht mehr aus dem textfeld zu lesen ... mein vordefiniertes optionpane erscheint jedesmal als ob ich ein falschen bzw keinen wert eingegeben hab ...

ich glaub ich poste gleich mal den qt 😛 moment ebend
 
die Gui

Java:
package Korrelation;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;


public class Fenster2 extends JFrame implements ActionListener 
{
	
/**
	 * 
	 */
	private static final long serialVersionUID = (long) 1.0;
	//---------------------------------------------------------------------------------------
	private int			inputValue = 0;
	private int			rowCount = 0;
	private String		description[] = new String[]{"x", "y", "xi-xq","yi-yq","(xi-xq)²", "(yi-yq)²", "xi-xq * yi-yq"};
	private Object		values[][] 		={};
	private double		xq= 0;
	private double		yq = 0;
	
	
//---------------------------------------------------------------------------------------
	private JFrame		frame;
	
//---------------------------------------------------------------------------------------
	
	private JPanel		panelNorth;
	private JPanel		panelSouth;
	private JPanel		panelCenter;
	private JPanel		panelNorthNorth;
	private JPanel		panelNorthCenter;
	
//---------------------------------------------------------------------------------------
	private  JTextField 	txtRow;

//---------------------------------------------------------------------------------------
	
	private JLabel		lblAnzRow;
	
//---------------------------------------------------------------------------------------
	
	private JButton		btnInit;
	private JButton		btnCheck;
	private JButton		btnCalculate;
	private JButton		btnNew;
	
//---------------------------------------------------------------------------------------
	
	private JScrollPane scrollPane;
	private JTable		table;
	private DefaultTableModel model;

//---------------------------------------------------------------------------------------
	
	private JMenuBar 	menuBar;
	private JMenu  		menuOptions;
	private JMenu		menuHelp;
	private JMenuItem 	menuItemExit;
	private JMenuItem	menuItemAbout;
	
	
	
	
	public Fenster2() 
	{
		initComponents();
		addComponents();
		
		initFrame();
		
	}
	
	public void initFrame()
	{
		frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
		frame.setSize(532, 300);
		frame.setLocationRelativeTo(null);
		frame.setResizable(false);
		
		
	}
	
	public void drawWindow()
	{
		frame.setVisible(true);	
	}
	
	public void initComponents()
	{
		
		frame						= new JFrame();
		
		//---------------------------------------------------------------------------------------
		
		panelNorth 					= new JPanel();//border
		panelSouth					= new JPanel();//border
		panelCenter					= new JPanel();
		panelNorthNorth				= new JPanel();//border
		panelNorthCenter			= new JPanel();//flow
	
		//---------------------------------------------------------------------------------------
		
		txtRow						= new JTextField(5);
		
		//---------------------------------------------------------------------------------------
		
		lblAnzRow					= new JLabel("Anzahl der Zeilen");
		
		//---------------------------------------------------------------------------------------
		
		model = new DefaultTableModel(values, description);
		table						= new JTable(model);
		initTable();
		
		//---------------------------------------------------------------------------------------
		
		scrollPane					= new JScrollPane(table);
		
		//---------------------------------------------------------------------------------------
		
		menuBar						= new JMenuBar();
		menuOptions					= new JMenu("Options");
		menuHelp 					= new JMenu("Help");
		
		//---------------------------------------------------------------------------------------
		
		menuItemAbout				= new JMenuItem("About");
		menuItemAbout.setActionCommand("About");
		menuItemAbout.addActionListener(this);
		
		menuItemExit 				= new JMenuItem("Exit");
		menuItemExit.setActionCommand("Exit");
		menuItemExit.addActionListener(this);
		
		//---------------------------------------------------------------------------------------
		
		btnInit 					= new JButton("Initalisieren");
		btnInit.setActionCommand("btnInit");
		btnInit.addActionListener( this);
		
		btnCheck					= new JButton("Check");
		btnCheck.setActionCommand("btnCheck");
		btnCheck.addActionListener(this);
		btnCheck.setEnabled(false);
		
		btnCalculate					= new JButton("Calculate");
		btnCalculate.setActionCommand("btnCalculate");
		btnCalculate.addActionListener(this);
		btnCalculate.setEnabled(false);
		
		btnNew					=new JButton("New");
		btnNew.setActionCommand("btnNew");
		btnNew.addActionListener(this);
		
		//---------------------------------------------------------------------------------------
		
		//definition of layout
		frame.getContentPane().setLayout(new BorderLayout());
		panelNorth.setLayout(new BorderLayout());
		panelSouth.setLayout(new FlowLayout());
		panelCenter.setLayout(new BorderLayout());
		panelNorthNorth.setLayout(new BorderLayout());
		panelNorthCenter.setLayout(new FlowLayout(FlowLayout.LEFT,5,5));

	}
	
	public void addComponents()
	{
		
		frame.getContentPane().add(panelNorth, BorderLayout.NORTH);
		frame.getContentPane().add(panelSouth,BorderLayout.SOUTH);
		
		//---------------------------------------------------------------------------------------
		
		panelNorth.add(panelNorthNorth, BorderLayout.NORTH);
		panelNorth.add(panelNorthCenter,BorderLayout.CENTER);
		
		//---------------------------------------------------------------------------------------

		panelNorthNorth.add(menuBar, BorderLayout.NORTH);
		menuBar.add(menuOptions);
		menuBar.add(menuHelp);
		
		//---------------------------------------------------------------------------------------
		
		menuHelp.add(menuItemAbout);
		menuOptions.add(menuItemExit);
		
		//---------------------------------------------------------------------------------------
		
		panelNorthCenter.add(lblAnzRow);
		panelNorthCenter.add(txtRow);
		panelNorthCenter.add(btnInit);
		panelNorthCenter.add(btnCheck);
		panelNorthCenter.add(btnCalculate);
		panelNorthCenter.add(btnNew);
		
		//---------------------------------------------------------------------------------------
		
		panelCenter.add(scrollPane);
		frame.getContentPane().add(panelCenter,BorderLayout.CENTER);
			
		
		
	}

	@Override
	public void actionPerformed(ActionEvent e) 
	{

		if(e.getActionCommand().equals(menuItemAbout.getActionCommand()))
		{
			JOptionPane.showMessageDialog(frame, "Korrelator v 1.0 \n made by Hans Vocke","About", JOptionPane.INFORMATION_MESSAGE );
		}
		else if(e.getActionCommand().equals(menuItemExit.getActionCommand()))
		{
			System.exit(0);
		}

		else if(e.getActionCommand().equals(btnInit.getActionCommand()))
		{
			inputValue = Einlesen.einlInt();
			rowCount   = table.getRowCount();
			DefaultTableModel model2 = ((DefaultTableModel)table.getModel());
			              
				if ((rowCount < inputValue) && inputValue >0)
				{
					for(int count = inputValue ;count >rowCount ;count--)
					{ 
						model2.addRow(new Object[]{});
					
						btnCheck.setEnabled(true);
					}
				}
				else if ((rowCount > inputValue) && inputValue >0)
					{
						for (int count = rowCount; count > inputValue; count-- )
						{
							model2.removeRow(1);
						}
					}			
				
		}
		else if(e.getActionCommand().equals(btnCheck.getActionCommand()))
				{
				System.out.println("check");
				}

		else if(e.getActionCommand().equals(btnCalculate.getActionCommand()))
				{
					
				}

		else if(e.getActionCommand().equals(btnNew.getActionCommand()))
				{
					System.out.println("new");
				}
		
	}
	
	
	
	public static String getJTextFieldText()
	{
		Fenster2 instanz =  new Fenster2();
		String txt = instanz.txtRow.getText();
		return  txt;
	}
	
	public void initTable()
	{
		table.setAutoResizeMode(table.AUTO_RESIZE_OFF);//Feste zellengröße bei mehreren spalten (scrollt seitlich)
		table.setRowSelectionAllowed(false); //blaumarkierung über die reihe ausschalten
		table.getTableHeader().setReorderingAllowed(false);// spalten unverschiebbar
		table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);//zell editierung beenden	
	}
	

}


die einlesenklasse


Java:
package Korrelation;

import java.io.BufferedReader;
import java.io.InputStreamReader;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class Einlesen 
{
	Fenster2 cons = new Fenster2();
	public static int  einlInt()
	{
		
		
		String intError = "Please enter a positiv integer Value";
		int wert = 0;
		
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		try
		{
			wert = Integer.parseInt(Fenster2.getJTextFieldText());
			if (wert <=0 )
			{
				JOptionPane.showMessageDialog(null,intError );	
				return -1;
			}
		}catch(Exception e)
		{
			JOptionPane.showMessageDialog(null,intError );
		}
		
		
		return wert;
	}
}

und die ausführklasse

Java:
public class Ausfueren {

	public static void main(String[] args)
	{
		 Fenster2 Jf = new  Fenster2();
		 Jf.drawWindow();
		

	}

}
 
du erzeugst eine Instanz in der Ausführen klasse , diese ruft deine Methoden zum erstellen des Fensters auf, das gleiche machst du in der Einlesen klasse , dadurch das du dort schreibst
Code:
Fenster2 cons = new Fenster2();
diese neue instanz ruft doch auch wieder deine mehtoden zum erstellen deines Frames auf , demnach hast du 2 Instanzen und auch 2 fenster ?!
 
huch die zeile hab ich ja komplett vergessen die hat eig keine bedeutung mehr hatte was ausproboert gehabt kann sozusaggen bedeutungslos entfernt werden 😳 jedenfalls das problem mit dem doppeltem fenster hab ich ja nun doch noch gelöst durch die extra methode drawWindow und den aufruf in der ausführen .. nun hab ich aber das problem das der text aus dem feld nicht gelesen wird und somit mein optionpane geschmissen wird ...
 
lass mal den stacktrace ausgeben 🙂

dann kann man wenigstens sehen warum er das OptionPane(ich vermute mal als Alert) schmeißt, ich tippe auf NpE oder ähnliches ^^
 
Zuletzt bearbeitet:
NumberFormatException
ich weiß zwar was es bedeutet allerdings versteh ich nicht wieso ... das die methode getText ein String übergibt ist mir klar aber dieser string wird doch durch das parsen in der einlesenMethode umgewandelt
wert = Integer.parseInt(Fenster2.getJTextFieldText()); <<<<<da ist der fehler laut exception

ich kann den sogenannten formatsfehler nicht nachvollziehen bei der version wo ich das feld noch static hatte hatte ich auch keine probleme


was ist NpE ? bitte keine abkürzungen kenn mich da nicht so aus 😳
 
Zuletzt bearbeitet:
hast du schonmal versucht direkt in deiner methode zu parsen anstatt beim aufruf?

sprich hier :

[JAVA=281]
String txt = instanz.txtRow.getText(); // int txt = Integer.parseInt(instanz.txtRow.getText());
[/code]

und wenn ja was gibt er dann aus ?.

[EDIT]mein Fehler , sorry [/EDIT]
 
Zuletzt bearbeitet:
hmm also du meinst direkt da das gettext parsen dann müsste ich allerdings den pars in der einlesenklasse entfernen (da die parsmethode ja einen string erwartet was dann aber ja keiner mehr ist ... ) nun ja habs ausprobiert kommt auf das selbe hinaus ... numberFormatException allerdings nun bei der geparsten gettext ... sozusagen das selbe in grün
 
hast du schonmal versucht direkt in deiner methode zu parsen anstatt beim aufruf?

und dir direkt den int wert zurückgeben zu lassen

sprich hier :

[JAVA=]
public static int getJTextFieldText(){

Fenster2 instanz = new Fenster2(); // <----ist das so gewollt ? erzeugt ja wieder eine neue Instanz
int txt = Integer.parseInt(instanz.txtRow.getText());
return txt;
}

[/code]

und wenn ja was gibt er dann aus ?.
 
Zuletzt bearbeitet:
hab ich doch gesagt hab ich gerade nachdem du mich gefragt hast versucht kommt genau das selbe ergebnis dabei raus und ja das ist so gewollt weil wenn ich die instanz nicht erstelle kann ich nicht auf die txtrow zugrifen da sie nicht statisch ist (was ja auch so sein soll)
 
schmeißt er denn die Exception egal was du eingibst ?

weil normalerweise schmeißt er ja nur ne NFException wenn der String ebend keine "Ganzzahl" enthält , falls dem so ist steh ich allerdings auch auf dem schlauch ???:L
 
also laut der exception ist das was er einliest >>"" <<< also im prinzip bekommt er garnichts aus dem feld gelesen .... als wäre es leer


hier einmal der komplette stacktrace (hab es wieder so umgeschrieben wie ich es vorher hatte also mit dem parsen in der einlesenklasse) ist aber die komplett selbe exception ...


java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at Korrelation.Einlesen.einlInt(Einlesen.java:22)
at Korrelation.Fenster2.actionPerformed(Fenster2.java:237)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
 
das scheint mir ganz dannach als wenn ebend deine Methode dein Textfeld nicht erkennt, bzw die Instanz des textfeldes, da er ja mehrmals (unknown Source) ausgibt, ggf. da du ja in der Methode selber eine neue Instanz erstellst und das Textfeld in dieser neu erzeugten Instanz ebend leer ist

ich tippe mal darauf das er versucht das Textfeld der neu erzeugten Fenster instanz zu parsen , in dem ja ebend nichts steht, deswegen auch der leere String und die NFE
 
Zuletzt bearbeitet:
also ich hab schonmal herausgefunden das es irgendwie an dem befehl

txt = instanz.txtRow.getText();

liegen muss weil, wenn ich txt vorinizialisiere mit einer ganzzahl dann funktioniert es mach ich dann aber instanz.txtRow.getText()
wirft er den fehler wieder aus ....
 
Java:
txt =	instanz.txtRow.getText();

bezieht sich ebend auf die neu angelegte Instanz
Code:
Fenster2 instanz = new Fenster2();
und die ist ebend leer bzw. das JTextField dieser Instanz 🙂
 
Zuletzt bearbeitet:
ja hab ich mir auch gerade gedacht aber wie soll ich es sonst machen mir wurde gesagt um auf ein objekt einer klasse (z.b. ein feld) zugreifen zu können muss ich eine instanz dieser klasse bilden und dann uber diese darauf zugreifen das hab ich getan aber wieso ist das nun aufeinmal leer .... bzw scheinbar erstellt es ja dann ein komplett neues unabängiges feld ....
 
Instanzvariablen ? ^^

du darfst einfach kein neues Fenster anlegen, wenn du ein neues Fenster anlegst , erzeugen deine Methoden im Konstuktor von Fenster ebend auch ein neues leeres textfeld , und in diesem versucht deine methode dann zu parsen , was ja nix bringen kann ausser ner Exception
 
hast du dir denn mal das MVC Pattern angeschaut ?

vor dem selben problem stehe ich zzt. nämlich auch da ich Gui von Logik trennen will , demnach quasi das selbe in grün.
 

Neue Themen


Zurück
Oben