Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Task-Manager

Alter Hase

  • »Task-Manager« ist der Autor dieses Themas

Beiträge: 1 087

Wohnort: am PC

Beruf: Student

  • Private Nachricht senden

1

18.12.2008, 13:01

Mal wieder Probleme mit der Canvas (remove)

hi,
bei mir kommt immer ne NullPointerexeption wenn ich die Canvas durch einen Enter druck removen will habe kP woran das liegt...

Main:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

public class Main extends JFrame implements ActionListener
{
    public static MainMenu Flaeche;    
    public static int MMchoice; // 0 = start game, 1 = Options, 2 = credits, 3 = end game
    public static JButton ad;
    
    public Main()
    {
        super("Test");
        setSize(500,500);
        setLayout(null);
        
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        MMchoice = 0;
        
        MainMenu Flaeche = new MainMenu();
        Flaeche.setBounds(0,0,500,500);
        Flaeche.setBackground(Color.BLACK);
        
        ad = new JButton("adden");
        ad.addActionListener(this);
        ad.setBounds(500,500,70,30);
        
        add(Flaeche);
        add(ad);
        setVisible(true);
    }        
    
    public void actionPerformed(ActionEvent e)
    {               
        if (e.getSource() == ad)
        {
         remove(Flaeche);  
        }
    }
}


Hier die KeylistenerKlasse...

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

public class MainMenu extends Canvas implements KeyListener
{   
    Font mark = new Font("Comic Sans ms", Font.BOLD,24);  
    Font nmark = new Font("Comic Sans ms", Font.BOLD,14); 
    Font header = new Font("Comic Sans ms", Font.BOLD,30); 
    
    public MainMenu()
    {
        this.addKeyListener(this);
    }

    public void paint(Graphics g)
    {
            if(Main.MMchoice == 0)
            {
                g.setFont(mark); 
                g.setColor(Color.GREEN);
                g.drawString("Start", 220, 200);
                g.setFont(nmark); 
                g.setColor(Color.BLUE);
                g.drawString("Options", 200, 230);
                g.drawString("Credits", 200, 260);
                g.drawString("Beenden", 200, 290);
            }            
    }
    
    public void keyPressed(KeyEvent e)
    {
          
    }
    public void keyReleased(KeyEvent e)
    {               
            if(e.getKeyCode() == KeyEvent.VK_ENTER)
            {
                if(Main.MMchoice == 0)
                {
                    Main.ad.doClick(); // <---------- NullPointerExeption ???
                }  
            }
    }

    public void keyTyped(KeyEvent e)
    {   
    }     
}


Fehler:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at java.awt.Container.remove(Container.java:1196)
    at javax.swing.JFrame.remove(JFrame.java:568)
    at Main.actionPerformed(Main.java:70)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.AbstractButton.doClick(AbstractButton.java:357)
    at javax.swing.AbstractButton.doClick(AbstractButton.java:337)
    at MainMenu.keyReleased(MainMenu.java:159)
    at java.awt.Component.processKeyEvent(Component.java:5999)
    at java.awt.Component.processEvent(Component.java:5815)
    at java.awt.Component.dispatchEventImpl(Component.java:4410)
    at java.awt.Component.dispatchEvent(Component.java:4240)
    at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848)
    at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:697)
    at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:962)
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:834)
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:661)
    at java.awt.Component.dispatchEventImpl(Component.java:4282)
    at java.awt.Component.dispatchEvent(Component.java:4240)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    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)
falls ichs i-wo vergessen hab:

mfg
Task-Manager

Rechtschreibfehler sind mein Eigentum und gewollt!

flux

Treue Seele

  • Private Nachricht senden

2

18.12.2008, 14:24

Guck mal nach, wann das remove() eine NullPointerException wirft. Dann schau dir mal an, ob Flaeche null ist.
Wenn ja, dann schau dir mal an, wo du das Flaeche Objekt erstellst (bzw. du das Objekt erstellen wolltest.)

Du hast nämlich im Main Konstruktor das Objekt nicht dem Attribut zugewiesen, sondern eine neue lokale Variable mit gleichem Namen erstellt.

Task-Manager

Alter Hase

  • »Task-Manager« ist der Autor dieses Themas

Beiträge: 1 087

Wohnort: am PC

Beruf: Student

  • Private Nachricht senden

3

18.12.2008, 18:05

hab ma meinen Info-Lehrer das gezeigt und er meint, das sich durch remove das Objekt sich selber löschen würde daher die NullPointerException...

nur in meinem Programm veranlasst das Objekt ja bei der Main-Klasse die eigene Löschung :?

naja mein Info lehrer hat mir geraten einfach Panels zu nutzten^^ was ich nu auch machen werde...
falls ichs i-wo vergessen hab:

mfg
Task-Manager

Rechtschreibfehler sind mein Eigentum und gewollt!

flux

Treue Seele

  • Private Nachricht senden

4

18.12.2008, 18:52

Naja, wie ich schon gesagt habe, du erstellst hier:

C-/C++-Quelltext

1
MainMenu Flaeche = new MainMenu();
eine lokale Variable und weist NICHT dem Attribut Flaeche das Objekt zu. Deshalb ist das Attribut immernoch NULL.
Dieses Attribut gibst du dann an die remove() Methode. Die wirft die Exception, weil:

Zitat

public void remove(Component comp)
...
Throws:
NullPointerException - if comp is null
http://java.sun.com/javase/6/docs/api/ja….awt.Component)

Dass die Exception kommt, weil das Objekt sich selber löscht ist nicht richtig (wie du schon gesagt hast).
Das Austauschen durch ein JPanel bringt gar nichts. Da kommt das Gleiche bei heraus.

Task-Manager

Alter Hase

  • »Task-Manager« ist der Autor dieses Themas

Beiträge: 1 087

Wohnort: am PC

Beruf: Student

  • Private Nachricht senden

5

18.12.2008, 18:55

jetzt hab ich MainMenu in ein Panel eingefügt, komischerweise bleibt jedoch das ganze Fenster grau o_O

hier der geänderte Code:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public static Panel panel; // Pannel erstellt
    
    public Main()
    {
        super("Test");
        setSize(500,500);
        setLayout(null);
        
        panel = new Panel();                   // Panel init
        panel.setLayout(new GridLayout());     // Panel Layout
        
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        
        sStatus = "MAIN MENU";
        mMchoice = 0;
        gameIsRunning = false;
        
        flaeche = new MainMenu();
        flaeche.setBounds(0,0,500,500);
        flaeche.setBackground(Color.BLACK);
        panel.add(flaeche);                               //Fläche ins Panel einfügen
        
        add(panel);                                       // Panel adden
        setVisible(true);
        panel.setVisible(true);                           // Panel sichtbar machen
    }        
    


EDIT: warst schneller... aber wie kriege ich nu die "flaeche" runter? muss platz für eine neue flache machen-.-
falls ichs i-wo vergessen hab:

mfg
Task-Manager

Rechtschreibfehler sind mein Eigentum und gewollt!

flux

Treue Seele

  • Private Nachricht senden

6

18.12.2008, 19:02

Das mit dem remove geht schon. Musst halt nur gucken, dass du das richtige Objekt übergibst.

Dem Panel musst du auch eine Größe geben, oder einen anderen LayoutManager für den Frame nutzen.

Task-Manager

Alter Hase

  • »Task-Manager« ist der Autor dieses Themas

Beiträge: 1 087

Wohnort: am PC

Beruf: Student

  • Private Nachricht senden

7

18.12.2008, 19:05

hrhr danke^^

habe dem Panel ne größe gegeben wie du sagtest...
Es funktioniert!
Nun setzte ich einfach bei der Enter-Eingabe das Panel auf invisible und gut ist xD
falls ichs i-wo vergessen hab:

mfg
Task-Manager

Rechtschreibfehler sind mein Eigentum und gewollt!

Werbeanzeige