[JAVA] Geen Value van Slider

Pagina: 1
Acties:

Onderwerpen


  • battler
  • Registratie: November 2004
  • Laatst online: 30-06 15:11
Ik ben bezig met een hele simpele applicatie. Op dit moment krijg ik geen value uit een slider. Maar ik heb geen idee waarom.

Klasses: Main, GUI, Cards, DrawSpeed

Main: Doet niets bijzonders behalve GUI aanroepen en DrawSpeed runnen.
GUI: Verzorgt de GUI en hier wordt de Slider ook aangemaakt.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Gui implements ActionListener {

    JSlider speed = new JSlider(0, 10);

protected JPanel ButtonArea() {
        speed.setValue(0);
        speed.setBorder(BorderFactory.createTitledBorder("Delay"));
        speed.setMajorTickSpacing(1);
        speed.setPreferredSize(new Dimension(195, 75));
        speed.setSnapToTicks(true);
        speed.setValue(0);
        speed.setPaintTicks(true);
        speed.setPaintLabels(true);
       
       //Overige code

        return ButtonArea;
    }


DrawSpeed:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
public class DrawSpeed extends Gui implements Runnable {

    int DeckValue2;

    public void run() {
             while (true) {
             System.out.println(speed.getValue());
           while (speed.getValue() > 1) {
        
          //overige code

        }
    }


Probleem: De Gui en alles draait gewoon normaal. Alleen de waarde van de Slider verandert niet. Dus in run() is speed.getValue(); altijd statisch. Ook al beweegt de slider. Als ik speed.getValue(); aanroep in de Gui dan werkt hij wel weer goed. De waarop ik de Slider zet d.m.v code komt ook overeen met hetgeen wat hij uitleest.

Disclaimer: Programmeren is verre van mijn beste kant dus als je iets ziet dat niet in orde is laat het even weten.

Lux.Architectuur | Van Dromen tot Wonen | www.Lux-a.nl


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22:14

Janoz

Moderator Devschuur®

!litemod

Waar haal je 'speed' vandaan? Het is een variabele binnen je GUI object. Ik zie echter nergens de code waarmee je zorgt dat speed in DrawSpeed daadwerkelijk naar hetzelfde object verwijst.

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


  • battler
  • Registratie: November 2004
  • Laatst online: 30-06 15:11
hmm als ik het goed begrijp bedoel je dit:
code:
1
2
3
4
public class Gui implements ActionListener {

 //JSlider speed = new JSlider(0, 10);
    protected JSlider speed;

en
code:
1
2
3
4
5
6
protected JPanel ButtonArea() {
        speed  = new JSlider(0, 10);
        speed.setValue(0);
        speed.setBorder(BorderFactory.createTitledBorder("Delay"));
        speed.setMajorTickSpacing(1);
        etc..


Alleen krijg ik nu wel direct een nullpointer exception.

code:
1
2
3
4
5
6
7
public class DrawSpeed extends Gui implements Runnable {
    public void run() {
             while (true) {
             System.out.println(speed.getValue());

        }
    }


code:
1
2
3
Exception in thread "Thread-3" java.lang.NullPointerException
        at cardcounting2.DrawSpeed.run(DrawSpeed.java:20)
        at java.lang.Thread.run(Thread.java:619)

[ Voor 30% gewijzigd door battler op 22-09-2010 21:59 ]

Lux.Architectuur | Van Dromen tot Wonen | www.Lux-a.nl


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:12

Creepy

Tactical Espionage Splatterer

Nu is nog steeds niet duidelijk waar DrawSpeed de variabele speed vandaan haalt. Gui heeft een speed variabele, en zo te zien heeft DrawSpeed er ook 1, een andere. Maar je laat niet zien bij DrawSpeed waar die variabele is gedeclareerd.

[ Voor 18% gewijzigd door Creepy op 22-09-2010 22:02 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22:14

Janoz

Moderator Devschuur®

!litemod

Dat kan heel goed kloppen. Toverwoord is 'scope'. Speed is alleen bekend binnen de gui. Wanneer je daadwerkelijk dezelfde JSlider uit wilt lezen in Drawspeed dan zul je die daar moeten krijgen. Dat doe je niet door daar ook een variabele met toevallig dezelfde naam neer te zetten.

Wat jij waarschijnlijk het beste kunt doen is de GUI zo maken dat je aan de GUI kunt vragen wat de speed zou moeten zijn. Dat doe je door aan de GUI een methode toe te voegen die de value van de slider terug geeft. Vervolgens zorg je dat je Drawspeed een referentie naar de GUI krijgt zodat Drawspeed aan de GUI kan vragen wat de stand van de slider is.

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


  • battler
  • Registratie: November 2004
  • Laatst online: 30-06 15:11
Aha ik dacht doordat DrawSpeed extends GUI dat ik ook automatisch over de variabelen die bestaan in de klasse GUI zou beschikken. Maar dit is dus niet zo.

Lux.Architectuur | Van Dromen tot Wonen | www.Lux-a.nl


Verwijderd

Toch over de protected en public variabelen. Maar dat betekent niet dat je geen NPE kan krijgen ;-) . En dan laat ik nog in het midden of het een goed idee is om je fields public/protected te maken.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22:14

Janoz

Moderator Devschuur®

!litemod

battler schreef op woensdag 22 september 2010 @ 22:11:
Aha ik dacht doordat DrawSpeed extends GUI dat ik ook automatisch over de variabelen die bestaan in de klasse GUI zou beschikken. Maar dit is dus niet zo.
Dat is wel zo, maar de fout die je maakt is juist het verschil tussen classes en objecten (instanties van classes).

Op het moment dat je new GUI doet maak je een instantie aan van de class GUI. Deze heeft een eigen verzameling variabelen zoals speed. Verderop doe je new DrawSpeed. Deze heeft ook een verzameling variabelen waaronder ook een speed, maar dit is zijn eigen setje variabelen.

Tot slot is overerving niet bedoeld voor het uitwisselen van variabelen. Het gebruik van extend is voor heel specifieke gevallen. Zolang je nog maar net bezig bent met programmeren kun je je daar maar beter even ver van houden aangezien de kans groot is dat je het verkeerd gebruikt.

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


  • battler
  • Registratie: November 2004
  • Laatst online: 30-06 15:11
Als ik het goed begrijp heb ik mijn overerving een beetje misbruikt. Ik zal mijn code even aanpassen en dat hele extends eruit gooien en gewoon overal aparte getters en setters voor maken.

Gedaan maar blijkbaar snap ik het niet (goed).

In de GUI gemaakt:

code:
1
2
3
4
    public int SpeedValue()
    {
        return speed.getValue();
    }


In de DrawSpeed:
code:
1
2
3
4
5
6
7
public class DrawSpeed implements Runnable {

    Gui gui = new Gui();

    public void run() {
      
        System.out.println(gui.SpeedValue());


En nog steeds krijg ik een NullPointerException. Terwijl hij toch echt netjes wordt aangemaakt/weer gegeven.

[ Voor 55% gewijzigd door battler op 22-09-2010 22:31 ]

Lux.Architectuur | Van Dromen tot Wonen | www.Lux-a.nl


  • hgp
  • Registratie: Juni 2008
  • Laatst online: 12-10 16:50

hgp

[quote]battler schreef op woensdag 22 september 2010 @ 22:11:
Aha ik dacht doordat DrawSpeed extends GUI dat ik ook automatisch over de variabelen die bestaan in de klasse GUI zou beschikken. Maar dit is dus niet zo.
[/quote]

Als je ergens new DrawSpeed() aanroept kan je wel bij de public/protected variablen van de Gui class komen door er 'super' voor te zetten:
[code]
System.out.println(super.speed.getValue());
[/code]

Ik moet volgende keer maar eens alles lezen dit heeft niks met jouw probleem te maken, sorry :z

[ Voor 11% gewijzigd door hgp op 22-09-2010 22:37 ]


Verwijderd

Tuurlijk krijg je nog een NPE. Je maakt in DrawSpeed een nieuw Gui object aan, ipv je bestaand Gui object door te geven aan de DrawSpeed klasse.
Dit lijkt hier meer en meer een gevalletje tutorial lezen te worden. En een NPE is nu echt niet iets dat zo moeilijk op te lossen valt

[ Voor 0% gewijzigd door Verwijderd op 22-09-2010 22:41 . Reden: typo ]


  • terje7601
  • Registratie: September 2009
  • Laatst online: 08-02-2024
Wordt de 'speed' variabele wel geïnitialiseerd in de constructor van Gui? Waar & wanneer wordt je 'ButtonArea' methode opgeroepen?

Offtopic: probeer ook de naming conventions van de taal waarin je programmeert over te nemen. In Java beginnen namen van methodes & variabelen met een kleine letter, getters beginnen met 'get' & setters met 'set'.

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Heeft het oorspronkelijke probleem niet gewoon te maken met Thread visibility:
Wijziging aan de waarde van de JSlider vinden plaats in de eventthread, terwijl die run() methode in een aparte Thread wordt uitgevoerd. Volgens mij mag door de regels in het Java Memory Model de JVM de waarde van speed.getValue() dan als statisch beschouwen in die run() methode.


Never mind.... DrawSpeed heeft natuurlijk niet dezelfde JSlider als de GUI, dus wijzigt de waarde nooit.

[ Voor 13% gewijzigd door Remus op 23-09-2010 10:19 ]


  • battler
  • Registratie: November 2004
  • Laatst online: 30-06 15:11
Opgelost (dankzij de Hint van PissedCapsLock).

In de Main heb ik de klasses aangemaakt en meegegeven:
code:
1
2
3
4
5
6
7
8
9
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Cards cards = new Cards();
        Gui gui = new Gui();
        gui.MakeGui(cards);
        DrawSpeed begin = new DrawSpeed(gui, cards);
        new Thread(begin).start();
    }


En in DrawSpeed er weer uit gehaald
code:
1
2
3
4
5
6
7
8
9
10
public class DrawSpeed implements Runnable {

    Gui Gui;
    Cards Cards;
    int DeckValue2;

    DrawSpeed(Gui gui, Cards cards) {
        Gui = gui;
        Cards = cards;
    }


Is dit een juiste oplossing?

Lux.Architectuur | Van Dromen tot Wonen | www.Lux-a.nl


Verwijderd

Wat mij opvalt is "Gui implements ActionListener" en als ik dan verder kijk zie ik nergens de methode "actionPerformed" en ik mis ook speed.addActionListener. Kan het zijn dat je dat wel hebt staan maar niet hebt gepost? Verder staat hierboven ook heel nuttig commentaar.

  • battler
  • Registratie: November 2004
  • Laatst online: 30-06 15:11
Die methodes bestaan wel alleen heb ik die niet gepost. Verder heb ik alle variabelen en methode namen met een kleine letter laten beginnen en alle klasses met een hoofdletter.

Lux.Architectuur | Van Dromen tot Wonen | www.Lux-a.nl

Pagina: 1