Erste Schritte 2D Grafik Probleme mit KeyListener.

sryy

Mitglied
Hallo ich habe da ein Problem mit einem KeyListener, & Methode. 😀
Das Programm soll Fahrenheit in Celsius Umwandeln ganz einfach aufgebaut.
und ein wenig Benutzer Komfort zb. mit Enter den Umrechen Button betätigen.
die Methode Funktioniert irgendwie garnicht eine Aktuellere Vorlage were ganz nett.
Inklusive ein Veraltetes Objekt das ein anderes Format ausgeben soll.
Die Ausgabe in Celsius sieht sehr Unschön aus ( 56.6666666666667) <- zum Beispiel.
Ich Arbeite mit Eclipse Java Oxygen.

Java:
package uebung08;

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.JTextPane;
import javax.swing.JButton;
import javax.swing.UIManager;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class celsius extends JFrame {

    private JPanel contentPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
        } catch (Throwable e) {
            e.printStackTrace();
        }
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    celsius frame = new celsius();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public celsius() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 375, 190);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        setTitle("Hallo Du Da!");
       
        JLabel lblFahrenheit = new JLabel("Grad Fahrenheit");
        lblFahrenheit.setBounds(10, 11, 121, 14);
        contentPane.add(lblFahrenheit);
       
        JTextPane tfFahrenheit = new JTextPane();
        tfFahrenheit.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if(e.getKeyCode() == KeyEvent.VK_ENTER) {
                   /* Hir soll die Methode Umrechnen hin. 
                       umrechnen(); */
                }
            }
        });
        tfFahrenheit.setBounds(10, 38, 180, 22);
        contentPane.add(tfFahrenheit);
       
        JLabel lblGradCelsius = new JLabel("Grad Celsius");
        lblGradCelsius.setBounds(10, 73, 79, 16);
        contentPane.add(lblGradCelsius);
       
        JTextPane tfCelsius = new JTextPane();
        tfCelsius.setEditable(false);
        tfCelsius.setBounds(10, 102, 180, 22);
        contentPane.add(tfCelsius);
       
        JButton btnUmrechnen = new JButton("Umrechnen");
        btnUmrechnen.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                double celsius, Fahrenheit;
                // DecimalFormat f = new DecimalFormat("#0.00");
                Fahrenheit = Double.parseDouble(tfFahrenheit.getText());
                celsius = (Fahrenheit - 32) * 5 / 9;              // Hir wird aus Fahrenheit = Celsius
                tfCelsius.setText(String.valueOf(celsius));
                tfFahrenheit.requestFocus();
                tfFahrenheit.selectAll();
               
            }
        });
        btnUmrechnen.setBounds(232, 35, 112, 25);
        contentPane.add(btnUmrechnen);
       
        JButton btnExit = new JButton("Exit");
        btnExit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                System.exit(0);
            }
        } );
        btnExit.setBounds(232, 102, 112, 25);
        contentPane.add(btnExit);
       
    }
}

Das soll dann die Methode sein.
Java:
private void umrechnen() {
            double celsius, Fahrenheit;
            // DecimalFormat f = new DecimalFormat("#0.00"); // <- Das Objekt das ich meine.
            Fahrenheit = Double.parseDouble(tfFahrenheit.getText());
            celsius = (Fahrenheit - 32) * 5 / 9;
            tfCelsius.setText(String.valueOf(celsius));
            tfFahrenheit.requestFocus();
            tfFahrenheit.selectAll();
        }

Sie gibt eine menge Fehler aus allerdings ist Sie mir als Vorlage gegeben,
Es ist schon ein Älteres Buch, Kaufe mir danach ein neueres.
Ich würde mich sehr Über Hilfe Freuen.😵
PS bin neu hir nicht böse sein wen das hir der falsche Platz ist für meine Frage.🙁
 
Moin,
Hallo ich habe da ein Problem mit einem KeyListener, & Methode. 😀
Das Programm soll Fahrenheit in Celsius Umwandeln ganz einfach aufgebaut.
und ein wenig Benutzer Komfort zb. mit Enter den Umrechen Button betätigen.
die Methode Funktioniert irgendwie garnicht eine Aktuellere Vorlage were ganz nett.
Inklusive ein Veraltetes Objekt das ein anderes Format ausgeben soll.
Die Ausgabe in Celsius sieht sehr Unschön aus ( 56.6666666666667) <- zum Beispiel.
Ich Arbeite mit Eclipse Java Oxygen.
Offen gestanden verstehe ich hier nur *bahnhof* ... 😕

Sie gibt eine menge Fehler aus
Wer auch immer SIE ist ... verrätst Du auch, welche Fehler?? Stacktrace??

VG Klaus
 
Entschuldigt vielmals. Heute ging alles etwas drunter und drüber.
Hier nochmal in schön 😀
Also ich möchte ein kleines Programm schreiben das Fahrenheit in Celsius umwandelt.
Die Formel lautet: Celsius = (Fahrenheit - 32) * 5 / 9;
Es also das 2D-Grafik Programm soll ein wenig Benutzer Komfort haben.
Unter anderem ein:
bleibenden Fokus. Und nach dem Mouse Click auf Button, Select All...
Und noch das wen man auf Enter drückt der Button Umrechnen betätigt wird.
Java:
tfFahrenheit.requestFocus(); // tf = textField
tfFahrenheit.selectAll();
Mein Problem besteht mit dem KeyListener der soll auf auf Tastendruck ENTER,
dann den Button Umrechnen betätigen der folgenden Code hat.
Java:
JButton btnUmrechnen = new JButton("Umrechnen");
        btnUmrechnen.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                umrechnen();
                /* The Method umrechnen is undefined for the
                 * type new ActionListener(){}*/
               
            }
        });
Das Problem: mein Code beispiel im Buch ist anscheinend veraltet.
Fehlerhaftes Beispiel:

für den Button Umrechnen. Als Methode
Java:
private void unrechnen() {
        double celsius, Fahrenheit;
        // DecimalFormat f = new DecimalFormat("#0.00");
        /* DecimalFormat ist zum Umwandeln einer Ausgabe gedacht allerdings 
           anscheinend  nicht mehr aktuell */
        Fahrenheit = Double.parseDouble(tfFahrenheit.getText());
        /*tfFahrenheit cannot be resolved*/
        celsius = (Fahrenheit - 32) * 5 / 9;
        tfCelsius.setText(String.valueOf(celsius));
        /*tfCelsius cannot be resolved*/
        tfFahrenheit.requestFocus();
        /*tfFahrenheit cannot be resolved*/
        tfFahrenheit.selectAll();
        /*tfFahrenheit cannot be resolved*/
    }
}
So und zum Schluss nochmal für das Textfield in dem der Fokus ist,
der auf ENTER wartet.
Java:
JTextPane tfFahrenheit = new JTextPane();
        tfFahrenheit.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if(e.getKeyCode() == KeyEvent.VK_ENTER) {
                    umrechnen();
                    /* The Method umrechnen is undefined for the
                     * type new KeyAdapter(){} */
                }
            }
        });
Die Fehler sind Kommentiert.
Ich Arbeite mit WindowsBuilder und den Swing Komponenten sowie einer,
JFrame.
PS: Entschuldigt nochmal.
 
Die TextFields sind nicht erreichbar weil sie als lokale Variablen im Konstruktor deiner Klasse angelegt wurden. Lege sie als Instanzvariablen ab und schon sind sie erreichbar. Instanzvariablen sind, wie der name schon sagt Variablen, die zu einer Instanz gehören. So wie diese Deklaration "private JPanel contentPane;", die du schon hast.
 
Vielen Dank.
Habe mir grade als ich es gelesen habe, nochmal ins Buch geschaut.
Dummer weiße macht es der Autor tatsächlich richtig. 🙁
mein Fehler, hat geholfen.
Vielen Dank für eure Hilfe.
Ich habe dann keine weiteren Fragen, Danke.
 
Ok Gut ich kann nicht mehr Editieren habe doch noch einen Fehler.
und Zwar wen ich die Funktion des Button Umrechnen als Methode Definiere,
Java:
private void umrechnen() {
        double celsius, Fahrenheit;
        Fahrenheit = Double.parseDouble(tfFahrenheit.getText());
        celsius = (Fahrenheit - 32) * 5 / 9;
        DecimalFormat f = new DecimalFormat("#0.00");
        tfCelsius.setText(f.format(celsius));
        tfFahrenheit.requestFocus();
        tfFahrenheit.selectAll();
    }
}
spuckt die Console folgenden Fehlertext aus.
Java:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at uebung08.celsius.umrechnen(celsius.java:111)
    at uebung08.celsius.access$0(celsius.java:109)
    at uebung08.celsius$2.keyPressed(celsius.java:68)
    at java.awt.Component.processKeyEvent(Unknown Source)
    at javax.swing.JComponent.processKeyEvent(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.KeyboardFocusManager.redispatchEvent(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(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)
 
Das bedeutet, dass in deiner Klasse: celsius.java in Zeile 111 eine Variable noch nicht initialisiert wurde. Diese ist also noch: null. Darum kann sie noch nicht verwendet werden. Das heisst Aufrufe wie: meineVariable.setIrgendwas(); führt zu einer NullPointerException.
Die Frage ist nur was steht in der Zeile 111?
 
Welche zeile in deinem Code ist denn Zeile 111 (das ist die, in der der Fehler auftritt (siehe dein Stacktrace))

EDIT: ok da waren zwei schneller als ich
 
Hier nochmal der Fehler Code
Java:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at uebung08.celsius.umrechnen(celsius.java:125)
    at uebung08.celsius.access$0(celsius.java:124)
    at uebung08.celsius$2.keyPressed(celsius.java:73)
Und hier mal der gesamte Code.
Java:
package uebung08;

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

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

public class celsius extends JFrame {

    private JPanel contentPane;
    private JTextField tfFahrenheit;
    private JTextField tfCelsius;
    double celsius, Fahrenheit;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
        } catch (Throwable e) {
            e.printStackTrace();
        }
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    celsius frame = new celsius();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public celsius() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 375, 190);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        setTitle("Hallo Du Da!");
    
        /*-------------------------lblFahrenheit ------------------------------------------*/
        /*-------------------------------------------------------------------------------------*/
        JLabel lblFahrenheit = new JLabel("Grad Fahrenheit");
        lblFahrenheit.setBounds(10, 11, 121, 14);
        contentPane.add(lblFahrenheit);
    
        /*-------------------------JText Pane tfFahrenheit ------------------------------------------*/
        /*-------------------------------------------------------------------------------------*/
        JTextPane tfFahrenheit = new JTextPane();
        tfFahrenheit.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if(e.getKeyCode() == KeyEvent.VK_ENTER) {
                    umrechnen(); /*<------ bei Enter Kommt der Fehler */
                }
            }
        });
        tfFahrenheit.setBounds(10, 38, 180, 22);
        contentPane.add(tfFahrenheit);
    
        /*-------------------------JLAbel lblGradCelsius ------------------------------------------*/
        /*-------------------------------------------------------------------------------------*/
        JLabel lblGradCelsius = new JLabel("Grad Celsius");
        lblGradCelsius.setBounds(10, 73, 79, 16);
        contentPane.add(lblGradCelsius);
    
        /*-------------------------JTextPane Celsius ------------------------------------------*/
        /*-------------------------------------------------------------------------------------*/
        JTextPane tfCelsius = new JTextPane();
        tfCelsius.setEditable(false);
        tfCelsius.setBounds(10, 102, 180, 22);
        contentPane.add(tfCelsius);
    
        /*-------------------------Button Umrechnen ------------------------------------------*/
        /*-------------------------------------------------------------------------------------*/
        JButton btnUmrechnen = new JButton("Umrechnen");
        btnUmrechnen.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                    double celsius, Fahrenheit;
                    Fahrenheit = Double.parseDouble(tfFahrenheit.getText());
                    celsius = (Fahrenheit - 32) * 5 / 9;
                    DecimalFormat f = new DecimalFormat("#0.00");
                    tfCelsius.setText(f.format(celsius));
                    tfFahrenheit.requestFocus();
                    tfFahrenheit.selectAll();
            }
        });
        btnUmrechnen.setBounds(232, 35, 112, 25);
        contentPane.add(btnUmrechnen);
    
        /*-------------------------Button Exit ------------------------------------------*/
        /*-------------------------------------------------------------------------------------*/
        JButton btnExit = new JButton("Exit");
        btnExit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                System.exit(0);
            }
        } );
        btnExit.setBounds(232, 102, 112, 25);
        contentPane.add(btnExit);
    }
 
    /* ----------------   Methode Umrechnen.   -------------------------------------------*/
    /*------------------------------------------------------------------------------------*/
    private void umrechnen() {
        Fahrenheit = Double.parseDouble(tfFahrenheit.getText());
        celsius = (Fahrenheit - 32) * 5 / 9;
        DecimalFormat f = new DecimalFormat("#0.00");
        tfCelsius.setText(f.format(celsius));
        tfFahrenheit.requestFocus();
        tfFahrenheit.selectAll();
    }
}
Der Fehler fängt bei der Methode an Z. 124-132(Ende)
Java:
    /* ----------------   Methode Umrechnen.   -------------------------------------------*/
    /*------------------------------------------------------------------------------------*/
    private void umrechnen() {
        Fahrenheit = Double.parseDouble(tfFahrenheit.getText());
        celsius = (Fahrenheit - 32) * 5 / 9;
        DecimalFormat f = new DecimalFormat("#0.00");
        tfCelsius.setText(f.format(celsius));
        tfFahrenheit.requestFocus();
        tfFahrenheit.selectAll();
    }
}
Z. 66 - 78
Java:
    /*-------------------------JText Pane tfFahrenheit ------------------------------------------*/
        /*-------------------------------------------------------------------------------------*/
        JTextPane tfFahrenheit = new JTextPane();
        tfFahrenheit.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if(e.getKeyCode() == KeyEvent.VK_ENTER) {
                    umrechnen(); /*<------ bei Enter Kommt der Fehler */
                }
            }
        });
        tfFahrenheit.setBounds(10, 38, 180, 22);
        contentPane.add(tfFahrenheit);
 
Zunächst mal musst du dich entscheiden, ob du ein JTextPane möchtest oder ein JTextField. Dann musst du im Konstruktor bei der Initialisierung den Klassennamen vor dem Variablennamen weglassen. Weil sonst wieder nur eine lokale Variable erzeugt wird und die Instanzvariable "null" bleibt. Also statt: "JTextWasAuchImmer tfFahrenheit = new JTextWasAuchImmer();" lieber: "tfFahrenheit = new JTextWasAuchImmer();"
 
ok GUT 😉
Ich habe erst seit ein paat Tagen Das Thema GUI.
Ich habe den überblick verloren 😀 , Ich habe oben wie beschrieben von X5-599
eine ganz andere Klasse erzeugt.
Anstelle von TextPane ein TextField, Ich habe es dann komplett in TextField geändert.
Java:
private JTextField tfFahrenheit; // <--- Hier war voher JTextPane..
    private JTextField tfCelsius;     // <--- Hier war voher JTextPane..
Und hier war vorher ein
Java:
tfFahrenheit = new JTextField();        // <----- JTextField
        tfFahrenheit.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if(e.getKeyCode() == KeyEvent.VK_ENTER) {
                    umrechnen(); /*<------ bei Enter Kommt der Fehler */
                }
            }
        });

Klar das die Variable die zum umrechnen benötigt wird 0 bleibt.

PS: Vielen Dank an X5-599,
Und an den Rest natürlich auch.
 
Moin,
und was soll uns das jetzt sagen ??

Mal gesetzt den Fall, dass Dein Code unverändert ist und Du weiterhin die oben gepostete NPE gekommt, gilt weiterhin:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at uebung08.celsius.umrechnen(celsius.java:111)
HIER liegt der Fehler 🙄
oder um es mal deuitlicher zu sagen: in der Methode "umrechnen", die sich in der Datei "celsius.java" befindet ........
Was genau steht in dieser ominösen Zeile 111 ??? 🙄🙁

VG Klaus
 
Die böse Zeile 111 ist jetzt da ich alles auskommentiert habe um mir einen überblick zu verschaffen
Zeile 125.
In dieser Zeile ist der Kopf der Methode Umrechnen bzw.
Java:
private void umrechnen() {   // <----- Z. 125
        double celsius, Fahrenheit;
        Fahrenheit = Double.parseDouble(tfFahrenheit.getText()); // <- Kein Text...
        celsius = (Fahrenheit - 32) * 5 / 9;
        DecimalFormat f = new DecimalFormat("#0.00");
        tfCelsius.setText(f.format(celsius)); // .setText führt zu 0 
        tfFahrenheit.requestFocus();
        tfFahrenheit.selectAll();
    }
}
So also allerdings ist mir ein Dummer Fehler passiert.
Ich hatte ganz Oben einmal eine als eine Instanz ein TextField,

Java:
private JTextField tfFahrenheit;
    private JTextField tfCelsius;

allerdings in dem Code Zeile 73, ein JTextPane.
auch in der Methode habe ich mit dem TextField gearbeitet.
Ich habe allerdings dem JTextPane den KeyListener zugeordnet.
Allerdings hatte das TextField nie einen Text da der Text im TextPane war...
 
Zuletzt bearbeitet:
Moin,
also ist das Ganze jetzt erledigt ??? 🙄

Die böse Zeile 111 ist jetzt da ich alles auskommentiert habe um mir einen überblick zu verschaffen Zeile 125.
In dieser Zeile ist der Kopf der Methode Umrechnen bzw.
Java:
private void umrechnen() {   // <----- Z. 125
Das glaube ich so kaum .... in DEM Methodenkopf KANN keine NPE fliegen !!

VG Klaus
 
Ja das ganze hat sich erledigt
Ich denke die NPE liegt hier
Java:
private void umrechnen() {
        double celsius, Fahrenheit;
        Fahrenheit = Double.parseDouble(tfFahrenheit.getText()); // <---- Text war im TextPane und nicht im 
        celsius = (Fahrenheit - 32) * 5 / 9;                                  // TextField wo er hätte sein sollen.
        DecimalFormat f = new DecimalFormat("#0.00");
        tfCelsius.setText(f.format(celsius)); /* <--- NPE da celsius keine Wert hat da der */
        tfFahrenheit.requestFocus();           /*Wert im TextPane war dass ich aus versehen erzeugt habe. */
        tfFahrenheit.selectAll();
    }
Allerdings kommt Exception Handlings erst jetzt in dem nechsten Kapitel dran,
weiß also nicht genau was eine NullPointerException ist.
Vielen Dank für die Hilfe.
 

Zurück
Oben