jppilot
Artikelen: 0
Berichten: 46
Lid geworden op: do 17 sep 2009, 22:35

[java] Public static string variabele terugroepen

Goedenavond,

Voor mijn studie ben ik een cursus java aan het volgen. Een onderdeel van een programma is het inlezen van een lijst met woorden. Hier moet ik vervolgens enkele bewerkingen mee uitvoeren. Als ik de woordenlijst in het programma 'inbak'; dat wil zeggen dat ik een string definieer met 10 woorden en hiermee bewerkingen uitvoer, zoals random een woord uit de string kiezen, dan gaat dat allemaal prima. Het gaat mis zodra ik de externe woordenlijst invoer en deze wil gebruiken. ik gebruik NetBeans IDE 8.0.

Dit is de functie van het inlezen van de woorden:

Code: Selecteer alles

public static String readFileToString() throws IOException {
        File dirs = new File("woordenlijst.txt");
        String filePath = dirs.getCanonicalPath() + File.separator+"src"+File.separator+"TestRead.java";
 
        StringBuilder fileData = new StringBuilder(1000);//Constructs a string buffer with no characters in it and the specified initial capacity
        BufferedReader reader = new BufferedReader(new FileReader(filePath));
 
        char[] buf = new char[1024];
        int numRead = 0;
        while ((numRead = reader.read(buf)) != -1) {
            String readData = String.valueOf(buf, 0, numRead);
            fileData.append(readData);
            buf = new char[1024];
        }
 
        reader.close();
 
        String wBestand = fileData.toString();
        System.out.println(wBestand);
             return wBestand;
    }
de return variabele wBestand wil ik vervolgens aanroepen onder de startknop van mijn GUI, oftewel:

Code: Selecteer alles

private void cmdStartActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        cmdStart.setText("restart");
        buttonEnableFunction();
        
      
        //System.out.println(buffer);
        int RG = (int) (Math.random() * 10);            // random getal voor index woord
        wGalg = wBestand[RG];                           // het te raden woord ophalen
het programma loopt vast bij de code wBestand[RG]; logisch aangezien ik nog nergens gevraagd heb om wBestand te resturnen. Hoe krijg ik het voor elkaar dat ik de nieuwe string wBestand in de bovenste functie kan gebruiken in de cmdStart functie? Alvast dank, fijne avond!
Gebruikersavatar
physicalattraction
Moderator
Artikelen: 0
Berichten: 4.163
Lid geworden op: do 30 mar 2006, 15:37

Re: [java] Public static string variabele terugroepen

Ik zie niet de gehele class voor me, maar waarschijnlijk moet je het bestand eerst inlezen en deze opslaan in een class variable.

Code: Selecteer alles

class gui()
{
    public gui()
    {
        // Constructor
        this.wBestand = readFileToString()
    }
 
    private void cmdStartActionPerformed()
    {
        // Fill in your code here
        wGalg = this.wBestand[RG]
    }
}
p.s. Ik ben niet 100% bekend met de Java syntax, meer Python en C#, maar ik hoop dat de bedoeling zo duidelijk is.
p.s.2 Ik raad je aan om te allen tijde je code in het Engels te schrijven, dus Engelstalige variabelen en Engelstalig commentaar.
jppilot
Artikelen: 0
Berichten: 46
Lid geworden op: do 17 sep 2009, 22:35

Re: [java] Public static string variabele terugroepen

Dank voor uw reactie.
Het programma herkent het commando: 'this.wBestand = readFileToString()'  niet  zodra ik deze voor de return statement plaats... Geen idee hoe ik dit kan oplossen : /
Gebruikersavatar
Flisk
Artikelen: 0
Berichten: 1.264
Lid geworden op: vr 02 mar 2012, 14:21

Re: [java] Public static string variabele terugroepen

Wil je wBestand enkel gebruiken in de methode cmdStartActionPerformed en niet erbuiten is het makkelijkste zo:

Code: Selecteer alles

private void cmdStartActionPerformed()
    {
        // Fill in your code here
     String wBestand=KlasseNaam.readFileToString();
     wGalg = wBestand[RG];
    }
Statische methodes kan je oproepen door de naam van de klasse waar de methode zich in bevindt ervoor te plaatsen, gescheiden met een punt.

Merk op dat op deze manier, wBestand geïnitialiseerd wordt in de methode cmdStartActionPerformed en weer zal verloren gaan vanaf wanneer de methode eindigt.

 
Heb je echter wBestand in meerdere methodes nodig, dan maak je best een klassevariabele, zoals physicalattraction al had vermeld. Dan initialiseer je de variabele wBestand op het zelfde niveau als de constructors/methodes etc. Je verwijst er dan naar in de constructors/methodes door er this. voor te zetten.

Je krijgt dan:

Code: Selecteer alles

class gui()
{
    String wBestand;

    public gui()
    {
        // Constructor
        this.wBestand = KlasseNaam.readFileToString();
    }
 
    private void cmdStartActionPerformed()
    {
        // Fill in your code here
        wGalg = this.wBestand[RG];
    }
}
​Detail: Die this. is enkel nodig als er verwarring kan zijn. Dat kan gebeuren als je bijvoorbeeld in de constructor/methode zelf een variabele met dezelfde naam initialiseerd. Maar het kan geen kwaad om die er toch bij te zetten, dan weet je waar je mee bezig bent.
Je leest maar niet verder want je, je voelt het begin van wanhoop.
Gebruikersavatar
physicalattraction
Moderator
Artikelen: 0
Berichten: 4.163
Lid geworden op: do 30 mar 2006, 15:37

Re: [java] Public static string variabele terugroepen

jppilot schreef: Dank voor uw reactie.
Het programma herkent het commando: 'this.wBestand = readFileToString()'  niet  zodra ik deze voor de return statement plaats... Geen idee hoe ik dit kan oplossen : /
 
Het kan zijn dat je de klassenaam ervoor moet zetten, zoals Flisk aangeeft. Maar ik begrijp niet goed wat je bedoelt met "voor de return statement plaatst". In mijn voorbeeld had ik hem namelijk in de constructor gezet, en een constructor heeft geen return statement. Kun je iets meer van je code laten zien, dan kunnen we misschien eerder zien wat er mis gaat?
jppilot
Artikelen: 0
Berichten: 46
Lid geworden op: do 17 sep 2009, 22:35

Re: [java] Public static string variabele terugroepen

Code: Selecteer alles

package les;

/**
 *
 * @author Jurriën
 */

//import:
import java.awt.Graphics;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
//import Les.woord;


public class galgjeGUI extends javax.swing.JFrame {

    /**
     * Creates new form galgjeGUI
     */
    
    private String wGalg;   // het te raden woord
    private int fouten;     // globale variabele toegevoegd jonp
    private int pogingen;
    private int levens = 7;
    
    String[] wBestand = new String[10];
    
    
     
    public galgjeGUI() {
        initComponents();
        wBestand[0] = "gewoon";
        wBestand[1] = "beest";
        wBestand[2] = "dozen";
        wBestand[3] = "huis";
        wBestand[4] = "been";
        wBestand[5] = "mongool";
        wBestand[6] = "alfabet";
        wBestand[7] = "koning";
        wBestand[8] = "leerling";
        wBestand[9] = "pot";
        
       buttonDisableFunction();   
       
    }
   
Hierboven wordt een standaard woordenlijst ingeladen, dit noem ik vervolgens wBestand. Dit wil ik in de 2e versie van het programma vervangen voor de wBestand in ReadfiletoString() zoals hieronder:

Code: Selecteer alles

public static String readFileToString() throws IOException {
		File dirs = new File("woordenlijst.txt");
		String filePath = dirs.getCanonicalPath() + File.separator+"src"+File.separator+"TestRead.java";
 
		StringBuilder fileData = new StringBuilder(1000);//Constructs a string buffer with no characters in it and the specified initial capacity
		BufferedReader reader = new BufferedReader(new FileReader(filePath));
 
		char[] buf = new char[1024];
		int numRead = 0;
		while ((numRead = reader.read(buf)) != -1) {
			String readData = String.valueOf(buf, 0, numRead);
			fileData.append(readData);
			buf = new char[1024];
		}
 
		reader.close();
 
		String wBestand = fileData.toString();
		System.out.println(wBestand);
            	return wBestand;
	}
en nog wat later volgt het commando van mijn startbutton in mijn GUI:
Hier wil ik dus bij het commando wGalg=wBestand[RG] de return statement van de readfiletostring() gebruiken.

Code: Selecteer alles

private void cmdStartActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        cmdStart.setText("restart");
        buttonEnableFunction();
        

 
                
        int RG = (int) (Math.random() * 10);            // random getal voor index woord
        wGalg = wBestand[RG];                           // het te raden woord ophalen 
                StringBuffer sterren;                   // want string wordt verandert in de toekomst 
        sterren = new StringBuffer(wGalg);              // het te raden woord tijdelijk invullen 
        for (int i = 0; i < wGalg.length(); i++)        // tekens veranderen voor * 
            {
                sterren.setCharAt(i, '*');
            }
        
        lblWoord.setText(sterren.toString());           // alle labels juiste tekst geven 
        lblMelding.setText("Kies een letter.");
        lblGekozen.setText("gekozen letters: ");
        lblToelichting.setText(""); 
        lblJuisteWoord.setText(""+wGalg);               // rechts boven wordt het juiste woord getoond ter controle van het programma 
        
        cmdStart.setSelected(false);                    // want toggle buttons... 
        fouten=0;                                       // ivm restart 
        
    }                          
In iedergeval bedankt voor de hulp! Ik ben nog een echte beginner in java en ben nog niet echt gewend aan het object georienteerd programmeren...
Gebruikersavatar
physicalattraction
Moderator
Artikelen: 0
Berichten: 4.163
Lid geworden op: do 30 mar 2006, 15:37

Re: [java] Public static string variabele terugroepen

Het ziet er in principe goed uit. Je bent in deze topic niet heel consequent met hoofdlettergebruik in de method name readFileToString. Dit kan een mogelijke oorzaak van je fout zijn. Die method zit toch in dezelfde class, of niet? Anders moet je die andere class ook nog importeren. Verder moet je even spelen met een van de volgende mogelijkheden en kijken welke werkt:

Code: Selecteer alles

wBestand = readFileToString()
wBestand = galgjeGUI.readFileToString()
wBestand = this.readFileToString()
 
Kijk even wat werkt, en als het niet wert, geef dan de error eens.
Gebruikersavatar
Flisk
Artikelen: 0
Berichten: 1.264
Lid geworden op: vr 02 mar 2012, 14:21

Re: [java] Public static string variabele terugroepen

physicalattraction schreef: Verder moet je even spelen met een van de volgende mogelijkheden en kijken welke werkt:

Code: Selecteer alles

wBestand = readFileToString()
wBestand = galgjeGUI.readFileToString()
wBestand = this.readFileToString()
Indien de methode in dezelfde klasse zit, zullen de eerste twee lijnen werken, als er nergens anders een fout in de code zit natuurlijk. Indien de methode in een andere klasse zit, moet die klasse in dezelfde package zitten of moet je inderdaad die klasse importeren. En dan werkt enkel de tweede lijn code.

De derde zal niet werken. this werkt enkel bij instantie methodes/constructor. readFileToString() is een statische methode, de derde lijn zal een compile error geven.
Je leest maar niet verder want je, je voelt het begin van wanhoop.

Terug naar “Informatica en programmeren”