Problem mit Array

Status
Nicht offen für weitere Antworten.

Antoras

Top Contributor
Hallo,

Also, ich habe 20 Textfelder in ein JFrame erstellt. Bei diesen möchte ich nun die eingegebenen Zahlen auslesen. Jetzt hab ich allerdings da Problem, dass ich bei jedem TF nun jedes Mal die Zeile zahl1 = Integer.parseInt(jTextField1.getText() usw. schreiben muss - umständlich, vor allem bei der Weiterverarbeitung der Integerwerte.
Also wollte ich die TF mit einem Array kreieren. Beim Kompilieren bekomm ich dann aber immer folgende Fehlermeldungen:
java.lang.NullPointerException
at java.awt.Container.addImpl(Container.java:1027)
at java.awt.Container.add(Container.java:352)
at AIT_KA2.initGUI(AIT_KA2.java:81)
at AIT_KA2.<init>(AIT_KA2.java:64)
at AIT_KA2$1.run(AIT_KA2.java:55)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
So sieht der Code ohne Array aus:
Code:
public class AIT_KA2 extends javax.swing.JFrame {	
	     private JPanel jPanel1;
        private JTextField jTextField1; //usw. bis 20

        private void initGUI() {
		try {
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			getContentPane().setLayout(null);
			{
				jPanel1 = new JPanel();
				getContentPane().add(jPanel1);
				LayoutManager jPanel1Layout = null;
				jPanel1.setLayout(jPanel1Layout);
				jPanel1.setBounds(0, 6, 395, 132);
				jPanel1.setBorder(BorderFactory.createTitledBorder("Noten der Schüler"));
				jPanel1.setLayout(null);
				{
					jTextField1 = new JTextField();
					jPanel1.add(jTextField1);
					jTextField1.setBounds(10, 20, 71, 22);
				}
				{
					jTextField2 = new JTextField();
					jPanel1.add(jTextField2);
					jTextField2.setBounds(87, 20, 71, 22);
				}
                                //usw. bis zum 20 Textfeld
Und so mit:
Code:
public class AIT_KA2 extends javax.swing.JFrame {	
	     private JTextField jTextField[] = new JTextField[20];	
        private JPanel jPanel1;

        private void initGUI() {
		try {
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			getContentPane().setLayout(null);
			{
				jPanel1 = new JPanel();
				getContentPane().add(jPanel1);
				LayoutManager jPanel1Layout = null;
				jPanel1.setLayout(jPanel1Layout);
				jPanel1.setBounds(0, 6, 395, 132);
				jPanel1.setBorder(BorderFactory.createTitledBorder("Noten der Schüler"));
				jPanel1.setLayout(null);
				{
					jPanel1.add(jTextField[1]);
					jTextField[1].setBounds(10, 20, 71, 22);
				}
				{
					jPanel1.add(jTextField[2]);
					jTextField[2].setBounds(87, 20, 71, 22);
				}
                                //usw. bis zum 20 Textfeld

Ich hab einfach ein Array mit 20 Elementen erstellt und den Code so editiert, dass statt den normalen TF die Array-TF erstellt werden. Eclipse zeigt mir aber keine offensichtliche Fehler an.

Kann mir jemand sagen, warum das nicht geht?

PS: Die ganze funktionierende Klasse, falls was unverständlich ist (Iasst euch nicht von dem KA beeindrucken, die ist schon längst vorbei):
Code:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class AIT_KA2 extends javax.swing.JFrame {	
	//private JTextField jTextField[] = new JTextField[20];	
	private JPanel jPanel1;
	private JTextField jTextField9;
	private JTextField jTextField8;
	private JTextField jTextField7;
	private JTextField jTextField6;
	private JLabel jLabel8;
	private JLabel jLabel7;
	private JLabel jLabel6;
	private JLabel jLabel5;
	private JLabel jLabel4;
	private JTextField jTextField28;
	private JTextField jTextField27;
	private JTextField jTextField26;
	private JTextField jTextField25;
	private JTextField jTextField24;
	private JTextField jTextField23;
	private JTextField jTextField22;
	private JLabel jLabel3;
	private JLabel jLabel2;
	private JTextField jTextField21;
	private JTextField jTextField10;
	private JTextField jTextField20;
	private JLabel jLabel1;
	private JButton jButton2;
	private JButton jButton1;
	private JTextField jTextField19;
	private JTextField jTextField18;
	private JTextField jTextField17;
	private JTextField jTextField16;
	private JTextField jTextField15;
	private JTextField jTextField14;
	private JTextField jTextField13;
	private JTextField jTextField12;
	private JTextField jTextField11;
	private JTextField jTextField5;
	private JTextField jTextField4;
	private JTextField jTextField3;
	private JTextField jTextField2;
	private JTextField jTextField1;
	private JPanel jPanel2;

	/**
	* Auto-generated main method to display this JFrame
	*/
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				AIT_KA2 inst = new AIT_KA2();
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);
			}
		});
	}
	
	public AIT_KA2() {
		super();
		initGUI();
	}
	
	private void initGUI() {
		try {
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			getContentPane().setLayout(null);
			{
				jPanel1 = new JPanel();
				getContentPane().add(jPanel1);
				LayoutManager jPanel1Layout = null;
				jPanel1.setLayout(jPanel1Layout);
				jPanel1.setBounds(0, 6, 395, 132);
				jPanel1.setBorder(BorderFactory.createTitledBorder("Noten der Schüler"));
				jPanel1.setLayout(null);
				{
					jTextField1 = new JTextField();
					jPanel1.add(jTextField1);
					jTextField1.setBounds(10, 20, 71, 22);
				}
				{
					jTextField2 = new JTextField();
					jPanel1.add(jTextField2);
					jTextField2.setBounds(87, 20, 71, 22);
				}
				{
					jTextField3 = new JTextField();
					jPanel1.add(jTextField3);
					jTextField3.setBounds(164, 20, 71, 22);
				}
				{
					jTextField4 = new JTextField();
					jPanel1.add(jTextField4);
					jTextField4.setBounds(241, 20, 71, 22);
				}
				{
					jTextField5 = new JTextField();
					jPanel1.add(jTextField5);
					jTextField5.setBounds(318, 20, 71, 22);
				}
				{
					jTextField6 = new JTextField();
					jPanel1.add(jTextField6);
					jTextField6.setBounds(10, 48, 71, 22);
				}
				{
					jTextField7 = new JTextField();
					jPanel1.add(jTextField7);
					jTextField7.setBounds(87, 48, 71, 22);
				}
				{
					jTextField8 = new JTextField();
					jPanel1.add(jTextField8);
					jTextField8.setBounds(164, 48, 71, 22);
				}
				{
					jTextField9 = new JTextField();
					jPanel1.add(jTextField9);
					jTextField9.setBounds(241, 48, 71, 22);
				}
				{
					jTextField10 = new JTextField();
					jPanel1.add(jTextField10);
					jTextField10.setBounds(318, 48, 71, 22);
				}
				{
					jTextField11 = new JTextField();
					jPanel1.add(jTextField11);
					jTextField11.setBounds(8, 76, 71, 22);
				}
				{
					jTextField12 = new JTextField();
					jPanel1.add(jTextField12);
					jTextField12.setBounds(87, 76, 71, 22);
				}
				{
					jTextField13 = new JTextField();
					jPanel1.add(jTextField13);
					jTextField13.setBounds(164, 76, 71, 22);
				}
				{
					jTextField14 = new JTextField();
					jPanel1.add(jTextField14);
					jTextField14.setBounds(241, 76, 71, 22);
				}
				{
					jTextField15 = new JTextField();
					jPanel1.add(jTextField15);
					jTextField15.setBounds(318, 76, 71, 22);
				}
				{
					jTextField16 = new JTextField();
					jPanel1.add(jTextField16);
					jTextField16.setBounds(8, 104, 71, 22);
				}
				{
					jTextField17 = new JTextField();
					jPanel1.add(jTextField17);
					jTextField17.setBounds(87, 104, 71, 22);
				}
				{
					jTextField18 = new JTextField();
					jPanel1.add(jTextField18);
					jTextField18.setBounds(164, 104, 71, 22);
				}
				{
					jTextField19 = new JTextField();
					jPanel1.add(jTextField19);
					jTextField19.setBounds(241, 104, 71, 22);
				}
				{
					jTextField20 = new JTextField();
					jPanel1.add(jTextField20);
					jTextField20.setBounds(318, 104, 71, 22);
				}
			}
			{
				jPanel2 = new JPanel();
				getContentPane().add(jPanel2);
				LayoutManager jPanel2Layout = null;
				jPanel2.setLayout(jPanel2Layout);
				jPanel2.setBounds(0, 172, 395, 215);
				jPanel2.setBorder(BorderFactory.createTitledBorder("Häufigkeiten"));
				jPanel2.setLayout(null);
				{
					jLabel2 = new JLabel();
					jPanel2.add(jLabel2);
					jLabel2.setText("Häufigkeiten von 0:");
					jLabel2.setBounds(69, 18, 129, 15);
				}
				{
					jLabel3 = new JLabel();
					jPanel2.add(jLabel3);
					jLabel3.setText("Häufigkeiten von 1:");
					jLabel3.setBounds(69, 46, 129, 15);
				}
				{
					jTextField22 = new JTextField();
					jPanel2.add(jTextField22);
					jTextField22.setBounds(204, 15, 79, 22);
					jTextField22.setEditable(false);
				}
				{
					jTextField23 = new JTextField();
					jPanel2.add(jTextField23);
					jTextField23.setBounds(204, 43, 79, 22);
					jTextField23.setEditable(false);
				}
				{
					jTextField24 = new JTextField();
					jPanel2.add(jTextField24);
					jTextField24.setBounds(204, 71, 79, 22);
					jTextField24.setEditable(false);
				}
				{
					jTextField25 = new JTextField();
					jPanel2.add(jTextField25);
					jTextField25.setBounds(204, 99, 79, 22);
					jTextField25.setEditable(false);
				}
				{
					jTextField26 = new JTextField();
					jPanel2.add(jTextField26);
					jTextField26.setBounds(204, 127, 79, 22);
					jTextField26.setEditable(false);
				}
				{
					jTextField27 = new JTextField();
					jPanel2.add(jTextField27);
					jTextField27.setBounds(204, 155, 79, 22);
					jTextField27.setEditable(false);
				}
				{
					jTextField28 = new JTextField();
					jPanel2.add(jTextField28);
					jTextField28.setBounds(204, 183, 79, 22);
					jTextField28.setEditable(false);
				}
				{
					jLabel4 = new JLabel();
					jPanel2.add(jLabel4);
					jLabel4.setText("Häufigkeiten von 2:");
					jLabel4.setBounds(69, 74, 129, 15);
				}
				{
					jLabel5 = new JLabel();
					jPanel2.add(jLabel5);
					jLabel5.setText("Häufigkeiten von 3:");
					jLabel5.setBounds(69, 102, 129, 15);
				}
				{
					jLabel6 = new JLabel();
					jPanel2.add(jLabel6);
					jLabel6.setText("Häufigkeiten von 4:");
					jLabel6.setBounds(69, 130, 129, 15);
				}
				{
					jLabel7 = new JLabel();
					jPanel2.add(jLabel7);
					jLabel7.setText("Häufigkeiten von 5:");
					jLabel7.setBounds(69, 158, 129, 15);
				}
				{
					jLabel8 = new JLabel();
					jPanel2.add(jLabel8);
					jLabel8.setText("Häufigkeiten von 6:");
					jLabel8.setBounds(69, 186, 129, 15);
				}
			}
			{
				jButton1 = new JButton();
				getContentPane().add(jButton1);
				jButton1.setText("Einlesen");
				jButton1.setBounds(7, 144, 98, 22);
				jButton1.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent evt) {
						jButton1ActionPerformed(evt);
					}
				});
			}
			{
				jLabel1 = new JLabel();
				getContentPane().add(jLabel1);
				jLabel1.setText("Durchschnitt:");
				jLabel1.setBounds(217, 147, 91, 15);
			}
			{
				jTextField21 = new JTextField();
				getContentPane().add(jTextField21);
				jTextField21.setBounds(313, 144, 79, 22);
			}
			{
				jButton2 = new JButton();
				getContentPane().add(jButton2);
				jButton2.setText("Rechnen");
				jButton2.setBounds(108, 144, 98, 22);
				jButton2.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent evt) {
						jButton2ActionPerformed(evt);
					}
				});
			}
			pack();
			this.setSize(416, 425);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private void jButton1ActionPerformed(ActionEvent evt) {
		
	}
	
	private void jButton2ActionPerformed(ActionEvent evt) {
		
	}

}
 
Ja stimmt, das war falsch. Ich Trottel.

Aber auch egal. daran liegt es nicht. So einen Fehler würde mir Eclipse direkt im Editor anzeigen. Aber ich bekommm erst beim Kompilieren die Fehlermeldungen. Das ist ja das komische.
 
Also, der Aufruf...

Code:
private JTextField jTextField[] = new JTextField[20];

...erstellt ein Feld, das Platz für 20 JTextFields hat, aber nicht die 20 JTextFields selber. Die 20 Plätze werden (wie für alle Objekt-Typen) einfach mit null gefüllt, weswegen du ja auch eine NullPointerException bekommst, wenn du etwas mit den nicht vorhandenen JTextFields anstellen willst.

Lösung: Eine Schleife, die das Feld vor der Verwendung erst einmal füllt:
Code:
for (int i = 0; i < jTextField.length; i++) {
   jTextField[i] = new JTextField();
   //wenn du willst, kannst du gleich noch 
   //Eigenschaften für die Felder setzen
   //(Schriftart, Größe usw.) 
}

Übrigens: Bei *primitiven* Typen wie int, long, byte, boolean usw. gibt es kein "null", deshalb werden Felder diesen Typs mit 0 (bzw. false) vor-gefüllt.
 
Juhuuuu, es geht.
Danke dir!

Irgendwie komm ich mit den Swing/SWT Oberflächen noch nicht so richtig klar. Naja, das wird schon noch. Noch ein paar Mal den gleichen Fehler machen und ich behersch es 😉
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben