Java JTextField aanroepen in andere klasse

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

Anoniem: 1047265

Topicstarter
Goedemorgen Tweakers,

Ik heb deze site al vaak bezocht voor oplossingen, maar voor mijn probleem kan ik geen goede oplossing vinden.
Heb speciaal voor dit probleem maar eens een account gemaakt.
Hoop ook dat ik dit topic goed geplaatst heb.

Mijn vraag:

Ik heb 2 klasse. Testknoppen en Venster.

In de klasse Venster heb ik een JTextField in een Jpanel gestopt.
Nu wil ik vanuit de klasse Testknoppen tekst plaatsen met een JButton met ActionListener, in de JTextField van het klasse Venster.

Hier de klasse Venster:


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.border.*;

public class Venster {

JPanel display;
JTextField vak;

public Venster() {

display = new JPanel ();
vak = new JTextField ( "0",18 );
display.add ( vak );
}
}




Hier de klasse Testknoppen:


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.border.*;


public class Testenknop extends JFrame {
public static void main( String args[] ) {
JFrame frame = new Testenknop ();
frame.setSize( 290, 400 );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setTitle( "Rekenmachine" );
frame.setContentPane( new Paneel () );
frame.setVisible( true );
}
}

class Paneel extends JPanel {

Venster venster;
JButton knop;
JTextField info;

public Paneel () {

Venster venster = new Venster ();
knop = new JButton ( "zet tekst" );
knop.addActionListener( new KnopHandler () );

add ( venster.display );
add ( knop );
}

class KnopHandler implements ActionListener {
public void actionPerformed( ActionEvent e ) {
venster.vak.setText( " Hier staat tekst" );
}
}
}


De actie venster.vak.setText werkt dus niet en is fout, maar kom er niet uit wat ik moet veranderen.


Wat ik al gevonden of geprobeerd heb:
Ik denk dat het probleem is dat ik ergens een "setter" moet maken voor het JTextField, maar kom er niet goed uit.

Alvast bedankt voor de eventuele hulp.

Beste antwoord (via Anoniem: 1047265 op 05-03-2018 18:01)


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 15:29

Janoz

Moderator Devschuur®

!litemod

Regel 27 van Testknoppen.java klopt niet.

Java:
1
Venster venster = new Venster ();

Met deze regel maak je een lokale variabele aan die alleen binnen de constructor geldt (regel 25 tm 33). Deze venster-variable is niet dezelfde als de venster-variabele van regel 21. Aangezien je deze dus nooit geinitialiseerd hebt zul je op regel 37 zeer waarschijnlijk een nullpointer exception krijgen.
Probleem is simpel op te lossen. Maak van regel 27
Java:
1
venster = new Venster();

Door Venster weg te laten gebruik je daadwerkelijk de class variabele.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Alle reacties


Acties:
  • +1 Henk 'm!

  • JJ93
  • Registratie: Maart 2013
  • Laatst online: 16:15

JJ93

Error 418

Met code tags behoud je de tabs en syntax highlighting:

Venster.java
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.border.*;

public class Venster {
    
    JPanel display;
    JTextField vak;

    public Venster() {
        
        display = new JPanel ();
        vak = new JTextField ( "0",18 );
        display.add ( vak );
    }       
}



Testknoppen.java
Java:
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
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.border.*;


public class Testenknop extends JFrame {
  public static void main( String args[] ) {
    JFrame frame = new Testenknop ();
    frame.setSize( 290, 400 );
    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    frame.setTitle( "Rekenmachine" );
    frame.setContentPane( new Paneel () );
    frame.setVisible( true );
  }
}

class Paneel extends JPanel {
    
    Venster venster;
    JButton knop;
    JTextField info;
    
     public Paneel () {
        
        Venster venster = new Venster ();
        knop = new JButton ( "zet tekst" );
        knop.addActionListener( new KnopHandler () );
        
        add ( venster.display );
        add ( knop );   
     }
     
     class KnopHandler implements ActionListener {
    public void actionPerformed( ActionEvent e ) {
        venster.vak.setText( " Hier staat tekst" );
        }
    }
}


Belangrijk is dat je de hiërarchie snapt:
JFrame --> JPanel --> JComponent
Iets toevoegen wil je meestal doen vanuit de hoogste hiërarchie dus vanuit de JFrame, want alles hangt daar onder.

Eerst maak je een paneel aan, dit paneel voegt alle knoppen toe en action listeners. Daarna maak je een frame aan waar je het paneel aan toevoegt.

Acties:
  • Beste antwoord
  • +2 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 15:29

Janoz

Moderator Devschuur®

!litemod

Regel 27 van Testknoppen.java klopt niet.

Java:
1
Venster venster = new Venster ();

Met deze regel maak je een lokale variabele aan die alleen binnen de constructor geldt (regel 25 tm 33). Deze venster-variable is niet dezelfde als de venster-variabele van regel 21. Aangezien je deze dus nooit geinitialiseerd hebt zul je op regel 37 zeer waarschijnlijk een nullpointer exception krijgen.
Probleem is simpel op te lossen. Maak van regel 27
Java:
1
venster = new Venster();

Door Venster weg te laten gebruik je daadwerkelijk de class variabele.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • +1 Henk 'm!

  • steveman
  • Registratie: Mei 2001
  • Laatst online: 16:07

steveman

Comfortabel ten onder

Je kunt (alle?) de meeste IDEs instellen zodat je gewaarschuwd wordt wanneer je een variabele shadowt

Al kan er tegenaan lopen ook wel een goed leermoment zijn.

"Take the risk of thinking for yourself. Much more happiness, truth, beauty, and wisdom will come to you that way." -Christopher Hitchens | In memoriam? 🏁 ipv kruis!


Acties:
  • 0 Henk 'm!

Anoniem: 1047265

Topicstarter
Bedankt allemaal voor de reacties!

@Janoz De oplossing werkt perfect. Bedankt ook voor de uitleg!

@steveman Het is inderdaad goed dat ik hier tegen aanloop. gaat me hopelijk niet meer gebeuren.

@JJ93 Bedankt voor de extra info. Zal voortaan de code tags gebruiken. ;)