[Java] variabele tussen 2 klassen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • QuuN..
  • Registratie: Augustus 2009
  • Laatst online: 28-11-2024
Ik wil graag een variabele uitlezen en veranderen van een andere klasse.

code:
1
app.setContentPane(new Paneel() );


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Paneel extends JPanel
{   

     public void paint(Graphics g) 
     {
                       super.paintComponent(g);
                       g.setColor (Color.red);
        g.fillOval (50,50,70,70);
        g.fillOval (125,50,70,70);
        g.fillOval (200,50,70,70);
        g.fillOval (50,125,70,70);
        g.fillOval (125,125,70,70);
        g.fillOval (200,125,70,70);
        g.fillOval (50,200,70,70);
        g.fillOval (125,200,70,70);
        g.fillOval (200,200,70,70);
                     }
}


Ik wil de kleur veranderen onder invloed van een variabele uit een andere klasse. dus in pricipe zou "red" nu door een variabele vervangen moeten worden, en die variabele wordt gedefineerd in een andere klasse.

Enig idee hoe ik dit moet aanpakken?

De code van mijn andere klasse:
code:
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import java.io.*;
import java.util.*;
import javax.comm.*;
import java.awt.*;
import javax.swing.*;
import java.util.Scanner;
import javax.swing.*;


public class SimpleRead implements Runnable, SerialPortEventListener {
    static CommPortIdentifier portId;
    static Enumeration portList;

    InputStream inputStream;
    SerialPort serialPort;
    Thread readThread;

    public String test;

    public static void main(String[] args) {
        portList = CommPortIdentifier.getPortIdentifiers();
        
        JFrame app=new JFrame();
        app.setBounds(213,133,600,600);
        app.setTitle("Sensor Check");
        app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        app.setContentPane(new Paneel() );
        app.setVisible(true);
        
        while (portList.hasMoreElements()) {
            portId = (CommPortIdentifier) portList.nextElement();
            if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
                 if (portId.getName().equals("COM16")) {
            //                if (portId.getName().equals("/dev/term/a")) {
                    SimpleRead reader = new SimpleRead();
                }
            }
        }
    }
    
        public SimpleRead() {
            test = "blaat";
        try {
            serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);
        } catch (PortInUseException e) {System.out.println(e);}
        try {
            inputStream = serialPort.getInputStream();
        } catch (IOException e) {System.out.println(e);}
    try {
            serialPort.addEventListener(this);
    } catch (TooManyListenersException e) {System.out.println(e);}
        serialPort.notifyOnDataAvailable(true);
        try {
            serialPort.setSerialPortParams(9600,
                SerialPort.DATABITS_8,
                SerialPort.STOPBITS_1,
                SerialPort.PARITY_NONE);
        } catch (UnsupportedCommOperationException e) {System.out.println(e);}
        readThread = new Thread(this);
        readThread.start();
    }

    public void run() {
        try {
            Thread.sleep(20000);
        } catch (InterruptedException e) {System.out.println(e);}
    }
     
     public String getColor()
     {
        return "red";
     }

    public void serialEvent(SerialPortEvent event) {
    
        switch(event.getEventType()) {
        case SerialPortEvent.BI:
        case SerialPortEvent.OE:
        case SerialPortEvent.FE:
        case SerialPortEvent.PE:
        case SerialPortEvent.CD:
        case SerialPortEvent.CTS:
        case SerialPortEvent.DSR:
        case SerialPortEvent.RI:
        case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
            break;
        case SerialPortEvent.DATA_AVAILABLE:
            byte[] readBuffer = new byte[10];

            try {
                while (inputStream.available() > 0) {
                    int numBytes = inputStream.read(readBuffer);
                }
                System.out.print("waarde: " + new String(readBuffer));
            } catch (IOException e) {System.out.println(e);}
            break;
        }
    }
}

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Een get-method schrijven waarin je een member returnt die de kleur bevat? Deze vervolgens aanroepen in de eerste klasse, of in de klasse die die eerste klasse aanroept en hem van daaruit meegeven als parameter?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • QuuN..
  • Registratie: Augustus 2009
  • Laatst online: 28-11-2024
Je bedoelt een methode zoals getColor in mijn SimpleRead klasse?

Dit heb ik geprobeerd. Vervolgens in de paneelklasse SimpleRead.getColor(); gedaan
Dan krijg ik echter de volgende error.
code:
1
<identifier> expected


Maak ik er het volgende van dan krijg ik een andere error.
Code:
code:
1
String test = SimpleRead.getColor();


error:
code:
1
non-static method getColor() cannot be referenced from a static context

[ Voor 32% gewijzigd door QuuN.. op 13-08-2010 09:33 ]


Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Laatst online: 13-10 17:04
offtopic:
Ik heb weinig verstand van java, maar ben eigenlijk heel benieuwd waarom hetzelfde 2x geïmport wordt.

import javax.swing.*;
import java.util.Scanner;
import javax.swing.*;

[ Voor 5% gewijzigd door RedHat op 13-08-2010 09:34 ]


Acties:
  • 0 Henk 'm!

  • QuuN..
  • Registratie: Augustus 2009
  • Laatst online: 28-11-2024
geen speciale reden RedHat... is gewoon perongelijk gegaan

Acties:
  • 0 Henk 'm!

  • hellfighter87
  • Registratie: Mei 2008
  • Laatst online: 14-10 18:58
g.setColor (SimpleRead.getColor()); <- zoiets bedoel je?

Dan moet getColor natuurlijk wel een color returnen en niet een string?

verder als je een class met een hoofdletter aanroept, dan roep je zijn statische functies aan.
Je zult dus ergens een variable moeten hebben die refereerd naar een instantie van simpleread

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
QuuN.. schreef op vrijdag 13 augustus 2010 @ 09:31:
error:
code:
1
non-static method getColor() cannot be referenced from a static context
Deze error geeft precies aan wat je probleem is. Je probeert een non-static methode als een static aan te roepen. Je zult dus een referentie naar het object moeten hebben.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • FlowinG
  • Registratie: Maart 2003
  • Laatst online: 23:01
Je haalt wat door elkaar wat met object oriëntatie te maken heeft. Het gaat erom dat de instantie van de class Paneel bekend is met de instantie van de class SimpleRead. Op dit moment maakt de SimpleRead class een instantie aan van de class Paneel. Deze instantie heeft op dat moment geen weet van de instantie van SimpleRead.
Je probeert dat op te lossen door een statische methode van de SimpleRead aan te roepen: SimpleRead.GetColor(). Deze methode is echter helemaal niet gedefinieerd als statische methode. Je zult dus of deze methode statisch moeten maken, of (wat in dit geval beter zou zijn) de instantie Paneel bekend moeten maken met de class SimpleRead. Dit zou ik nu oplossen door een SimpleRead class mee te geven in de constructor van Paneel en de referentie intern op te slaan.

Bijvoorbeeld (min of meer pseudo):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//private variabele
private SimpleRead owner;

//constructor:
public Paneel (SimpleRead owner) {
//hier nog even de constructor aanroepen van JPanel
 this.owner = owner;
}

 public void paint(Graphics g) 
{
//andere code
g.SetColor(this.owner.getColor());

}


Let op: het is niet het meest nette wat ik hier doe, maar het gaat om het voorbeeld ;)

[ Voor 11% gewijzigd door FlowinG op 13-08-2010 09:44 . Reden: Code wat uitgebreid ]


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

QuuN.. schreef op vrijdag 13 augustus 2010 @ 09:31:
Maak ik er het volgende van dan krijg ik een andere error.
Code:
code:
1
String test = SimpleRead.getColor();


error:
code:
1
non-static method getColor() cannot be referenced from a static context
Mooi hè, die meldingen. Dan weet je precies wat je verkeerd doet. Afhankelijk van je klassenmodel zou je de klasse static moeten maken, of singleton, of gewoon een objectreferentie meegeven aan bijvoorbeeld de constructor van de aanroepende klasse.

* CodeCaster mept de twee heren hierboven.

[ Voor 4% gewijzigd door CodeCaster op 13-08-2010 09:43 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • QuuN..
  • Registratie: Augustus 2009
  • Laatst online: 28-11-2024
Ik heb het nu als volgt gedaan:
code:
1
2
3
4
     public static Color getColor()
     {
        return Color.green;
     }


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Paneel extends JPanel
{   
    
    
     public void paint(Graphics g) 
     {
        super.paintComponent(g);
        g.setColor (SimpleRead.getColor());
        g.fillOval (50,50,70,70);
        g.setColor (Color.red);
        g.fillOval (125,50,70,70);
        g.setColor (Color.green);
        g.fillOval (200,50,70,70);
        g.setColor (Color.red);
        g.fillOval (50,125,70,70);
        g.fillOval (125,125,70,70);
        g.fillOval (200,125,70,70);
        g.fillOval (50,200,70,70);
        g.fillOval (125,200,70,70);
        g.fillOval (200,200,70,70);

     }

}


Het werkt in ieder geval.. maar of dit de netste manier is? Ik sta altijd open voor verbeteringen, ook al werkt het nu al prima.

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Hoe ga je nu een andere kleur teruggeven wanneer iets anders is gelezen door je SimpleRead-klasse? :)

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • QuuN..
  • Registratie: Augustus 2009
  • Laatst online: 28-11-2024
Inputwaarde koppelen aan een variabele.
Variabele uitlezen en in de functie getColor koppelen aan een kleur en de juiste returnwaarde meegeven.
Tellertje laten lopen, zodat elke oval naar zijn eigen binnenkomende bit kijkt, en dus ook zijn bijbehorende kleur krijgt.

Of is het koffietijd voor mij en zie ik iets over het hoofd?

Misschien wederom niet de makkelijkste optie maar dit is zoals ik het nu zie.

Acties:
  • 0 Henk 'm!

  • FlowinG
  • Registratie: Maart 2003
  • Laatst online: 23:01
Zoals je het nu doet: een variabele uitlezen in een instantie van SimpleRead. Hoe kan een statische methode dan bij de waarde van een instantie? Je zou dit wel weer kunnen oplossen door in de instantie de waarde weg te schrijven naar een statische variabele. (Via static SetColor() bv).

Ik kan je aanraden om je eens te gaan verdiepen in de principies van het OO programmeren ;-)

Acties:
  • 0 Henk 'm!

  • QuuN..
  • Registratie: Augustus 2009
  • Laatst online: 28-11-2024
Wat raad jij in dit geval aan Flowing, want ik zit inderdaad moeilijk te doen met static variabelen/methoden.

Acties:
  • 0 Henk 'm!

  • FlowinG
  • Registratie: Maart 2003
  • Laatst online: 23:01
Nou je loopt tegen een wat ingewikkeld probleem probleem aan: zoals ik erna kijk is dat je een asynchroon programma hebt:
Globaal lopen er 2 threads: SimpleRead is een aparte thread wat data ontvangt uit je seriale poort.
Paneel valt binnen de UI thread en de paint functie wordt weer onafhankelijk aangeroepen van het SimpleRead. (ik weet niet meer precies hoe Java omgaat met de UI paint).
Wat er dus gebeuren moet: de huidige instantie van Paneel (er kunnen in theorie meerdere instanties zijn) moet bekendgemaakt zijn met SimpleRead (waar in principe ook meerdere instanties van kunnen zijn). Die moet je in de main flow aan elkaar kopelen.
Met zoals het er nu uitziet, zou ik een methode schrijven in Paneel die een SimpleRead instantie ontvangt. Bij een aanroep van paint () zou ik die instantie bevragen om de kleur.

Dus:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Paneel extends JPanel
{
    private SimpleRead reader;
    
    public void SetReader (SimpleRead readerInstance) {
        reader = readerInstance;
    }


    public void paint(Graphics g) 
    {
        g.setColor (reader.GetColor());

    }
}


in de mainthread:

code:
1
2
3
4
5
6
        Paneel paneel = new Paneel();
        app.setContentPanel(paneel );

//verderop in de while-lus:
        SimpleRead reader = new SimpleRead();
        paneel.SetReader(reader);


De SimpleRead zal nu de laatste waarde steeds teruggeven. In zekere zin los hiermee ook het probleem op dat beide threads niet van elkaar weten waar ze nu zijn. Het probleem is wel dat als je alle wijzigingen uit je socket op het scherm wilt tekenen maar de frequentie van de Paint()-aanroepen ligt lager, dan zal niet alles op het scherm getoond worden.

Dit is even snel uitgeschreven wat ik precies bedoel. Je zult zelf even alles op z'n plek zetten. Hopelijk kan je hiermee verder?

[ Voor 11% gewijzigd door FlowinG op 13-08-2010 11:57 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

This is niet beschikbaar in static methods. Succes met daar een variabele uitlezen. :P

Dus nogmaals: je wil die method aanroepen op een object, niet op de klasse. Da's overigens vrij basale OO-kennis. Misschien doe je er goed aan even een boek erbij te pakken voor je verder programmeert? :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • QuuN..
  • Registratie: Augustus 2009
  • Laatst online: 28-11-2024
Het lukt allemaal wel tot nu toe ... alleen waarschijnlijk wat omslachtig. Wil nu een klein projectje werkend krijgen, wat nu bijna gelukt is. Loop nog tegen een laatste probleem aan.

De volgende regel print een ingelezen waarde. Deze waarde van readBuffer stop ik daarna in een globale statische variabele. Als ik deze globale variabele dan uitlees, dan is deze null. Terwijl dezelfde variabele in de methode serialEvent wel gewoon de goede waarde heeft.

Komt dit omdat de variabele static is?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Java heeft helemaal geen globale scope voor variabelen. Je variabele staat dus in een klasse, en als 'ie daar static in staat hangt het maar net van je precieze implementatie af of je daar wel of niet iets mee kan.

Nogmaals, pak even een boek erbij en zoek het verschil op tussen een klasse en een object. Dat lijkt er bij jou niet bepaald in te zitten. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Tubby
  • Registratie: Juni 2001
  • Laatst online: 13-10 22:16

Tubby

or not to be

QuuN.. schreef op vrijdag 13 augustus 2010 @ 14:09:
Het lukt allemaal wel tot nu toe ... alleen waarschijnlijk wat omslachtig. Wil nu een klein projectje werkend krijgen, wat nu bijna gelukt is. Loop nog tegen een laatste probleem aan.

De volgende regel print een ingelezen waarde. Deze waarde van readBuffer stop ik daarna in een globale statische variabele. Als ik deze globale variabele dan uitlees, dan is deze null. Terwijl dezelfde variabele in de methode serialEvent wel gewoon de goede waarde heeft.

Komt dit omdat de variabele static is?
Weet je wat het probleem is. Als jij "dit kleine projectje" werkend hebt vind je opdrachtgever het "goed" en wordt het in deze staat in productie genomen.

Een paar jaar later moet iemand een "klein" probleempje oplossen en loopt tegen dit soort troep aan. Daar wordt je echt niet blij van hoor.

tubby.nl - Artes Moriendi - q1 - bf1942 - WoT - pubg - LinkedIN


Acties:
  • 0 Henk 'm!

  • Ozzie
  • Registratie: Februari 2004
  • Laatst online: 06:50
Ik neem aan dat dit gewoon een hobby-projectje is van de TS.

En als het wel voor een bedrijf is dan willen ze blijkbaar goedkoop klaar zijn, als er dan over een paar jaar iets aan gewijzigd moet worden gaat diegene waarschijnlijk de hele boel herschrijven en zijn ze alsnog duur uit.. Maar zoals ik al zei, ik neem aan dat het een hobby-project is.

"Write code as if the next maintainer is a vicious psychopath who knows where you live."

Pagina: 1