Verknüpfen von Gui mit Klassen

OVetS

Mitglied
Hallo!

Also ich habe ein Problem mit der dem Anmelden der Steuerungsklasse an der Gui. Hier ein kleines Beispiel...

Die Gui:
Java:
public class Gui extends javax.swing.JFrame {

    public Gui() {
        initComponents();
    }

    private void initComponents() {

        label = new javax.swing.JLabel();
        button = new javax.swing.JButton();
        textfield = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        label.setText("1");

        button.setText(">>>>");
        button.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(label)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(button)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(textfield, javax.swing.GroupLayout.PREFERRED_SIZE, 54, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(19, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(label)
                    .addComponent(button)
                    .addComponent(textfield, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
        );

        pack();
    }

    private void buttonActionPerformed(java.awt.event.ActionEvent evt) {
              ctrl.gebe();
    }


    public void anmelden(Ctrl ctrl){
        this.ctrl = ctrl;
    }


    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Gui().setVisible(true);
            }
        });

        Gui gui = new Gui();
        Ctrl ctrl = new Ctrl(gui);
        gui.anmelden(ctrl);
    }

    private javax.swing.JButton button;
    public javax.swing.JLabel label;
    public javax.swing.JTextField textfield;
    private Ctrl ctrl;

}

Die Ctrl
Java:
public class Ctrl {

    private Gui gui;

    public Ctrl(Gui gui){

        this.gui = gui;
    }

    public void gebe(){

        gui.textfield.setText(gui.label.getText());
    }

}

Kann mir jemand sagen was ich falsch mache? weiß nichtmehr weiter 🙁
Danke schonmal im voraus.

mfg
 
ah ok....stimmt^^

das problem ist natürlich, dass es nicht funktioniert!

ich bekomme eine nullpointerexception.
gui ist in der main methode noch gesetzt, aber in anmelden auf einmal null.... und ich weiß nicht warum oder was ich da falsch mache.
 
Wenn du jetzt noch verrätst wo die NPE fliegt steigen deine Chancen auf sinnvolle Antworten 😉

Tipp: Poste mal den Stacktrace der Exception
 
Java:
   public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Gui().setVisible(true);
            }
        });
 
        Gui gui = new Gui();
        Ctrl ctrl = new Ctrl(gui);
        gui.anmelden(ctrl);
    }

wieso erstellst du 2 x ein Objekt von Gui ? Macht keinen Sinn! Und der Fehler liegt daran, dass du nur dem Gui-Objekt das Ctrl-Objekt mit anmelden übergibst, welches nicht sichtbar ist 🙂
 
ok, neuer versuch... 😀 (tut mir leid, bin neu hier)

damit die zeilenangaben auch hinhauene...

Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * Gui.java
 *
 * Created on 28.05.2010, 10:28:23
 */

package Linktest;

/**
 *
 * @author
 */
public class Gui extends javax.swing.JFrame {

    private Ctrl ctrl;

    /** Creates new form Gui */
    public Gui() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        label = new javax.swing.JLabel();
        button = new javax.swing.JButton();
        textfield = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        label.setText("1");

        button.setText(">>>>");
        button.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(label)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(button)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(textfield, javax.swing.GroupLayout.PREFERRED_SIZE, 54, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(19, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(label)
                    .addComponent(button)
                    .addComponent(textfield, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
        );

        pack();
    }// </editor-fold>

    private void buttonActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here

        ctrl.gebe();

    }


    public void anmelden(Ctrl ctrl){
        this.ctrl = ctrl;
    }

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Gui().setVisible(true);
            }
        });

        Gui gui = new Gui();
        Ctrl ctrl = new Ctrl(gui);
        gui.anmelden(ctrl);
    }

    // Variables declaration - do not modify
    private javax.swing.JButton button;
    public javax.swing.JLabel label;
    public javax.swing.JTextField textfield;
    // End of variables declaration

}

Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Linktest;

/**
 *
 * @author
 */
public class Ctrl {

    private Gui gui;

    public Ctrl(Gui gui){

        this.gui = gui;
    }

    public void gebe(){

        gui.textfield.setText(gui.label.getText());
    }

}

Fehler
Java:
run:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at Linktest.Gui.buttonActionPerformed(Gui.java:80)
        at Linktest.Gui.access$000(Gui.java:18)
        at Linktest.Gui$1.actionPerformed(Gui.java:47)
        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.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6263)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:6028)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2478)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
 
ok vielen Dank für die Hilfe 🙂

...der Fehler lag daran, dass das Gui Objekt 2mal erstellt wurde

so ist es richtig:

Java:
    public static void main(String args[]) {

        final Gui gui = new Gui();

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                gui.setVisible(true);
            }
        });
        
        Ctrl ctrl = new Ctrl(gui);
        gui.anmelden(ctrl);
    }
 

Zurück
Oben