Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich versuche ein Seil zu programmieren, und hab das spielfeld in eine Klasse ausgelagert. in dieser klasse hab ich eine paintmetode die den ball zeichnen soll, der in einer anderen klasse ist, nur eclipse sagt:
Erstellen eines statischen (static) Verweises für das nicht-statische Feld Ball nicht
möglich
import javax.swing.*;
import java.awt.*;
public class Spielfläche extends JPanel {
[...]
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Ball.getFarbe());//Hier der Fehler
[...]
}
Der Ball:
Code:
import java.awt.*;
public class Spielball {
private Color Farbe;
[...]
public void SpielBall() {
Farbe = Color.RED;
}
[...]
public Color getFarbe() {
return Farbe;
}
}
Ball wird natürlich als neuer Spielball definiert.
Warum Ball groß? keine Ahnung, evtl weil Ball ein Objekt ist.
Reicht der Code? (Ich weiß, dasss er sich ein bisschen geändert hat
Game.java(Hauptdatei)
Code:
import include.*;
public class Game {
public static void main(String[] args) {
doInitializations();
SpielThread Spiel = new SpielThread();
Spiel.run();
}
static void doInitializations(){
Fenster wnd=new Fenster();
wnd.anzeigen();
}
}
Fenster.java
Code:
package include;
import javax.swing.*;
import java.awt.*;
public class Fenster extends JFrame {
public Fenster() {
super("Das Spiel");
// Layout setzen und Buttons hinzufügen
Container contentPane = getContentPane();
contentPane.setLayout(null);
Spielfläche Fläche = new Spielfläche();
Fläche.setLocation(0, 0);
contentPane.add(Fläche);
this.setResizable(false);
// contentPane.add(new JButton("Start"));
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void anzeigen() {
this.setVisible(true);
Insets tmp = this.getInsets();
this.setSize(tmp.left + tmp.right + 900, tmp.top + tmp.bottom + 600);
tmp = null;
}
public void verstecken() {
this.setVisible(false);
}
}
Spielfläche.java
Code:
import javax.swing.*;
import java.awt.*;
public class Spielfläche extends JPanel {
int breite = 800;
int höhe = 600;
public Spielfläche() {
super(true);
this.setSize(this.breite, this.höhe);
this.setBounds(0, 0, breite, höhe);
this.setBackground(Color.BLACK);
}
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
Spielball Ball=SpielThread.Ball;// Hier der Fehler ############
g.setColor(Ball.getFarbe());
g.fillRect(10,100,20,300);
}
}
SpielThread.java
Code:
package include;
public class SpielThread extends Thread{
public Spielball Ball;
public void run(){
doInitializations();
}
public void doInitializations(){
Ball=new Spielball();// Hier Ball instanzierung###########
}
}
Code:
package include;
import java.awt.*;
public class Spielball {
private int x_pos;
private int y_pos;
private int radius;
private Color Farbe;
public void SpielBall() {
x_pos = 400;
y_pos = 300;
radius = 10;
Farbe = Color.RED;
}
public int getX_pos() {
return x_pos;
}
public int getY_pos() {
return y_pos;
}
public int getRadius() {
return radius;
}
public Color getFarbe() {
return Farbe;
}
}
"Spielfläche" ist im falschan package, entweder du importierst "SpielThread", oder du änderst das package in include (Momentan ist es im default Package).
PS: Mach ball nicht public, sondern private und verwende getter und setter um darauf zu zugreifen (Kapselung).
War nur so ein Tipp, dass wird dein Fehler nicht beheben.
Ich meinte du solltest in der SpielThread Klasse die Variable:
Code:
public Spielball Ball;
Klein schreiben, und public durch private ersetzten und dann noch getter und setter dazu erstellen.
Edit: Habe erst jetzt dein Kompilierfehler gesehen. Du müsstest Ball auch noch static machen damit das geht.
Würde ich dir aber abraten. Deine SpielThread Klasse scheint mir ziemlich überflüssig, ich würde den Ball member einfach in Spielfläche speichern.
Dein Code könnte dann irgendwie so aussehen wie unten. Entweder wird der Ball über den Konstruktor dem Spielfläche übergeben, oder später mit einer Methode gesetzt (alternativ könnte die Spielfläche den Ball generiere und alle anderen fragen die Spielfläche nach ihm).
Code:
public class Spielfläche ...{
private Ball ball;
public Spielfläche( Ball ball ){
this.ball = ball;
}
public void setBall( Ball ball ){
this.ball = ball;
}
}
Nein, die Methode ist nicht statisch, sonst würde sie ein static in der Singnatur tragen.
SpielThread.Ball Du versuchst auf 'Ball' statisch zuzugreifen und das geht nicht.
Das "SpieleThread" ist der Name der Klasse. Wann immer du "Klassenname.xyz" schreibst, machst du eine statischen Zugriff auf "xyz". Das funktioniert nur, wenn "xyz" als "static" markiert ist.
"static" bedeuted, dass eine Variable (oder Methode) mit einer Klasse verbunden ist, es ist eine sog. Klassenvariable.
Variablen die nicht "static" sind, sind hingegen an ein konkretes Objekt gebunden, sie sind sog. Objektvariablen.
Es ist meist eine schlechte Idee eine Variable an eine Klasse zu binden, die Variable existiert dann nämlich nur ein einziges mal im gesammten Programm. Eine Objektvariable kann hingegen so oft existieren wie du es für notwendig hälst.
In deinem Beispiel oben muss "Spielefläche" einfach ein Objekt vom Typ "SpieleThread" kennen.
Code:
public class SpieleFläche extends JPanel{
private SpieleThread thread;
public SpieleFläche( SpieleThread thread ){
this.thread = thread;
}
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
Spielball ball=thrad.getBall();
g.setColor(ball.getFarbe());
}
}