Swing TextField auslesen

CGFoX

Mitglied
Hi,
ich wir haben gerade Swing und GUI Programmierung in der Uni kennengelernt.
Es geht nun darum einen "Ball", der sich bewegt (das hab ich schon) und ein Rechteck, zu dem man als Benutzer von außen, vorm Start die Koordinaten angeben kann (hier liegt das Problem), zu programmieren.
Ich hätte jetzt an die Klasse TextField gedacht, um so eine Eingabefeld für x-, und y-Koordinate zu erzeugen. Das Klappt auch. Aber ich kann nichts daraus auslesen!
Ich möchte ja, sobald auf den Start-Button geklickt wird, die Koordinaten ausgelesen werden, und das Rechteck an der richtigen Stelle erzeugt wird.
Hab jetzt schon gegooglet und in der Api nachgesehn. Aber mit .getText() kommen nur Fehlermeldungen. Zumal ich ja keinen String haben will, sondern eine int-Variable.

Ich kopier mal den Code hier rein (das Problem ist in Zeile 42/43):
Java:
package aufgabe1;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class MyPanel extends JPanel {
	private static final long serialVersionUID = 1L;
	
	private int x;	//Koordinaten des Ziels/Rechtecks
	private int y;
	
	Box box; 
	JTextField xTextField;
	JTextField yTextField;
	 
	 MyPanel () {
		 //Erzeugen der Komponenten
	     Box box = new Box();        
	     JButton startButton = new JButton("Start");        
	     JTextField xTextField = new JTextField("x-Koord. des Ziels");
	     JTextField yTextField = new JTextField("y-Koord. des Ziels");
	     
	     
	     //Erzeugen der Listner
	     startButton.addActionListener(new StartAction());
	     
	     //Layout
	     JPanel panel = new JPanel();
	     panel.setLayout(new FlowLayout());
	     panel.add(xTextField);
	     panel.add(yTextField);
	     panel.add(startButton);
	     
	     this.setLayout(new BorderLayout());
	     this.add(panel, BorderLayout.NORTH);
	     this.add(box, BorderLayout.CENTER);
	 }
	 
	 class StartAction implements ActionListener {
	     public void actionPerformed(ActionEvent e) {
	         box.setAnimation(true);
	         x = parseInt(xTextField.getText());	//hier meckert Eclipse rum: 
	         y = parseInt(yTextField.getText());	//"The method parseInt(String) is undefined for the type MyPanel.StartAction"
	     }
	 }
}
 
Stimmt, jetzt kann ich das Ding immerhin kompilieren und ausführen.
Im Anhang findet man das Programm direkt nach dem Start. Das Rechteck ist oben links in der Ecke, das liese sich verhindern.
Und wenn man die Koordinaten eingibt, dann kommen tausend Fehlermeldungen.
Kanns sein, dass TextField nicht das richtige ist?
Edit: Hab nochmal nen besseren Screenschot hochgeladen
 

Anhänge

  • java.jpg
    java.jpg
    32,1 KB · Aufrufe: 49
Zuletzt bearbeitet:
Das meit dem Rechteck habe ich erledigt.

Hab nen Screenshot von den Fehlermeldungen im Anhang.
 

Anhänge

  • fehlermeldungen.jpg
    fehlermeldungen.jpg
    95,4 KB · Aufrufe: 33
Code:
box.setAnimation(true);

Dazu ist die Box-Klasse mit der Methode vllt ganz nützlich:

Java:
package aufgabe1;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Box extends JPanel {
	private static final long serialVersionUID = 1L;
	private int x;	//Koordinaten des Ziels
	private int y;
	
	private Ball ball = new Ball(50, 200, 2, 3);
	private int interval = 35;  //Die Position des Balls wird alle interval=35ms erneuert.
	private Timer timer;           

	 public Box() {
	     setPreferredSize(new Dimension(800, 400));
	     setBorder(BorderFactory.createLineBorder(Color.BLACK));
	     timer = new Timer(interval, new TimerAction());
	 }
	 
	 public void setZiel (int x, int y) {
		 this.x = x;
		 this.y = y;
	 }
	 
	 private void ziel (int x, int y, Graphics g) {
		 g.setColor(Color.BLUE);
		 g.fillRect(x, y, 30, 30);
	 }
	 
	 public void setAnimation(boolean turnOnOff) {	//Der Ball bewegt sich, solange der Timer läuft. Hier kann der Timer gestartet und gestoppt werden.
	     if (turnOnOff) {
	         timer.start(); 
	     } 
	     else {
	         timer.stop();  
	     }
	 }
	
	 public void paintComponent(Graphics g) {
	     super.paintComponent(g);  
	     ball.draw(g);     
	 }

	 public void aktualisiere () {
		 Graphics g = getGraphics();
		 ziel(x, y, g);
		 repaint();
	 }
	 
	 class TimerAction implements ActionListener {
	     public void actionPerformed(ActionEvent e) {
	         ball.setBounds(getWidth(), getHeight());
	         ball.move();  
	         aktualisiere();    
	     }
	 }
}
 
Du machst in MyPanel am anfang einmal eine Variable Box (
Code:
Box box;
) und danach nochmal eine (
Code:
MyPanel () {
		
	     Box box = new Box();
) und die Variable box vom anfang ist damit aber immernoch null
 
Also das war schonmal ein sehr guter Tipp:
Immerhin bewegt sich jetzt der Ball!
Aber es kommt immer noch die selbe dumme Fehlermeldung.
Übrigens ist die Variable turnOnOff in setAnimation als true ausgegeben worden.
Vllt liegt das irgendwie am Timer, ich kenne mich mit denen nicht aus und weiß gar nicht genau was die machen. Hab den Teil nur von der Vorlesung übernommen.
 
Zuletzt bearbeitet:
nee ist nicht unlogisch. Du machst zweimal im MyPanel eine Box - Variable , genannt box.

einmal Zeile 12 und einmal Zeile 18.

Die 'box' zeile 18 ist jedoch nur im abschnitt des constructers MyPanel() gültig und die Variable aus Zeile 12 ist noch nicht initialisiert(
Code:
Box box =new Box();
).

du musst in zeile 12 aus
Code:
Box box;
ein
Code:
Box box=new Box();
machen und die Zeile 12 rauslöschen.
 
Ich lad nochmal alle Klassen in der aktuellen Fassung hoch, vllt findest du ja noch was.


Java:
package aufgabe1;
import java.awt.*;

public class Ball {	
	final static int DIAMETER = 10;	//Dicke des Balls
	
	private int x;           		//Koordinaten
	private int y;
	
	private int velocityX;  		//Bewegung
	private int velocityY;
	
	private int rightBound;  		//Ränder
	private int bottomBound;

	
	 public Ball(int x, int y, int velocityX, int velocityY) {	 
	     this.x = x;
	     this.y = y;
	     this.velocityX = velocityX;
	     this.velocityY = velocityY;
	 }
	 
	 public int  getDiameter() { return DIAMETER;}
	 public int  getX()        { return x;}
	 public int  getY()        { return y;}
	 
	 public void setPosition(int x, int y) {
	     this.x = x;
	     this.y = y;
	 }
	 
	 public void setBounds(int width, int height) {
	     rightBound  = width  - DIAMETER;
	     bottomBound = height - DIAMETER;
	 }
	 
	 public void move() {
	     x += velocityX;
	     y += velocityY;        
	     
	     if (x < 0) {                 
	         x         = 0;            
	         velocityX = -velocityX; 
	         
	     } else if (x > rightBound) {
	         x         = rightBound;    
	         velocityX = -velocityX; 
	     }
	     
	     if (y < 0) {               
	         y       = 0;
	         velocityY = -velocityY;
	         
	     } else if (y > bottomBound) { 
	         y       =  bottomBound;
	         velocityY = -velocityY;
	     }
	 }
	
	 public void draw(Graphics g) {
	     g.fillOval(x, y, DIAMETER, DIAMETER);
	 } 
}


Java:
package aufgabe1;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Box extends JPanel {
	private static final long serialVersionUID = 1L;
	private int x;	//Koordinaten des Ziels
	private int y;
	
	private Ball ball = new Ball(50, 200, 2, 3);
	private int interval = 35;  //Die Position des Balls wird alle interval=35ms erneuert.
	private Timer timer;           

	 public Box() {
	     setPreferredSize(new Dimension(800, 400));
	     setBorder(BorderFactory.createLineBorder(Color.BLACK));
	     timer = new Timer(interval, new TimerAction());
	     timer.stop();
	 }
	 
	 public void setZiel (int x, int y) {
		 this.x = x;
		 this.y = y;
	 }
	 
	 private void ziel (int x, int y, Graphics g) {
		 g.setColor(Color.BLUE);
		 g.fillRect(x, y, 30, 30);
	 }
	 
	 public void setAnimation(boolean turnOnOff) {	//Der Ball bewegt sich, solange der Timer läuft. Hier kann der Timer gestartet und gestoppt werden.
		 //System.out.println(turnOnOff);
	     if (turnOnOff) {
	         timer.start(); 
	     } 
	     else {
	         timer.stop();  
	     }
	 }
	
	 public void paintComponent(Graphics g) {
	     super.paintComponent(g);  
	     ball.draw(g);     
	 }

	 public void aktualisiere () {
		 Graphics g = getGraphics();
		 ziel(x, y, g);
		 repaint();
	 }
	 
	 class TimerAction implements ActionListener {
	     public void actionPerformed(ActionEvent e) {
	         ball.setBounds(getWidth(), getHeight());
	         ball.move();  
	         aktualisiere();    
	     }
	 }
}


Java:
package aufgabe1;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class MyPanel extends JPanel {
	private static final long serialVersionUID = 1L;

	Box box = new Box(); 
	JTextField xTextField;	//Eingabemöglichkeit für die Koordinaten des Ziels
	JTextField yTextField;
	 
	 MyPanel () {
		 //Erzeugen der Komponenten       
	     JButton startButton = new JButton("Start");        
	     JTextField xTextField = new JTextField(20);
	     JTextField yTextField = new JTextField(20);
	     JLabel xlabel = new JLabel("   x-Koordinate des Ziels");
	     JLabel ylabel = new JLabel("   y-Koordinate des Ziels");
	     
	     
	     //Erzeugen der Listner
	     startButton.addActionListener(new StartAction());
	     
	     //Layout
	     JPanel panel = new JPanel();
	     panel.setLayout(new FlowLayout());
	     panel.add(xlabel);
	     panel.add(xTextField);
	     panel.add(ylabel);
	     panel.add(yTextField);
	     panel.add(startButton);
	     
	     this.setLayout(new BorderLayout());
	     this.add(panel, BorderLayout.NORTH);
	     this.add(box, BorderLayout.CENTER);
	 }
	 
	 class StartAction implements ActionListener {
	     public void actionPerformed(ActionEvent e) {
	         box.setAnimation(true);
	         final int x = Integer.parseInt(xTextField.getText());	//hier meckert Eclipse rum: 
	         final int y = Integer.parseInt(yTextField.getText());	//"The method parseInt(String) is undefined for the type MyPanel.StartAction"
	         box.setZiel(x, y);
	     }
	 }
}


Java:
package aufgabe1;
import javax.swing.*;

public class Minigolf extends JFrame {
	private static final long serialVersionUID = 1L;

	public Minigolf() {
        add(new MyPanel());
    }
    
    public static void main(String[] args) {
        JFrame frame = new JFrame("Minigolf");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new MyPanel());
        frame.pack();	//Arrangchiert die Kompontenten im Fenster
        frame.setVisible(true); 
    }
}
 
ok es gibt mehrere verschiedene Fehlermeldungen.

1. Du versuchst den Wert aus einem leeren JTextField zu holen (Zeile 44/45)
2. Du hast die Koordinaten x und y in Box nicht initialisiert und wenn niemand was in die JTextFields schreibt dann sind die nunmal fähig eine NPE zu werfen.
3. Wofür ist die Methode setZiel wenn du sie nie aufrufst? //EDIT: tust du doch 😉


Hier mal die Jar von einem Programm von mir, das das tut, was deins glaub ich mal machen soll 🙂
 

Anhänge

Hm. Ich hab nochmal dranrum probiert, aber irgendwie ist es nicht besser geworden.
Und dein Programm ist auch anders. Meines soll einen bewegten Ball und ein festes Ziel/Rechteck haben.
Es bewegt sich zwar der Ball, aber es wird immer eine NPE geworfen und das Rechteck flackert links oben in der Ecke. Wahrscheinlich, weil er die Textfelder nicht richtig auslesen kann. Ich weiß aber nicht, was ich noch machen soll. :/
Hier die geänderten Dateien (MyPanel, Box):

Java:
package aufgabe1;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class MyPanel extends JPanel {
	private static final long serialVersionUID = 1L;

	Box box = new Box(); 
	JTextField xTextField;	//Eingabemöglichkeit für die Koordinaten des Ziels
	JTextField yTextField;
	 
	 MyPanel () {
		 //Erzeugen der Komponenten       
	     JButton startButton = new JButton("Start");        
	     JTextField xTextField = new JTextField(10);
	     JTextField yTextField = new JTextField(10);
	     JLabel xlabel = new JLabel("    X:");
	     JLabel ylabel = new JLabel("    Y:");
	     
	     
	     //Erzeugen der Listner
	     startButton.addActionListener(new StartAction());
	     
	     //Layout
	     JPanel panel = new JPanel();
	     panel.setLayout(new FlowLayout());
	     panel.add(xlabel);
	     panel.add(xTextField);
	     panel.add(ylabel);
	     panel.add(yTextField);
	     panel.add(startButton);
	     
	     this.setLayout(new BorderLayout());
	     this.add(panel, BorderLayout.SOUTH);
	     this.add(box, BorderLayout.CENTER);
	 }
	 
	 class StartAction implements ActionListener {
	     public void actionPerformed(ActionEvent e) {
	    	 //Graphics g = getGraphics();
	         box.setAnimation(true);
	         box.setZiel(xTextField, yTextField);
	     }
	 }
}

Java:
package aufgabe1;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Box extends JPanel {
	private static final long serialVersionUID = 1L;
	
	private int x;	//Koordinaten des Ziels
	private int y;	
	private Ball ball = new Ball(50, 200, 2, 3);
	private int interval = 35;  //Die Position des Balls wird alle interval=35ms erneuert.
	private Timer timer;           

	 public Box() {
	     setPreferredSize(new Dimension(800, 400));
	     setBorder(BorderFactory.createLineBorder(Color.BLACK));
	     timer = new Timer(interval, new TimerAction());
	     timer.stop();
	 }
	 
	 public void setZiel (JTextField x, JTextField y) {
		 try {
			 this.x = Integer.parseInt(x.getText());
			 this.y = Integer.parseInt(y.getText());
		 }
		 catch (Exception e) {
			 System.out.println("Fehler: \n " + e);
		 }
	 }
	 
	 private void ziel (int x, int y, Graphics g) {
		 g.setColor(Color.BLUE);
		 g.fillRect(x, y, 30, 30);
	 }
	 
	 public void setAnimation(boolean turnOnOff) {	//Der Ball bewegt sich, solange der Timer läuft. Hier kann der Timer gestartet und gestoppt werden.
	     if (turnOnOff) {
	         timer.start(); 
	     } 
	     else {
	         timer.stop();  
	     }
	 }
	
	 public void paintComponent(Graphics g) {
	     super.paintComponent(g);  
	     ball.draw(g);     
	 }
	 
	 class TimerAction implements ActionListener {
	     public void actionPerformed(ActionEvent e) {
	    	 Graphics g = getGraphics();
	         ball.setBounds(getWidth(), getHeight());
	         ball.move();  
	         repaint();
	         ziel(x, y, g);
	     }
	 }
}
 
Ist ja logisch dass eine npe geworfen wird da die textfields ja auch leer sind. Bau vorher eine if Abfrage ein. (vor dem
Code:
getText()
)
 
In der Klasse Box?
Aber die Abfrage behebt das Problem ja nicht, schließlich habe ich jedesmal etwas in die Textfelder eingetragen, bervor ich Start gecklickt habe. Sie waren also gar nicht leer.
 
ich war mal nett 😛

Java:
package aufgabe1;
import java.awt.*;
 
public class Ball { 
    final static int DIAMETER = 10; //Dicke des Balls
    
    private int x;                  //Koordinaten
    private int y;
    
    private int velocityX;          //Bewegung
    private int velocityY;
    
    private int rightBound;         //Ränder
    private int bottomBound;
 
    
     public Ball(int x, int y, int velocityX, int velocityY) {   
         this.x = x;
         this.y = y;
         this.velocityX = velocityX;
         this.velocityY = velocityY;
     }
     
     public int  getDiameter() { return DIAMETER;}
     public int  getX()        { return x;}
     public int  getY()        { return y;}
     
     public void setPosition(int x, int y) {
         this.x = x;
         this.y = y;
     }
     
     public void setBounds(int width, int height) {
         rightBound  = width  - DIAMETER;
         bottomBound = height - DIAMETER;
     }
     
     public void move() {
         x += velocityX;
         y += velocityY;        
         
         if (x < 0) {                 
             x         = 0;            
             velocityX = -velocityX; 
             
         } else if (x > rightBound) {
             x         = rightBound;    
             velocityX = -velocityX; 
         }
         
         if (y < 0) {               
             y       = 0;
             velocityY = -velocityY;
             
         } else if (y > bottomBound) { 
             y       =  bottomBound;
             velocityY = -velocityY;
         }
     }
    
     public void draw(Graphics g) {
         g.fillOval(x, y, DIAMETER, DIAMETER);
     } 
}

Java:
package aufgabe1;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
public class Box extends JPanel {
    private static final long serialVersionUID = 1L;
    private int x;  //Koordinaten des Ziels
    private int y;
    
    private Ball ball = new Ball(50, 200, 2, 3);
    private int interval = 25;  //Die Position des Balls wird alle interval=35ms erneuert.
    private Timer timer;           
 
     public Box() {
         setPreferredSize(new Dimension(800, 400));
         setBorder(BorderFactory.createLineBorder(Color.BLACK));
         timer = new Timer(interval, new TimerAction());
         timer.stop();
     }
     
     public void setZiel (int x, int y) {
         this.x = x;
         this.y = y;
     }
     
     public void setAnimation(boolean turnOnOff) {  //Der Ball bewegt sich, solange der Timer läuft. Hier kann der Timer gestartet und gestoppt werden.
         //System.out.println(turnOnOff);
         if (turnOnOff) {
             timer.start(); 
         } 
         else {
             timer.stop();  
         }
     }
    
     public void paintComponent(Graphics g) {
         super.paintComponent(g);  
         g.setColor(Color.BLUE);
         g.fillRect(x, y, 30, 30);
         ball.draw(g);     
     }
     
     class TimerAction implements ActionListener {
         public void actionPerformed(ActionEvent e) {
             ball.setBounds(getWidth(), getHeight());
             ball.move();  
             repaint(); 
         }
     }
}

Java:
package aufgabe1;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
class MyPanel extends JPanel {
    private static final long serialVersionUID = 1L;
 
    Box box = new Box(); 
    JTextField xTextField;  //Eingabemöglichkeit für die Koordinaten des Ziels
    JTextField yTextField;
     
     MyPanel () {
         //Erzeugen der Komponenten       
         JButton startButton = new JButton("Start");        
         JTextField xTextField = new JTextField(20);
         JTextField yTextField = new JTextField(20);
         JLabel xlabel = new JLabel("   x-Koordinate des Ziels");
         JLabel ylabel = new JLabel("   y-Koordinate des Ziels");
         
         
         //Erzeugen der Listner
         startButton.addActionListener(new StartAction());
         
         //Layout
         JPanel panel = new JPanel();
         panel.setLayout(new FlowLayout());
         panel.add(xlabel);
         panel.add(xTextField);
         panel.add(ylabel);
         panel.add(yTextField);
         panel.add(startButton);
         
         this.setLayout(new BorderLayout());
         this.add(panel, BorderLayout.NORTH);
         this.add(box, BorderLayout.CENTER);
     }
     
     class StartAction implements ActionListener {
         public void actionPerformed(ActionEvent e) {
             box.setAnimation(true);
             
             int x=10;
             int y=10;
             
             if(xTextField!=null)
                 x = Integer.parseInt(xTextField.getText());  
             if(yTextField!=null)
                 y = Integer.parseInt(yTextField.getText()); 

             box.setZiel(x, y);
         }
     }
}

Java:
package aufgabe1;
import javax.swing.*;
 
public class Minigolf extends JFrame {
    private static final long serialVersionUID = 1L;
 
    public Minigolf() {
        add(new MyPanel());
    }
    
    public static void main(String[] args) {
        JFrame frame = new JFrame("Minigolf");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new MyPanel());
        frame.pack();   //Arrangchiert die Kompontenten im Fenster
        frame.setVisible(true); 
    }
}
 
Top, danke!
Leider erkennt er immer noch nicht, wenn etwas in den Textfeldern steht und nimmt die Standardbelegung von x=y=10.
Weißt du, woran das liegen könnte?
Edit: Eine Fehlermeldung kommt jetzt aber nicht mehr.
 
Zuletzt bearbeitet:
na stimmt... ich hab das programm danach auf bugs nicht mehr getestet... es liegt daran, dass du wieder wie bei der 'box' Variable einmal eine im konstruktor machst und eine oben in der klasse diese aber nicht initialisierst ....

so sollte das aussehen:

Java:
class MyPanel extends JPanel {
    private static final long serialVersionUID = 1L;
 
    Box box = new Box(); 
    JTextField xTextField=new JTextField(20);  //Eingabemöglichkeit für die Koordinaten des Ziels
    JTextField yTextField=new JTextField(20);
     
     MyPanel () {
         //Erzeugen der Komponenten       
         JButton startButton = new JButton("Start");        
         JLabel xlabel = new JLabel("   x-Koordinate des Ziels");
         JLabel ylabel = new JLabel("   y-Koordinate des Ziels");

und man sollte

Java:
             if(xTextField!=null)
                 x = Integer.parseInt(xTextField.getText());  
             if(yTextField!=null)
                 y = Integer.parseInt(yTextField.getText());

zu
Java:
             if(xTextField.getText()!=null)
                 x = Integer.parseInt(xTextField.getText());  
             if(yTextField.getText()!=null)
                 y = Integer.parseInt(yTextField.getText());
ändern
 

Zurück
Oben