Swing Problem mit der Anzeige

paxis

Mitglied
Hallo Community,

das hier ist mein erster Post, weil ich zur Zeit gar nicht weiter komme und nun Hilfe brauch, hoffentlich könnt ihr mir helfen 😀!

Hier erstmal mein Code

Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Spiel extends JFrame {
 MeineCanvas m_malflaeche;
 int aktFunktion = 0;
 
 public static void main(String[] args) {
 Spiel fenster = new Spiel("Spiel 1");
 fenster.pack();
 fenster.setSize(450,350);
 fenster.setResizable(false);
 fenster.setVisible(true);
 }
 Spiel(String titel) {
 super(titel);
 
 setLayout(new FlowLayout());
 
 m_malflaeche =  new MeineCanvas();
 add(m_malflaeche);
 
 JButton Oben = new JButton("oben");
JButton Links = new JButton("links");
JButton Rechts = new JButton("rechts");
JButton Unten = new JButton("unten");
add(Oben);
add(Links);
add(Rechts);
add(Unten);

  Oben.addActionListener(new MeinActionLauscher1());

class MeinActionLauscher implements ActionListener {
 public void actionPerformed(ActionEvent e) {
   String label;
   int x=1;
   
   label = e.getActionCommand();
   
   if(x==1)   
   m_malflaeche.repaint(); 
   }
   }
   //Oben.addActionListener(new MeinActionLauscher());
   
   //setDefaultCloseOperation(WindowConstatns.EXIT_ON_CLOSE);
   }


public class MeinActionLauscher1 implements ActionListener {

	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub

  m_malflaeche.repaint(); 
	}

}


class MeineCanvas extends Canvas {
 MeineCanvas() {
  setBackground(Color.black);
  
  setForeground(Color.green);
  }
  
  public void paint(Graphics g) {
   double x,y;
   int xpos,ypos;
   
   g.translate (150,150);
   
   g.setColor(Color.blue);
   g.drawLine(100,110,110,110);
   g.drawLine(110,110,110,110);
   g.drawString("TEST",10,10);
   }
   }
   
  public Dimension getMinimumSize() {
  return new Dimension(300,300);
  }
  
  public Dimension getPreferredSize() {
  return getMinimumSize();
  }
   
   
   }

Das Programm per Konsole ausführen ist kein Problem, aber er zeichnet einfach GAR nichts, d.h. ich habe meine Vier buttens aber sonst nur ein schönes Weiß!

Ich hoffe, einer von euch Profis kann einem Anfänger wie mir helfen 🙂

Grüße
 
IMHO würde ich in dem Fall statt Canvas [JAPI]JComponent[/JAPI] nutzen.

Dort dann aber nicht paint sondern paintComponent überschreiben.

Nicht vergessen wenn man paintComponent überschreibt super aufzurufen.

Das wären die ersten Schritte und wenn dann noch was nicht funktioniert würde ich mich wiedermelden.
 
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Spiel extends JFrame {
 MeineCanvas m_malflaeche;
 int aktFunktion = 0;
 
 public static void main(String[] args) {
 Spiel fenster = new Spiel("Spiel 1");
 fenster.pack();
 fenster.setSize(450,350);
 fenster.setResizable(false);
 fenster.setVisible(true);
 }
 Spiel(String titel) {
 super(titel);
 
 setLayout(new FlowLayout());
 
 m_malflaeche =  new MeineCanvas();
 add(m_malflaeche);
 
 JButton Oben = new JButton("oben");
JButton Links = new JButton("links");
JButton Rechts = new JButton("rechts");
JButton Unten = new JButton("unten");
add(Oben);
add(Links);
add(Rechts);
add(Unten);

  Oben.addActionListener(new MeinActionLauscher1());

class MeinActionLauscher implements ActionListener {
 public void actionPerformed(ActionEvent e) {
   String label;
   int x=1;
   
   label = e.getActionCommand();
   
   if(x==1)   
   m_malflaeche.repaint(); 
   }
   }
   //Oben.addActionListener(new MeinActionLauscher());
   
   //setDefaultCloseOperation(WindowConstatns.EXIT_ON_CLOSE);
   }


public class MeinActionLauscher1 implements ActionListener {

	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub

  m_malflaeche.repaint(); 
	}

}


class MeineCanvas extends JComponent {
 MeineCanvas() {
  setBackground(Color.black);
  
  setForeground(Color.green);
  }
  
  public void paintComponent(Graphics g) {
   
   double x,y;
   int xpos,ypos;
   
   g.translate (150,150);
   
   g.setColor(Color.blue);
   g.drawLine(100,110,110,110);
   g.drawLine(110,110,110,110);
   g.drawString("TEST",10,10);
   }
   }
   
  public Dimension getMinimumSize() {
  return new Dimension(300,300);
  }
  
  public Dimension getPreferredSize() {
  return getMinimumSize();
  }
   
   
   }

Hab den Code etwas geändert, geht aber immer noch nicht... 🙁!
Was mache ich falsch?
 
Er meint, dass der erste Aufruf in in deiner paintComponent() die überschriebene Methode aus JComponent sein sollte.
Java:
protected void paintComponent(Graphics g) {
   super.paintComponent(g);
   //ab hier legst du nun mit deinen Anweisungen los.
}
 
So?:
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Spiel extends JFrame {
 MeineCanvas m_malflaeche;
 int aktFunktion = 0;
 
 public static void main(String[] args) {
 Spiel fenster = new Spiel("Spiel 1");
 fenster.pack();
 fenster.setSize(450,350);
 fenster.setResizable(false);
 fenster.setVisible(true);
 }
 Spiel(String titel) {
 super(titel);
 
 setLayout(new FlowLayout());
 
 m_malflaeche =  new MeineCanvas();
 add(m_malflaeche);
 
 JButton Oben = new JButton("oben");
JButton Links = new JButton("links");
JButton Rechts = new JButton("rechts");
JButton Unten = new JButton("unten");
add(Oben);
add(Links);
add(Rechts);
add(Unten);

  Oben.addActionListener(new MeinActionLauscher1());

class MeinActionLauscher implements ActionListener {
 public void actionPerformed(ActionEvent e) {
   String label;
   int x=1;
   
   label = e.getActionCommand();
   
   if(x==1)   
   m_malflaeche.repaint(); 
   }
   }
   //Oben.addActionListener(new MeinActionLauscher());
   
   //setDefaultCloseOperation(WindowConstatns.EXIT_ON_CLOSE);
   }


public class MeinActionLauscher1 implements ActionListener {

	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub

  m_malflaeche.repaint(); 
	}

}


class MeineCanvas extends JComponent {
 MeineCanvas() {
  setBackground(Color.black);
  
  setForeground(Color.green);
  }
  
  //public void paintComponent(Graphics g) {
   
   double x,y;
   int xpos,ypos;
   
   g.translate (150,150);
   
   g.setColor(Color.blue);
   g.drawLine(100,110,110,110);
   g.drawLine(110,110,110,110);
   g.drawString("TEST",10,10);
   }
   //}
   
  //public Dimension getMinimumSize() {
  return new Dimension(300,300);
  }
  
  //public Dimension getPreferredSize() {
  return getMinimumSize();
  }
   
   
   }
   
 protected void paintComponent(Graphics g) {
   super.paintComponent(g);
    double x,y;
   int xpos,ypos;
   
   g.translate (150,150);
   
   g.setColor(Color.blue);
   g.drawLine(100,110,110,110);
   g.drawLine(110,110,110,110);
   g.drawString("TEST",10,10);
   }
   }
   
  public Dimension getMinimumSize() {
  return new Dimension(300,300);
  }
  
  public Dimension getPreferredSize() {
  return getMinimumSize();
  }
   
   
   }
}

(altes mal auskommentiert...)

Folgende error (edit):
Spiel.java:82: error: class, interface, or enum expected
}
^
Spiel.java:87: error: class, interface, or enum expected
}
^
Spiel.java:91: error: class, interface, or enum expected
}
^
Spiel.java:98: error: class, interface, or enum expected
double x,y;
^
Spiel.java:99: error: class, interface, or enum expected
int xpos,ypos;
^
Spiel.java:101: error: class, interface, or enum expected
g.translate (150,150);
^
Spiel.java:103: error: class, interface, or enum expected
g.setColor(Color.blue);
^
Spiel.java:104: error: class, interface, or enum expected
g.drawLine(100,110,110,110);
^
Spiel.java:105: error: class, interface, or enum expected
g.drawLine(110,110,110,110);
^
Spiel.java:106: error: class, interface, or enum expected
g.drawString("TEST",10,10);
^
Spiel.java:107: error: class, interface, or enum expected
}
^
Spiel.java:110: error: class, interface, or enum expected
public Dimension getMinimumSize() {
^
Spiel.java:112: error: class, interface, or enum expected
}
^
Spiel.java:114: error: class, interface, or enum expected
public Dimension getPreferredSize() {
^
Spiel.java:116: error: class, interface, or enum expected
}
^
15 errors


Was vom alten Code auskommentiert!
 
Zuletzt bearbeitet:
Ich habe mir deinen Code noch nicht ganz angesehen. Aber deine Frage offenbart, dass immer noch nichts gezeichnet wird?
[EDIT]Na bitte, eine Fehlermeldung. Das ist doch schon mal was, wo mit man etwas anfangen kann.[/EDIT]

Naja, du kannst nicht einfach den Methodenkopf auskommentieren und dann erwarten, dass alles funktioniert.
Code:
g
ist bspw. in diesem Teil des Programms (der Klasse) noch nicht definiert...
Du solltest also wirklich alle relavanten Zeilen auskommentieren.
Code:
 /* auskommentiert */
 
Hier nochmal alles ( Sorry für den mist oben) :
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Spiel extends JFrame {
 MeineCanvas m_malflaeche;
 int aktFunktion = 0;
 
 public static void main(String[] args) {
 Spiel fenster = new Spiel("Spiel 1");
 fenster.pack();
 fenster.setSize(450,350);
 fenster.setResizable(false);
 fenster.setVisible(true);
 }
 Spiel(String titel) {
 super(titel);
 
 setLayout(new FlowLayout());
 
 m_malflaeche =  new MeineCanvas();
 add(m_malflaeche);
 
 JButton Oben = new JButton("oben");
JButton Links = new JButton("links");
JButton Rechts = new JButton("rechts");
JButton Unten = new JButton("unten");
add(Oben);
add(Links);
add(Rechts);
add(Unten);

  Oben.addActionListener(new MeinActionLauscher1());

class MeinActionLauscher implements ActionListener {
 public void actionPerformed(ActionEvent e) {
   String label;
   int x=1;
   
   label = e.getActionCommand();
   
   if(x==1)   
   m_malflaeche.repaint(); 
   }
   }
   //Oben.addActionListener(new MeinActionLauscher());
   
   //setDefaultCloseOperation(WindowConstatns.EXIT_ON_CLOSE);
   }


public class MeinActionLauscher1 implements ActionListener {

	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub

  m_malflaeche.repaint(); 
	}

}


//class MeineCanvas extends JComponent {
 //MeineCanvas() {
  //setBackground(Color.black);
  
 // setForeground(Color.green);
  }
  
  //public void paintComponent(Graphics g) {
   
  // double x,y;
   //int xpos,ypos;
   
   //g.translate (150,150);
   
  // g.setColor(Color.blue);
  // g.drawLine(100,110,110,110);
   //g.drawLine(110,110,110,110);
   //g.drawString("TEST",10,10);
   //}
   //}
   
 //public Dimension getMinimumSize() {
  //return new Dimension(300,300);
  //}
  
  //public Dimension getPreferredSize() {
 // return getMinimumSize();
  //}
   
   
   
   
 protected void paintComponent(Graphics g) {
   super.paintComponent(g);
    double x,y;
   int xpos,ypos;
   
   g.translate (150,150);
   
   g.setColor(Color.blue);
   g.drawLine(100,110,110,110);
   g.drawLine(110,110,110,110);
   g.drawString("TEST",10,10);
   }
   
   
  public Dimension getMinimumSize() {
  return new Dimension(300,300);
  }
  
  public Dimension getPreferredSize() {
  return getMinimumSize();
  }
   
   
   }
}

Fehler:
Spiel.java:96: error: class, interface, or enum expected
protected void paintComponent(Graphics g) {
^
Spiel.java:98: error: class, interface, or enum expected
double x,y;
^
Spiel.java:99: error: class, interface, or enum expected
int xpos,ypos;
^
Spiel.java:101: error: class, interface, or enum expected
g.translate (150,150);
^
Spiel.java:103: error: class, interface, or enum expected
g.setColor(Color.blue);
^
Spiel.java:104: error: class, interface, or enum expected
g.drawLine(100,110,110,110);
^
Spiel.java:105: error: class, interface, or enum expected
g.drawLine(110,110,110,110);
^
Spiel.java:106: error: class, interface, or enum expected
g.drawString("TEST",10,10);
^
Spiel.java:107: error: class, interface, or enum expected
}
^
Spiel.java:110: error: class, interface, or enum expected
public Dimension getMinimumSize() {
^
Spiel.java:112: error: class, interface, or enum expected
}
^
Spiel.java:114: error: class, interface, or enum expected
public Dimension getPreferredSize() {
^
Spiel.java:116: error: class, interface, or enum expected
}
^
13 errors


Werde dann mal eben mit dem G das testen!!
 
Die Klasse MeineCanvas darfst du natürlich nicht auskommentieren. In dieser Klasse lebt doch die paintComponent()-Methode.

[EDIT]Na bitte! 🙂[/EDIT]
 
Wie kann ich jetzt den Paint Befehl per Actionlistener aufrufen lassen?
m_malflaeche.repaint();

war es ja mit AmT!

Aber wie mache ich das mit Swing und wie sorge ich dafür, dass das nicht direkt am Anfang passiert?

[EDIT]Noch eine Frage:
Mal Folgende Methode hinzugefügt (test) so sieht es aus:
Java:
class MeineCanvas extends JComponent {
 MeineCanvas() {
 setBackground(Color.black);
  
  setForeground(Color.green);
  } 
   
 protected void paintComponent(Graphics g) {
   super.paintComponent(g);
    double x,y;
   int xpos,ypos;
   
   g.translate (150,150);
   
   g.setColor(Color.blue);
   g.drawLine(100,110,110,110);
   g.drawLine(110,110,110,110);
   g.drawString("TEST",10,10);
   }
   
  public void Test(Graphics g) {
   double a,b;
   g.drawLine(-10,-10,-50,-50);
  }
  public Dimension getMinimumSize() {
  return new Dimension(300,300);
  }
  
  public Dimension getPreferredSize() {
  return getMinimumSize();
  }
   
   
   }

Dann weiter oben:

Unten.addActionListener(new MeinActionLauscher());

Der Listener:

class MeinActionLauscher implements ActionListener {
public void actionPerformed(ActionEvent e) {
String label;
int x=1;

label = e.getActionCommand();

if(x==1)
m_malflaeche.repaint();
m_malflaeche.test();
}
}}

((hier ist noch bisschen "MÜll" drinnen)



Jetzt kommt folgender Error:
Spiel.java:34: error: cannot find symbol
Unten.addActionListener(new MeinActionLauscher());
^
symbol: class MeinActionLauscher
location: class Spiel
Spiel.java:44: error: cannot find symbol
m_malflaeche.test();
^
symbol: method test()
location: variable m_malflaeche of type MeineCanvas
2 errors


[/EDIT]
 
Zuletzt bearbeitet:
Nochmal der Code:

Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Spiel extends JFrame {
 MeineCanvas m_malflaeche;
 int aktFunktion = 0;
 
 public static void main(String[] args) {
 Spiel fenster = new Spiel("Spiel 1");
 fenster.pack();
 fenster.setSize(450,350);
 fenster.setResizable(false);
 fenster.setVisible(true);
 }
 Spiel(String titel) {
 super(titel);
 
 setLayout(new FlowLayout());
 
 m_malflaeche =  new MeineCanvas();
 add(m_malflaeche);
 
 JButton Oben = new JButton("oben");
JButton Links = new JButton("links");
JButton Rechts = new JButton("rechts");
JButton Unten = new JButton("unten");
add(Oben);
add(Links);
add(Rechts);
add(Unten);

  Oben.addActionListener(new MeinActionLauscher1());
Unten.addActionListener(new MeinActionLauscher());

class MeinActionLauscher implements ActionListener {
 public void actionPerformed(ActionEvent e) {
   String label;
   int x=1;
   
   label = e.getActionCommand();
   
   if(x==1)   
   m_malflaeche.repaint(); 
   m_malflaeche.test();
   }
   }
   //Oben.addActionListener(new MeinActionLauscher());
   
   //setDefaultCloseOperation(WindowConstatns.EXIT_ON_CLOSE);
   }


public class MeinActionLauscher1 implements ActionListener {

	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub

  m_malflaeche.repaint(); 
	}

}


//class MeineCanvas extends JComponent {
 //MeineCanvas() {
  //setBackground(Color.black);
  
 // setForeground(Color.green);
  }
  
  //public void paintComponent(Graphics g) {
   
  // double x,y;
   //int xpos,ypos;
   
   //g.translate (150,150);
   
  // g.setColor(Color.blue);
  // g.drawLine(100,110,110,110);
   //g.drawLine(110,110,110,110);
   //g.drawString("TEST",10,10);
   //}
   //}
   
 //public Dimension getMinimumSize() {
  //return new Dimension(300,300);
  //}
  
  //public Dimension getPreferredSize() {
 // return getMinimumSize();
  //}
   
   
  
class MeineCanvas extends JComponent {
 MeineCanvas() {
 setBackground(Color.black);
  
  setForeground(Color.green);
  } 
   
 protected void paintComponent(Graphics g) {
   super.paintComponent(g);
    double x,y;
   int xpos,ypos;
   
   g.translate (150,150);
   
   g.setColor(Color.blue);
   g.drawLine(100,110,110,110);
   g.drawLine(110,110,110,110);
   g.drawString("TEST",10,10);
   }
   
  public void Test(Graphics g) {
   double a,b;
   g.drawLine(-10,-10,-50,-50);
  }
  public Dimension getMinimumSize() {
  return new Dimension(300,300);
  }
  
  public Dimension getPreferredSize() {
  return getMinimumSize();
  }
   
   
   }

Fehlercode:
Spiel.java:34: error: cannot find symbol
Unten.addActionListener(new MeinActionLauscher());
^
symbol: class MeinActionLauscher
location: class Spiel
Spiel.java:44: error: cannot find symbol
m_malflaeche.test();
^
symbol: method test()
location: variable m_malflaeche of type MeineCanvas
2 errors
 
Ich hab dir mal die gröbsten Sachen angepasst, so daß es zumindest mal läuft.

Klickt man auf oben oder unten geklickt dann veranlasst der ActionListener das die Malfläche neu gezeichnet wird. Damit man das erkennt lasse ich dort die aktuelle Uhrzeit neu zeichnen.

Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
 
public class Spiel extends JFrame {
 MeineCanvas m_malflaeche;
 int aktFunktion = 0;
 
 public static void main(String[] args) {
 Spiel fenster = new Spiel("Spiel 1");
 fenster.pack();
 fenster.setSize(450,350);
 fenster.setResizable(false);
 fenster.setVisible(true);
 fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }
 Spiel(String titel) {
 super(titel);
 
 setLayout(new BorderLayout());
 
 m_malflaeche =  new MeineCanvas();
 add(m_malflaeche, BorderLayout.CENTER);
 
 JButton Oben = new JButton("oben");
JButton Links = new JButton("links");
JButton Rechts = new JButton("rechts");
JButton Unten = new JButton("unten");
add(Oben, BorderLayout.NORTH);
add(Links, BorderLayout.EAST);
add(Rechts,BorderLayout.WEST);
add(Unten,BorderLayout.SOUTH);
 
  Oben.addActionListener(new MeinActionLauscher1());
Unten.addActionListener(new MeinActionLauscher());
}



class MeinActionLauscher implements ActionListener {
 public void actionPerformed(ActionEvent e) {
   String label;
   int x=1;
   
   label = e.getActionCommand();
   
   if(x==1)   
     m_malflaeche.repaint(); 
   }
}
 
class MeinActionLauscher1 implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent arg0) {
        m_malflaeche.repaint(); 
    }
 
}
 

  
  
class MeineCanvas extends JComponent {
  MeineCanvas() {
    setBackground(Color.black);
  
    setForeground(Color.green);
    setPreferredSize(new Dimension(300,300));
  } 
 @Override  
 protected void paintComponent(Graphics g) {
   super.paintComponent(g);
   
   g.translate (150,150);
   
   g.setColor(Color.blue);
   g.drawLine(100,110,110,110);
   g.drawLine(110,110,110,110);
   g.drawString(new java.util.Date().toString(),10,10);
   }
   
/* BullShit removed setPreferredSize in Constructor setzen und gut ist.
  }*/
   
   
   }
}

Das was auf der Malfläche gezeichnet werden soll, das hält man sich normalerweise in einem Model bzw. Feldern die die JComponent besitzt. und der ActionListener greift über einen Setter darauf zu. Oder z.B. über solche Utilitymethoden.

Java:
public class Square extends JComponent {
  private int xPosition=0;
  private int yPosition=0;

  @Override
  protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setColor(Color.red);
    g2d.drawRect(xPosition,yPosition,5,5);
  }

  public void moveRight(){
    xPosition += 5;
    repaint();
  }

  public void moveLeft(){
    xPosition -= 5;
    repaint();
  }

  public void moveUp(){
    yPosition -= 5;
    repaint();
  }

  public void moveDown(){
    yPosition += 5;
    repaint();
  }

}

Ein passender ActionListener ruft dann einfach auf dem Square moveLeft() auf und das Quadrat sollte sich auf magische Weise nach rechts bewegen.
 

Neue Themen


Zurück
Oben