textfeld entfernen

  • Themenstarter Themenstarter liquid
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
L

liquid

Gast
hallo!
es geht mal wieder um meinen breakout klon und um das thema listener. das problem ist, dass ich in "fenster extends jframe" über schaltflächen verschiedene jpanels reinlade. die sache ist nun, dass ich in einem der panels über ein JTextfield den spielernamen einlesen will und nach drücken des "weiter"-buttons direkt ins spiel gelangen soll. das macht er auch ohne probleme. nur wird das textfeld nicht entfernt, behält somit den focus und schluckt mir deshalb alle keyevents im spiel. das "getContentPane().remove(em1);" und das "em1.removeAll();"in der "setzeImSpiel()" sollten doch alle komponenten entfernen und die "cleanUpListeners();" alle listener. wie bekomme ich das textfeld weg, bzw. wie ändere ich den focus? requestFocus() im spiel aufzurufen, funktioniert nicht. außerdem wärs mir lieber, er würde das einstellungen-menu samt textfeld komplett entfernen... 😉
ich hoffe, euch reichen die code-fragmente aus, um mir weiterzuhelfen. alles zu posten wäre zu umfangreich. also, schon mal danke für die hilfe.
mfg

Code:
// Fenster extends JFrame
        public Fenster(){
		setTitle("Breakout");
		setSize(breite, hoehe);
		
		// am Anfang ins Menu
		setzeImMenu();
                // vom Menu aus über Buttons ins Einstellungen-Menu und dann ins Spiel
		
		// zum Schließen des Fensters
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);		
		
		setVisible(true);
	}

// erstelle spiel-objekt in fenster und entfernen der anderen komponenten
	public void setzeImSpiel(){
		cleanUpListeners();
		s1 = new Spiel(this);
		getContentPane().add(s1);
		//s1.requestFocus();

		// em1 ist das einstellungen-menu, in dem ich das textfeld erstelle
                if(em1 != null){
			getContentPane().remove(em1);
			em1.removeAll();
			em1 = null;
		}	
		imSpiel = true;
		imMenu = false;
		highscoreMenu = false;
		einstellungenMenu = false;
		leveleditor = false;
	}

// entferne alle listener
public void cleanUpListeners(){
		//mouseListeners
		MouseListener[] mls = getMouseListeners();
		for(int z1=0; z1 < mls.length; z1++){
			removeMouseListener(mls[z1]);
		}
		// mousemotionlisteners
		MouseMotionListener[] mmls = getMouseMotionListeners();
		for(int z1=0; z1 < mmls.length; z1++){
			removeMouseMotionListener(mmls[z1]);
		}
		// keylisteners		
		KeyListener[] kls = getKeyListeners();
		for(int z1=0; z1 < kls.length; z1++){
			removeKeyListener(kls[z1]);
		}
	}

// der konstruktor vom einstellungen-menu extends jpanel sieht so aus:

public EinstellungenMenu(Fenster f){
		this.f = f;
		f.setBackground(Color.GREEN);
		f.getContentPane().setLayout(null);
		name = new JTextField();
		name.setBounds(100, 100, 60, 20);
		f.getContentPane().add(name);
		name.requestFocus();
		// schaltfläche
		weiter = new Rectangle(200, 200, 150, 34);
		f.addMouseListener(new MouseListener(){

			public void mouseClicked(MouseEvent arg0) {
				if(weiter.contains(arg0.getPoint())){
					f.spieler.setName(name.getText());
					f.setzeImSpiel();
				}
			}
                });
	}
 
Du hast ein Design-Problem im EinstellungenMenu.
Du übergibst dem Konstruktor eine Referenz auf den JFrame (Fenster) und fügst dann
das textfeld direkt dem JFrame hinzu. Das EinstellungenMenu ist von dir aber als JPanel gedacht
(extends JPanel). Daher solltest du das textfeld auch diesem JPanel hinzufügen!
Als Schaltfläche würde ich einen JButton in den JPanel setzen mit ActionListener auf dem JButton.
Dann brauchst du nur noch den JPanel dem JFrame hinzuzufügen bzw vom JFrame wegzunehmen
(frame.remove(panel)) und frame.validate() aufzurufen.
 
danke erstmal für die schnelle antwort!
sowas in der art hatte ich mir schon gedacht. aber wenn ich die komponenten dem panel hinzufüge, und nicht dem frame, wird nichts davon angezeigt. woran kann das liegen?
mfg
 
so, habs nochmal probiert, angezeigt wird es schon teilweise, aber dafür bekomm ich ein zusätzliches problem mit den listenern (funktionieren teilweise nicht mehr) und der hintergrund-farbe etc. die buttons muß ich weglassen, will das menu über ein hintergrund-bild machen, deshalb die rects als schaltflächen.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben