Java Container

2012-10-30 17:32
Usuwanie
1

Witam

Posiadam prosty program. Na panelu A klikam przycisk. Usuwane są wszystkie komponenty, panele itp. Dodawany jest panel B. Na panelu B, po wciśnięciu przycisku chcę wrócić do panelu A i mam problem:

Kod przycisku w panelu B i pola:


    Panel1 panel1;
    PanelMain pm;
    Panel1 p1;

    b2.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    pm.con.removeAll();
                    pm.con.add(p1);
                    pm.con.validate();
                    p1.step();
                    repaint();
                }
            });

Kod klasy zawierającej Panel1 oraz Container:

public class PanelMain {

    public static Container con;
    public FrameM frameM;
    public Panel1 panel1;

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
              public void run() {
                FrameM frameM = new FrameM();
                System.out.println("Starting....");
              }
        });
    }

    public void step() {
        // TODO Auto-generated method stub

    }
}
class FrameM extends JFrame{
    FrameM(){
        createGUI();
            }
         Container con = getContentPane();
         Panel1 panel1 = new Panel1();
    private void createGUI() {
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        this.setBounds((dim.width)/4, (dim.height)/6, 600, 800);
        this.setTitle("");
        this.setResizable(false);
        this.setVisible(true);
    panel1.setLayout(null);
//
    b4.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            Notepad np = new Notepad();
            con.remove(panel1);
            con.add(np);
            con.validate();
            np.step();
            repaint();
        }
    });
//
//kod  
        con.add(panel1);
        panel1.add(b1);
        panel1.add(b2);
        panel1.add(b4);
        panel1.add(b3);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
    //
    class Panel1 extends JPanel {
        public void step() {
            }
    public void paintComponent(Graphics g)
    {
//
    g.drawImage(bg, 0, 0, null);
        //
    }
    }
        //static fields
   private JButton b1 = new JButton("");
}

Błąd, który otrzymuje po kliknięciu na przycisk w Panelu B:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at ORG.Notepad$1.actionPerformed(Notepad.java:87)
    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$000(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$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.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$1.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)
Nie miałem czasu sprawdzić kodu, ale nie mieszaj obiektów klas AWT z Swingiem. Klasy Swinga zawsze zaczynają się od literki 'J'. W przypadku Swinga powinieneś raczej użyć obiektu klasy JComponent, który jest jego pierwszym Swingowym odpowiednikiem i bazą dla wszystkich innych. - Olamagato 2012-10-30 20:47

Pozostało 580 znaków

2012-10-31 14:57
Usuwanie
0

Hmm. Wszystkie komponenty są w Swing'u

Pozostało 580 znaków

2012-10-31 15:14
Usuwanie
0

Zmieniłem listenera na :

            b2.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    FrameM fm = new FrameM();
                    fm.con.removeAll();
                    fm.con.add(p1);
                    fm.con.validate();
                    repaint();
                }
            });

Jednak po kliknięciu error dalej jest i pojawia się nowe okno (takie samo jak poprzednie), które jest puste. (stare okno zostaje.)

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0