Window Builder - Labels mit setText befüllen

Zassam

Mitglied
Hey,
ich habe gerade damit angefangen mich mit WindowBuilder zu beschäftigen. Dabei bin ich auf folgendes Problem gestoßen:
Ich möchte ein Programm erstellen das eine Stückzahl in ältere Maße, wie Dutzend umrechnet. Dazu habe ich mit WindowBuilder ein JFrame erstellt, mit einem JTextField zur eingabe und verschiedenen Labels in die die berechneten Werte dann ausgegeben werden. Ich wäre euch sehr dankbar wenn ihr mir dabei helfen könntet 🙂
1. Deklariert WindowBuilder meine Labels im ersten Teil des Programms schon nicht.
Java:
    private JPanel contentPane;
    private JTextField txtStueckzahl;
2. Dann deklariere ich mein JLabel und kann die Methode setText auch benutzen. Nachdem ich das Programm dann geschrieben habe und die Methode:
Java:
private void umrechnen(){
        int dutzend;
        stueck = Integer.parseInt(txtStueckzahl.getText());
        dutzend = stueck / 12;
        stueck = stueck % 12;
        lblDutzend.setText(String.valueOf(dutzend));}
Mir die Stückzahl in Dutzend berechnen soll und in dem JLabel ausgeben soll kommt folgender Fehlercode:
Java:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at gui.AlteZaehlweiseTest.umrechnen(AlteZaehlweiseTest.java:93)
    at gui.AlteZaehlweiseTest.access$0(AlteZaehlweiseTest.java:88)
    at gui.AlteZaehlweiseTest$2.actionPerformed(AlteZaehlweiseTest.java:61)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
Ich habe auch die Musterlösung, also wie das Programm aussehen muss damit es funktioniert. Stimmt mit meiner Version überein, trotzdem bekomme ich diese Fehlermeldung. Danke schomal im vorraus für jede Hilfe.
Liebe Grüße Nicklas
 
Ich habe das Programm jetzt mal debuggt, die Werte bekommen alle die richtigen Werte.
Wenn ich 15 eingebe, bekommt Stueck den Wert 15 und Dutzend bekommt den Wert 1, der Rest wird momentan noch nicht berücksichtigt.
Zeile 93 sieht folgendermaßen aus.
Java:
lblDutzend.setText(String.valueOf(dutzend));
Bzw. ohne String.valueOf() ergibt sich der gleiche Fehler.
 
Zuletzt bearbeitet:
Da ich den Fehler wirklich nicht sehe: Hier einmal mein Programm:
Java:
package gui;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Test01 extends JFrame {

    private JPanel contentPane;
    private JTextField txtStueckzahl;
    private JLabel lblDutzend;
    private JLabel lblSchock;
    private JLabel lblStueck;
    private JLabel lblGros;
    private JButton btnExit;
    private JButton btnBerechnen;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Test01 frame = new Test01();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Test01() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JLabel lblUeberschrift = new JLabel("Geben sie eine St\u00FCckzahl an:");
        lblUeberschrift.setBounds(10, 11, 200, 14);
        contentPane.add(lblUeberschrift);

        txtStueckzahl = new JTextField();
        txtStueckzahl.setBounds(10, 36, 200, 20);
        contentPane.add(txtStueckzahl);
        txtStueckzahl.setColumns(10);

        JButton btnBerechnen = new JButton("Berechnen");
        btnBerechnen.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                umrechnen();
            }
        });
        btnBerechnen.setBounds(220, 35, 89, 23);
        contentPane.add(btnBerechnen);

        JLabel lblGros = new JLabel("Gros");
        lblGros.setBounds(10, 67, 46, 14);
        contentPane.add(lblGros);

        JLabel lblSchock = new JLabel("Schock");
        lblSchock.setBounds(10, 92, 46, 14);
        contentPane.add(lblSchock);

        JLabel lblDutzend = new JLabel("Dutzend");
        lblDutzend.setBounds(10, 117, 46, 14);
        contentPane.add(lblDutzend);

        JLabel lblStck = new JLabel("St\u00FCck");
        lblStck.setBounds(10, 142, 46, 14);
        contentPane.add(lblStck);

        JButton btnExit = new JButton("Exit");
        btnExit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                System.exit(0);
            }
        });
        btnExit.setBounds(220, 142, 89, 23);
        contentPane.add(btnExit);
    }

    private void umrechnen() {
        int stueck, dutzend, gros, schok;
        stueck = Integer.parseInt(txtStueckzahl.getText());
        dutzend = stueck / 12;
        lblDutzend.setText(dutzend + " Dutzend");
    }
}
Und hier einmal die Musterlösung.
Java:
package gui;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class AlteZaehlweise extends JFrame {

    private JPanel contentPane;
    private JTextField tfStueckzahl;
    private JLabel lblGros;
    private JLabel lblSchock;
    private JLabel lblDutzend;
    private JLabel lblStueck;
    private JButton btnEnde;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
        try {
            AlteZaehlweise frame = new AlteZaehlweise();
            frame.setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
        }
    });
    }

    /**
     * Create the frame.
     */
    public AlteZaehlweise() {
    setTitle("Alte Z\u00E4hlweise");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 244);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);
   
    JLabel lblStueckzahl = new JLabel("Geben Sie eine St\u00FCckzahl an:");
    lblStueckzahl.setBounds(10, 11, 221, 14);
    contentPane.add(lblStueckzahl);
   
    tfStueckzahl = new JTextField();
    tfStueckzahl.addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                umrechnen();
            }
        }
    });
    tfStueckzahl.setBounds(10, 27, 99, 20);
    contentPane.add(tfStueckzahl);
    tfStueckzahl.setColumns(10);
   
    JButton btnInAlteZhlmae = new JButton("In alte Z\u00E4hlma\u00DFe umrechnen");
    btnInAlteZhlmae.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            umrechnen();
        }
    });
    btnInAlteZhlmae.setBounds(160, 26, 221, 23);
    contentPane.add(btnInAlteZhlmae);
   
    lblGros = new JLabel("Gros");
    lblGros.setBounds(10, 84, 154, 14);
    contentPane.add(lblGros);
   
    lblSchock = new JLabel("Schock");
    lblSchock.setBounds(10, 113, 99, 14);
    contentPane.add(lblSchock);
   
    lblDutzend = new JLabel("Dutzend");
    lblDutzend.setBounds(10, 140, 99, 14);
    contentPane.add(lblDutzend);
   
    lblStueck = new JLabel("St\u00FCck");
    lblStueck.setBounds(10, 168, 99, 14);
    contentPane.add(lblStueck);
   
    btnEnde = new JButton("Ende");
    btnEnde.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            System.exit(0);
        }
    });
    btnEnde.setBounds(231, 148, 89, 23);
    contentPane.add(btnEnde);
    }
   
    private void umrechnen() {
    int stueck, gros, schock, dutzend;
    stueck = Integer.parseInt(tfStueckzahl.getText());
    gros = stueck / 144;
    stueck = stueck % 144;
    schock = stueck / 60;
    stueck = stueck % 60;
    dutzend = stueck / 12;
    stueck = stueck % 12;
    lblGros.setText(gros + " Gros");
    lblSchock.setText(schock + " Schock");
    lblDutzend.setText(dutzend + " Dutzend");
    lblStueck.setText(stueck + " Stück");
    tfStueckzahl.requestFocus();
    tfStueckzahl.selectAll();
    }

}
Ich sehe den Fehler leider nicht, jedoch erscheint er immer wieder wenn ich mit WindowBuilder arbeite und Programm schreibe. Wäre sehr dankbar wenn ihr mal ein Blick darauf werfen würdet.
 
so...

dein Problem ist, dass du dein JLabel lblDutzend nicht initierst (es gibt dieses Element also noch nicht)

du musst es noch der Gui hinzufügen 😉
 
oh halt du hast was viel gravierenderes gemacht^^

du hast oben die Labels initiert, und definiert in der Hauptmethode, aber da instanziierst du das Label neu 😉

Ich habe dir den Code einmal korrigiert:

Java:
package gui;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Test01 extends JFrame {

     private final JPanel contentPane;
     private final JTextField txtStueckzahl;
     private final JLabel lblDutzend;
     private final JLabel lblSchock;
     private final JLabel lblStck;
     private final JLabel lblGros;
     private final JButton btnExit;
     private final JButton btnBerechnen;

     public static void main(String[] args) {
         EventQueue.invokeLater(new Runnable() {
             @Override
             public void run() {
                 try {
                     Test01 frame = new Test01();
                     frame.setVisible(true);
                 } catch (Exception e) {
                     e.printStackTrace();
                 }
             }
         });
     }

     /**
      * Create the frame.
      */
     public Test01() {
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         setBounds(100, 100, 450, 300);
         contentPane = new JPanel();
         contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
         setContentPane(contentPane);
         contentPane.setLayout(null);

         JLabel lblUeberschrift = new JLabel("Geben sie eine St\u00FCckzahl an:");
         lblUeberschrift.setBounds(10, 11, 200, 14);
         contentPane.add(lblUeberschrift);

         txtStueckzahl = new JTextField();
         txtStueckzahl.setBounds(10, 36, 200, 20);
         contentPane.add(txtStueckzahl);
         txtStueckzahl.setColumns(10);

         btnBerechnen = new JButton("Berechnen");
         btnBerechnen.addActionListener(new ActionListener() {
             @Override
             public void actionPerformed(ActionEvent arg0) {
                 umrechnen();
             }
         });
         btnBerechnen.setBounds(220, 35, 89, 23);
         contentPane.add(btnBerechnen);

         lblGros = new JLabel("Gros");
         lblGros.setBounds(10, 67, 46, 14);
         contentPane.add(lblGros);

         lblSchock = new JLabel("Schock");
         lblSchock.setBounds(10, 92, 46, 14);
         contentPane.add(lblSchock);

         lblDutzend = new JLabel("Dutzend");
         lblDutzend.setBounds(10, 117, 46, 14);
         contentPane.add(lblDutzend);

         lblStck = new JLabel("St\u00FCck");
         lblStck.setBounds(10, 142, 46, 14);
         contentPane.add(lblStck);

         btnExit = new JButton("Exit");
         btnExit.addActionListener(new ActionListener() {
             @Override
             public void actionPerformed(ActionEvent arg0) {
                 System.exit(0);
             }
         });
         btnExit.setBounds(220, 142, 89, 23);
         contentPane.add(btnExit);
     }

     private void umrechnen() {
         double stueck, dutzend;
         stueck = Integer.parseInt(txtStueckzahl.getText());
         dutzend = stueck / 12;
         lblDutzend.setText(dutzend + " Dutzend");
     }
}
 
Danke sehr ! Jetzt sehe ich den Fehler auch. Aber warum macht WindowBuilder das denn nicht standardtmäßig so? Arbeitet ihr auch mit WindowBuilder, und muss ich das jetzt immer manuell im Quelllcode ändern?
Lg Nicklas 🙂
 
Ich kenne den window Bildet nicht, aber ich empfehle dir netbeans zu verwenden (das hat von Grund auf einen richtigen GUI Bilder implementiert und da braucht Grundsätzlich nichts am generierten code ändern (ausser man programmiert sehr fortgeschritten)

EDIT: in meinen Augen ist Netbeans die beste Entwicklungsumgebung die Java, die es für den Desktop gibt 😉
 
Okay da können die Meinungen außeinander gehen. Ich habe schon mit Netbeans gearbeitet und finde Eclipse dann doch um einiges besser. Aber das ist ja geschmackssache. Danke euch auf jeden Fall für eure Hilfe ! 🙂 Lg Nicklas
 

Neue Themen


Zurück
Oben