JTextField

MariusMeier

Mitglied
Hallo zusammen

ich weiss ist ne einfache sache aber irgendwie krieg ichs nicht raus:

Code:
public void keyReleased(KeyEvent e) {
			if(e.getKeyCode() == KeyEvent.VK_ENTER) {
				FormelParser fp1 = new FormelParser();
				//tfZaehler.
				System.out.println(tfZaehler.getText().toString());
				//fp1.setEquation(tfZaehler.getText());
			}
		}

Im obigen Code will ich den Text eines JTextField erhalten.... nach Enter drücken soll das passieren.... aber als Ausgabe erhalte ich nur einen leeren String.... muss man irgendwie den Focus stoppen um den Inhalt des Textfeldes zu bekommen? wie?

MFG Marius Meier
 
Das sollte funktionieren:

Code:
import java.awt.BorderLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JTextField;

public class JTextFieldTest implements KeyListener{
JTextField tfZaehler = new JTextField();

    public void keyReleased(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_ENTER) {
        
            System.out.println(tfZaehler.getText());
            //fp1.setEquation(tfZaehler.getText());
        }
    }
    
    private void createAndShowGUI() {

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());

        
        frame.add(tfZaehler, BorderLayout.CENTER);
        tfZaehler.addKeyListener(this);
        
        frame.setSize(100, 100);
        frame.setVisible(true);
    }

    public JTextFieldTest(){
        createAndShowGUI();
    }
    
    public static void main(String[] args) {

        new JTextFieldTest();
    }
    @Override
    public void keyPressed(KeyEvent arg0) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void keyTyped(KeyEvent arg0) {
        // TODO Auto-generated method stub
        
    }
}
 
Mh? Mir scheint das immer noch das gleiche zu sein wie mein Code bzw. das funktioniert nicht. Andere Vorschläge?

MFG Marius Meier
 
also bei mir funktioniert es, keine ahnung warum es bei dir nicht geht..

poste mal deinen ganzen code damit ich den testen kann.
 
OK hier ist Code:

Code:
package GUI;

import javax.swing.*;

import ParseEngine.FormelParser;

import java.awt.*;
import java.awt.event.*;

public class p2GUI extends JFrame{

	private JSpinner ordnungFilter;
	private JTextField tfZaehler;
	
	private JLabel lblZaehler;
	private JLabel lblVarWerte;
	
	public p2GUI(String title) {
		super(title);
		
		setLayout(null);
		
		valuePanel vp = new valuePanel();
		vp.setBounds(600, 10, 300, 300);
		add(vp);
		
		formelPanel fp = new formelPanel();
		fp.setBounds(100, 10, 300, 300);
		add(fp);
		
		optionPanel op = new optionPanel();
		op.setBounds(10, 400, 200, 300);
		add(op);
	}
	
	private class formelPanel extends JPanel {
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			
			this.setLayout(null);
			
			tfZaehler = new JTextField();
			tfZaehler.setBounds(70, 10, 200, 20);
			tfZaehler.addKeyListener(new formelKeyListener());
			add(tfZaehler);
			
			lblZaehler = new JLabel("Zähler: ");
			lblZaehler.setBounds(10, 10, 60, 20);
			add(lblZaehler);
		}
	}
	
	private class valuePanel extends JPanel {
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			
			this.setLayout(null);
			
			lblVarWerte = new JLabel("Werte für Variabel setzen: ");
			lblVarWerte.setBounds(10, 10, 160, 20);
			add(lblVarWerte);
		}
	}
	
	private class optionPanel extends JPanel {
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			
			this.setLayout(null);
			
			ordnungFilter = new JSpinner(new SpinnerNumberModel(12,0,20,2));
			JFormattedTextField tf = ((JSpinner.DefaultEditor)ordnungFilter.getEditor()).getTextField();
			tf.setEditable(false);
			ordnungFilter.setBounds(10, 10, 50, 20);
			this.add(ordnungFilter);
		}
		
		
	}
	
	public class formelKeyListener implements KeyListener {
		
		public void keyTyped(KeyEvent e) {
			
		}
		
		public void keyPressed(KeyEvent e) {

		}

		public void keyReleased(KeyEvent e) {
			if(e.getKeyCode() == KeyEvent.VK_ENTER) {
				FormelParser fp1 = new FormelParser();
				//tfZaehler.
				System.out.println(tfZaehler.getText());
				//fp1.setEquation(tfZaehler.getText());
			}
		}
	}
	
	public static void main(String[] args) {
		p2GUI fenster = new p2GUI("Active filter design");
		Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
		fenster.setSize(dim);
		fenster.setVisible(true);
	}

}

Den code kannst du nicht testen weil du warscheindlich die jep-Bibliothek nicht hast. Aber villeicht siehst du ja woanders das Problem?

MFG Marius Meier
 
Ich habe den import einfach entfern um nur das Feld zu testen aber leider muss ich sagen das es bei mir funktioniert

Welche Java Version benutzt du? (Obwohl dies auch bei den alten funktionieren sollte)


Ich habe im Moment jdk 1.6.0_01
 
mh ja ersdtaundlicherweise funktionierts wirklich... aber ich weiss was mein problem ist... wenn du das fenster mit der Maus verkleinerst und dann wieder ein Wert ins Textfeld schreibts und Enter drückst gibt die Konsole einen leeren String aus... warum hat das was damit zu tun dass das Panel den Focus verliert ?

MFG Marius Meier
 
ok ich hab das problem

Code:
package de.ms.tableests;

import javax.swing.*;



import java.awt.*;
import java.awt.event.*;

public class p2GUI extends JFrame{

    private JSpinner ordnungFilter;
    private JTextField tfZaehler;
    
    private JLabel lblZaehler;
    private JLabel lblVarWerte;
    
    public p2GUI(String title) {
        super(title);
        
        setLayout(null);
        
        valuePanel vp = new valuePanel();
        vp.setBounds(600, 10, 300, 300);
        add(vp);
        
        formelPanel fp = new formelPanel();
        fp.setFocusable(true);
        fp.setBounds(100, 10, 300, 300);
        add(fp);
        
        optionPanel op = new optionPanel();
        op.setBounds(10, 400, 200, 300);
        add(op);
    }
    
    private class formelPanel extends JPanel {
        public formelPanel(){
            this.setLayout(null);
            
            tfZaehler = new JTextField();
            tfZaehler.setBounds(70, 10, 200, 20);
            tfZaehler.addKeyListener(new formelKeyListener());
            add(tfZaehler);
            
            lblZaehler = new JLabel("Zähler: ");
            lblZaehler.setBounds(10, 10, 60, 20);
            add(lblZaehler);
        }
        
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            
            
        }
    }
    
    private class valuePanel extends JPanel {
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            
            this.setLayout(null);
            
            lblVarWerte = new JLabel("Werte für Variabel setzen: ");
            lblVarWerte.setBounds(10, 10, 160, 20);
            add(lblVarWerte);
        }
    }
    
    private class optionPanel extends JPanel {
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            
            this.setLayout(null);
            
            ordnungFilter = new JSpinner(new SpinnerNumberModel(12,0,20,2));
            JFormattedTextField tf = ((JSpinner.DefaultEditor)ordnungFilter.getEditor()).getTextField();
            tf.setEditable(false);
            ordnungFilter.setBounds(10, 10, 50, 20);
            this.add(ordnungFilter);
        }
        
        
    }
    
    public class formelKeyListener implements KeyListener {
        
        public void keyTyped(KeyEvent e) {
            
        }
        
        public void keyPressed(KeyEvent e) {

        }

        public void keyReleased(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_ENTER) {
                //FormelParser fp1 = new FormelParser();
                //tfZaehler.
                System.out.println(tfZaehler.getText());
                //fp1.setEquation(tfZaehler.getText());
            }
        }
    }
    
    public static void main(String[] args) {
        p2GUI fenster = new p2GUI("Active filter design");
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        fenster.setSize(dim);
        fenster.setVisible(true);
    }

}


Schau dir das an:

Code:
public void paintComponent(Graphics g) {
			super.paintComponent(g);
			
			this.setLayout(null);
			
			tfZaehler = new JTextField();
			tfZaehler.setBounds(70, 10, 200, 20);
			tfZaehler.addKeyListener(new formelKeyListener());
			add(tfZaehler);
			
			lblZaehler = new JLabel("Zähler: ");
			lblZaehler.setBounds(10, 10, 60, 20);
			add(lblZaehler);
		}

Jedesmal wenn die Komponente neu "gezeichnet" wird, wird ein neues JTxtField usw. erstellt.

Ändere es das es etwa so aussieht:

Code:
 private class formelPanel extends JPanel {
        public formelPanel(){
            this.setLayout(null);
            
            tfZaehler = new JTextField();
            tfZaehler.setBounds(70, 10, 200, 20);
            tfZaehler.addKeyListener(new formelKeyListener());
            add(tfZaehler);
            
            lblZaehler = new JLabel("Zähler: ");
            lblZaehler.setBounds(10, 10, 60, 20);
            add(lblZaehler);
        }
        
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            
            
        }
    }


Mach das am besten mit allen JPanels usw.
 
Ok ja du hast recht. Die Komponenten werden immer wieder gezeichnet. Habs jetzt so gäendert wie du es mir empfohlen hast. Funktioniert einwandfrei! Danke!
Trotzdem noch ne Frage: Im prinzip hätte ich ja abfragen können ob das JTextfield schon mal gezeichnet wurde mit einem IF-Statement... egal aber etwas verstehe ich nicht.
Ist demfall die paintComponent nur für Zeichnungen (Linien, Kreise, Rechtecke, ... usw.) geeignet?
Ich habe das JPanel genommen weil ich noch neben den Komponenten eine Linie zeichnen möchte....

MFG Marius Meier
 
ICh kenne mich nicht 100 % mit den paint Methoden aus, aber jedesmal wenn ein Komponent sich ändert wird die Methode ausgeführt um die Komponente darzustellen.

Es ist nicht sinvoll in der paint Methode Objekte zu erzeugen.

Wenn du Zeichnen willst kannst du das immer noch.
Zeichnen kannst du theoretisch überall in Jbuttons, JFrame, Jpanel, JLabel usw.
 
Zurück