java variabele toegang

Status
Niet open voor verdere reacties.

websitevrager

Gebruiker
Lid geworden
14 jun 2012
Berichten
49
Hallo ik heb het volgende stukje code:

Code:
import java.awt.*;
import javax.swing.*;

class Game {
	
	public JFrame F1;
	
	public static void main(String args[]) {
		
		// Create the window of the game
		
		JFrame F1 = new JFrame("Game");
		F1.setSize(800, 600);
		F1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
		int x = (int) ((dimension.getWidth() - F1.getWidth()) / 2);
		int y = (int) ((dimension.getHeight() - F1.getHeight()) / 2);
		F1.setLocation(x, y);
		F1.setVisible(true);
		
		// Create the menu
		new MainMenu();
		
	}
	public JFrame getFrame() {
		return F1;
	}
}
class MainMenu {
	
	public void MainMenu() {
		
		JButton B1 = new JButton("Wereld laden");
		Game game = new Game();
		Game.getFrame().add(B1);
	}
}
Nu wil ik in de class MainMenu de variabele F1 hebben (het Frame/venster) om daar een button aan te kunnen geven met add()
Maar omdat java zo ingewikkeld is lukt me dit niet na honderd verschillende dingen te proberen.
Het gaat er dus gewoon om dat ik in de ene klasse een variabele kan gebruiken van de andere klasse.
Kan iemand even helpen? Bedankt.
De error die wordt gegeven is:
Line: 35
non-static method getFrame() cannot be referenced from a static context
 
Laatst bewerkt:
Beste website vrager,

Ik zal beginnen met het verwoorden van de verschillende 'modifiers'. De modifiers die java kent zijn:
public - de methodes en variabelen met deze modifier kunnen worden benaderd door elke klasse in elke package van je programma.
private - de methodes en variabelen met deze modifier kunnen worden benaderd door elke methode en variabele binnen dezelfde klasse
protected - de methodes en variabelen met deze modifier kunnen worden benaderd door elke methode en variabele binnen dezelfde package en in subklasses
(geen) - de methodes en variabelen met deze modifier kunnen worden benaderd door elke methode en variabele binnen dezelfde klasse en dezelfde package

Voorbeeld
Code:
public int mijnInteger = 0;
private int mijnInteger2 = 4;
protected int mijnInteger3 = 5;
int mijnInteger4 = 6;

Er zijn verschillende methodes om variabelen uit klassen te benaderen. Persoonlijk vind ik het gebruik van getters en setters het mooiste, dit zorgt ervoor dat logica dat bij een bepaalde component hoort ook bij een bepaalde component blijft en niet door alle componenten bereikbaar is.

Een voorbeeld:
Code:
public class Huis {
     private Deur deur;
     private int prijs;

     public Huis() {
          deur = new Deur();
          prijs = 1000;
     }
     
     public int getPrijs(){ 
          return prijs;
     }

     public void setPrijs(int nieuwePrijs) {
           prijs = nieuwePrijs;
     }

     public void openDeur() {
           deur.open();
     }
}

public class Deur {
      private boolean open;
 
      public Deur() {
           open = false;
      }
     
       public void open() {
            open = true;
       }
}

Zoals je hierboven kan zien heeft iedere klasse zijn eigen variabelen en zijn eigen logica. Het huis heeft een prijs welke via één manier opgevraagd en veranderd kan worden. Een deur kan open gemaakt worden op één manier, namelijk via de open methode. Het gebruik van getters en setters zorgt er in dit geval voor dat niet allerlei verschillende klassen variabelen van de huis en deur klasse kunnen wijzigen.

Ik had het voorgaande voorbeeld ook zo kunnen coderen.
Code:
public class Huis {
		public int prijs = 40;
	
	     public Huis() {
	         new Deur().open = true;
	         
	     }
}


public class Deur {
	public boolean open;
	
	public Deur() {
		open = false;
	}
}

Nu wordt het problematisch als er nog een andere klasse komt die hetzelfde object deur gebruikt. Het huis en die andere klasse kunnen dan de deur variabele omzetten en je raakt je hele grip over het programma kwijt. Nog niet te spreken over concurrency problemen (dit zal ik nu niet bespreken).

Nu even terugkomend op jouw probleem. Je wilt een object dat niet statisch is toevoegen aan een statisch object. Dit gaat helaas niet, lees voor meer informatie de volgende link: http://www.leepoint.net/notes-java/flow/methods/50static-methods.html

Ik raad je aan om in de main methode het frame aan te maken en een panel te maken die je aan dit jframe koppelt frame.setContentPane(mijnPanel). Aan dit paneel voeg je dan weer knoppen et cetera toe. Hier staan vele artikelen over op het internet. Als je niet per sé Swing wilt gebruiken zou ik ook eens naar JavaFX kijken. Dit is volgens vele de nieuwe betere manier om GUI's te bouwen.

Misschien was het een beetje veel informatie, maar ik hoop dat je er iets aan hebt.

Groet,
Bram
 
Dag websitevrager,

Top uitleg van Bram. Verdiepen in de verschillende modifiers kan echt geen kwaad. Sterker nog, het zijn Java basics.
Aan te raden is classes te scheiden, daar bedoel ik mee, in verschillende bestanden werken. Zo houd je een goed overzicht.

Om terug te komen op je probleem: Je wilt een frame meegeven.
Dit kun je realiseren door een parameter mee te geven in de constructor van MainMenu.
Als volgt:

Code:
//inputs
public class Game
{
    public JFrame B1;
    //main method
    {
        //code
        new MainMenu(B1);
        //more code
    }
}

public class MainMenu
{
    private JFrame frame;
    public MainMenu(JFrame newFrame)
    {
        frame = newFrame;
    }
}

Ik verwacht dat de error dan ook niet langer van toepassing is.

Succes,

Mike
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan