Springen naar inhoud

[java] Public static string variabele terugroepen


  • Log in om te kunnen reageren

#1

jppilot

    jppilot


  • >25 berichten
  • 46 berichten
  • Gebruiker

Geplaatst op 01 september 2014 - 21:34

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:

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:

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!

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

physicalattraction

    physicalattraction


  • >1k berichten
  • 3104 berichten
  • Moderator

Geplaatst op 02 september 2014 - 08:52

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

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.


#3

jppilot

    jppilot


  • >25 berichten
  • 46 berichten
  • Gebruiker

Geplaatst op 02 september 2014 - 11:11

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 : /


#4

Flisk

    Flisk


  • >1k berichten
  • 1270 berichten
  • Moderator

Geplaatst op 02 september 2014 - 16:24

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

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:

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.

Veranderd door Flisk, 02 september 2014 - 16:42

Je leest maar niet verder want je, je voelt het begin van wanhoop.

#5

physicalattraction

    physicalattraction


  • >1k berichten
  • 3104 berichten
  • Moderator

Geplaatst op 03 september 2014 - 06:45

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?


#6

jppilot

    jppilot


  • >25 berichten
  • 46 berichten
  • Gebruiker

Geplaatst op 03 september 2014 - 07:00

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:

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.

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...


#7

physicalattraction

    physicalattraction


  • >1k berichten
  • 3104 berichten
  • Moderator

Geplaatst op 05 september 2014 - 06:20

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:

wBestand = readFileToString()
wBestand = galgjeGUI.readFileToString()
wBestand = this.readFileToString()
 

Kijk even wat werkt, en als het niet wert, geef dan de error eens.


#8

Flisk

    Flisk


  • >1k berichten
  • 1270 berichten
  • Moderator

Geplaatst op 07 september 2014 - 14:40

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

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.





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures