Fürge nur ein JTextField ein und danach wird nichts mehr angezeigt

Zidinjo

Mitglied
Hallo meine Freunde,

lerne grade ein wenig GUI. Jetzt habe ich folgendes Problem. Undzwar wenn ich ein einfaches JTextField hinzufüge, dann wird im GuI nichts mehr angezeigt. Wenn ich dies auskommentiere, dann geht alles wieder. Weiß jemand woran es liegt?

Java:
package de.marvin.taschenrechner;

import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class GuiOberflaeche extends JFrame {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	JButton but1,but2,but3,but4,but5,but6,but7,but8,but9,but0,butPlus,butMinus,butMal,butGeteilt,but10,but11;
	JPanel ersteBox, zweiteBox, dritteBox, vierteBox;
	JTextField feld;
	
	public GuiOberflaeche(boolean wollen) 
	{
		super("Mein erster Taschenrechner");
		this.setSize(400,400);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setResizable(false);
		anzeigen(wollen);
		
		panel1();
		panel2();
		
		dritteBox = new JPanel();
		dritteBox.setLayout(new GridLayout(1,1));
		dritteBox.add(ersteBox);
		dritteBox.add(zweiteBox);
		this.add(dritteBox);
		
	}
	
	private void panel1()
	{
		ersteBox = new JPanel();
		ersteBox.setLayout(new GridLayout(4,4));
		
		but0 = new JButton("0");
		ersteBox.add(but0);
		
		but1 = new JButton("1");
		ersteBox.add(but1);
		
		but2 = new JButton("2");
		ersteBox.add(but2);
		
		but3 = new JButton("3");
		ersteBox.add(but3);
		
		but4 = new JButton("4");
		ersteBox.add(but4);
		
		but5 = new JButton("5");
		ersteBox.add(but5);
		
		but6 = new JButton("6");
		ersteBox.add(but6);
		
		but7 = new JButton("7");
		ersteBox.add(but7);
		
		but8 = new JButton("8");
		ersteBox.add(but8);
		
		but10 = new JButton("clear");
		ersteBox.add(but10);
		
		but9 = new JButton("9");
		ersteBox.add(but9);
		
		but11 = new JButton("=");
		ersteBox.add(but11);
	}
	
	private void panel2()
	{
		zweiteBox = new JPanel();
		zweiteBox.setLayout(new GridLayout(2,2));
		
//		feld = new JTextField();
//		zweiteBox.add(feld);
		
		butPlus = new JButton("+");
		zweiteBox.add(butPlus);
		
		butMinus = new JButton("-");
		zweiteBox.add(butMinus);
		
		butMal = new JButton("*");
		zweiteBox.add(butMal);
		
		butGeteilt = new JButton("/");
		zweiteBox.add(butGeteilt);
	}
	
	
	private void anzeigen(boolean wollen)
	{
		this.setVisible(wollen);
	}
}
 
Moin,

schau mal in die Java-Konsole !!
Ich tippe mal verstärkt darauf, dass dort eine NPE fliegt, da Dein 'feld' dort schlicht und einfach NULL ist 🙂

Gruß Klaus
 
Zuletzt bearbeitet:
Was heißt das genau ? wenn ich JTextField("hallo",20); eintrage, dann geht es trotzdem nicht.

Noch immer das gleiche Problem 🙁 Habe diesmal versucht mit dem GridBag zu arbeiten.

Java:
package de.marvin.taschenrechner;
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class GuiOberflaeche extends JFrame {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	JButton but1,but2,but3,but4,but5,but6,but7,but8,but9,but0,butPlus,butMinus,butMal,butGeteilt,but10,but11;
	JPanel ersteBox, zweiteBox, dritteBox, vierteBox;
	JTextField feld;
	
	public GuiOberflaeche(boolean wollen) 
	{
		super("Mein erster Taschenrechner");
		this.setSize(400,400);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setResizable(false);
		anzeigen(wollen);
		
		panel1();
		panel2();
		panel3();
		
		dritteBox = new JPanel();
		dritteBox.setLayout(new GridBagLayout());
		
		GridBagConstraints c = new GridBagConstraints();
		c.fill = GridBagConstraints.HORIZONTAL;
		
		c.gridy = 1;
		c.gridx = 0;
		dritteBox.add(ersteBox, c);
		
		c.gridx = 1;
		c.gridy = 1;
		dritteBox.add(zweiteBox, c);
		
		c.gridx = 0;
		c.gridy = 0;
		c.gridwidth = 2;
		dritteBox.add(vierteBox, c);
		this.add(dritteBox);
		
	}
	
	private void panel1()
	{
		ersteBox = new JPanel();
		ersteBox.setLayout(new GridLayout(4,4));
		
		but0 = new JButton("0");
		ersteBox.add(but0);
		
		but1 = new JButton("1");
		ersteBox.add(but1);
		
		but2 = new JButton("2");
		ersteBox.add(but2);
		
		but3 = new JButton("3");
		ersteBox.add(but3);
		
		but4 = new JButton("4");
		ersteBox.add(but4);
		
		but5 = new JButton("5");
		ersteBox.add(but5);
		
		but6 = new JButton("6");
		ersteBox.add(but6);
		
		but7 = new JButton("7");
		ersteBox.add(but7);
		
		but8 = new JButton("8");
		ersteBox.add(but8);
		
		but10 = new JButton("clear");
		ersteBox.add(but10);
		
		but9 = new JButton("9");
		ersteBox.add(but9);
		
		but11 = new JButton("=");
		ersteBox.add(but11);
	}
	
	private void panel2()
	{
		zweiteBox = new JPanel();
		zweiteBox.setLayout(new GridLayout(2,2));

		butPlus = new JButton("+");
		zweiteBox.add(butPlus);
		
		butMinus = new JButton("-");
		zweiteBox.add(butMinus);
		
		butMal = new JButton("*");
		zweiteBox.add(butMal);
		
		butGeteilt = new JButton("/");
		zweiteBox.add(butGeteilt);
	}
	
	private void panel3()
	{
		vierteBox = new JPanel();
		vierteBox.setLayout(new BorderLayout());
		feld = new JTextField(20);
		vierteBox.add(feld, BorderLayout.CENTER);
	}
	
	
	private void anzeigen(boolean wollen)
	{
		this.setVisible(wollen);
	}
}
 
Zuletzt bearbeitet:
So ich hab dir einiges verbessert.

- Man leitet nicht von JFrame ab (Stichwort: Composition over Inheritance -> Warum sieh im Bereich FAQ nach)
- frame.setVisible(true) sollte ganz zum Schluß erfolgen, denn jedes weitere hinzufügen von Elementen, invalidiert den Component-Tree und man muss <container>.revalidate() und eventuell repaint aufrufen.
- Viele deiner Controls müssen nicht als Felder deklariert werden.
- Man sollte auch eine GUI am EventThread laufen lassen (SwingUtilities.invokeLater(...))
- Englische Bezeichner verwenden
- Sprechende Namen verwenden (für deine Panels -> was beinhalten sie?)

Java:
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class GuiOberflaeche {

  public static void main(String... args) {
    SwingUtilities.invokeLater(new Runnable() {
      @Override
      public void run() {
        new GuiOberflaeche();
      }
    });
  }

  public GuiOberflaeche() {
    JFrame frame = new JFrame("Mein erster Taschenrechner");
    frame.setSize(400, 400);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);

    JPanel mainPanel = new JPanel();
    mainPanel.setLayout(new GridBagLayout());

    GridBagConstraints c = new GridBagConstraints();
    c.fill = GridBagConstraints.HORIZONTAL;

    c.gridy = 1;
    c.gridx = 0;
    mainPanel.add(createNumberPanel(), c);

    c.gridx = 1;
    c.gridy = 1;
    mainPanel.add(createOperationPanel(), c);

    c.gridx = 0;
    c.gridy = 0;
    c.gridwidth = 2;
    mainPanel.add(createTextPanel(), c);

    frame.add(mainPanel);
    frame.setVisible(true);
  }

  private JPanel createNumberPanel() {
    JPanel numberBox = new JPanel();
    numberBox.setLayout(new GridLayout(4, 4));

    JButton but0 = new JButton("0");
    numberBox.add(but0);

    JButton but1 = new JButton("1");
    numberBox.add(but1);

    JButton but2 = new JButton("2");
    numberBox.add(but2);

    JButton but3 = new JButton("3");
    numberBox.add(but3);

    JButton but4 = new JButton("4");
    numberBox.add(but4);

    JButton but5 = new JButton("5");
    numberBox.add(but5);

    JButton but6 = new JButton("6");
    numberBox.add(but6);

    JButton but7 = new JButton("7");
    numberBox.add(but7);

    JButton but8 = new JButton("8");
    numberBox.add(but8);

    JButton but10 = new JButton("clear");
    numberBox.add(but10);

    JButton but9 = new JButton("9");
    numberBox.add(but9);

    JButton but11 = new JButton("=");
    numberBox.add(but11);

    return numberBox;
  }

  private JPanel createOperationPanel() {
    JPanel operationBox = new JPanel();
    operationBox.setLayout(new GridLayout(2, 2));

    JButton butPlus = new JButton("+");
    operationBox.add(butPlus);

    JButton butMinus = new JButton("-");
    operationBox.add(butMinus);

    JButton butMal = new JButton("*");
    operationBox.add(butMal);

    JButton butGeteilt = new JButton("/");
    operationBox.add(butGeteilt);

    return operationBox;
  }

  private JPanel createTextPanel() {
    JPanel textBox = new JPanel();
    textBox.setLayout(new BorderLayout());
    JTextField feld = new JTextField(20);
    textBox.add(feld, BorderLayout.CENTER);
    return textBox;
  }
}
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben