Canvas



  • Hallo,

    ich hoffe mal ihr braucht jetzt nicht den Quellcode :). Also ich habe nen Programm
    und will, dass wenn ich auf ein Button drücke, dass das Canvas, was ebenfalls ins
    GUI des Programms eingearbeitet ist, geleert wird. Ich schaffe das, aber irgendwie
    nicht wirklich. Ich habe das Canvas als Klasse in meiner GUI Klasse erstellt und
    dann mal das Canvas als Instanzvariable deklariert, aber das funktioniert nicht
    (wollte einfach alles übermalen, mit drawRect()). Dann habe ich mir gedacht, dass
    ich dafür ja das Graphics Objekt benötige. Also habe ich das als Instanzvariable
    (für die Canvasklasse) deklariert und dann halt in der anderen aufgerufen. Als
    Ergebnis erhalte ich eine NullPointerException kann mir jemand weiter helfen? Gibt
    es für sowas eine konkrete Methode?

    Gruß
    al3pou



  • Dann habe ich mir gedacht, dass
    ich dafür ja das Graphics Objekt benötige. Also habe ich das als Instanzvariable
    (für die Canvasklasse) deklariert und dann halt in der anderen aufgerufen.

    Man sollte das Graphics-Objekt nie (gut, gibt wenige Ausnahmen fuer sehr fortgeschrittene Dinge bei denen es sinnvoll ist) selber definieren. Du solltest das Graphics-Objekt immer aus der paint-Methode fuer AWT bzw. painComponent()-Methode fuer Swing verwenden.

    Am besten postest du einen minimalen Code damit man sehen kann, was du genau gemacht hast.



  • Okay, hier ist mein Code, aber bitte nicht über die Stümperhaftigkeit lächerlich
    machen, weil das bis dato mein erstes Projekt mit Java ist und ich mich erstmal mit allem vertraut machen muss.

    Das Programm soll, wenn ich auf "Neu starten" drücke das Spiel neu starten und somit das Canvas erst einmal leeren und anschließend das Gitter, welches vorher drauf war, auch wieder zeichnen (für das Gitter war zeichnen() gedacht).

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    
    // Hauptfenster von Klasse JFrame ableiten
    public class Spiel extends JFrame {
      // Variablen um zu erkennen, welcher Spieler dran ist und ob Ende ist
      int player = 0, npc = 0, ende = 0;
      // Spielfeld anlegen
      Spielfeld s_spiel;
      Graphics g;
      // Textfeld für "Tutorial"
      private JLabel text;
      // Buttons als Instanzvariable anlegen
      JButton p1 = new JButton("Zug starten");
      JButton p2 = new JButton("Zug beenden");
      JButton s = new JButton("Spiel starten");
      JButton neu = new JButton("Neu starten");
    
      public static void main(String[] args) {
        Spiel fenster = new Spiel("blubb bla bla");
    	fenster.pack();
    	fenster.setSize(900,800);
    	fenster.setVisible(true);
    	fenster.setResizable(false);
      }
    
      // Konstruktor
      Spiel(String titel) {
        super(titel);
    
    	// Layout-Manager
    	setLayout(new FlowLayout());
    
    	// Spielfeld erzeugen und einbinden
    	s_spiel = new Spielfeld();
    	add(s_spiel);
    	s_spiel.unbenutzt();
    
    	// Textfeld erzeugen und einbinden
    	text = new JLabel("");
    	text.setFont(new Font("Serif", Font.ITALIC, 12));
    	text.setText("Drücke 'Spiel starten'");
    
    	// Panel-Container für Schaltflächen
    	JPanel panel = new JPanel();
    	  // Gitter mit 3 Zeilen, 1 Spalte
    	  panel.setLayout(new GridLayout(3,1,20,20));
    	  // Buttons in Panel einbinden
    	  panel.add(s);
    	  panel.add(p1);
    	  panel.add(p2);
    	  panel.add(neu);
    	  panel.add(text);
    
    	  // zwei Buttons solange deaktivieren bis Spiel startet
    	  p1.setEnabled(false);
    	  p2.setEnabled(false);
    	  neu.setEnabled(false);
    
    	// Panels in Fenster aufnehmen
    	add(panel);
    
    	// Ereignisbehandlung für Buttons
    	class start implements ActionListener {
    	  public void actionPerformed(ActionEvent e) {
    	    // Variable um zu erkennen, welcher Button benutzt wurde
    		String label;
    
    	    label = e.getActionCommand();
    
    		if(label.equals("Spiel starten") && player == 0 && npc == 0 && ende == 0) {
    		  p1.setEnabled(true);
    		  s.setEnabled(false);
    		  player = 1;
    		}
    		else if(label.equals("Zug starten") && player == 1 && ende == 0) {
    		  p1.setEnabled(false);
    		  p2.setEnabled(true);
    		  npc = 1;
    		}
    		else if(label.equals("Zug beenden") && npc == 2 && ende == 0) {
    		  p1.setEnabled(true);
    		  p2.setEnabled(false);
    		  player = 2;
    		}
    		else if(label.equals("Neu starten") && ende == 1) {
    		  p1.setEnabled(true);
    		  p2.setEnabled(false);
    		  neu.setEnabled(false);
    		  ende = 0;
    		  player = 1;
    		  npc = 0;
    		  s_spiel.unbenutzt();
    		}
    	  }
    	} 
    
    	// Buttons für Ereignisbehandlung anmelden
    	s.addActionListener(new start());
    	p1.addActionListener(new start());
    	p2.addActionListener(new start());
    	neu.addActionListener(new start());
    
    	// Spiel schließen, wenn Fenster geschlossen wird
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      }
    
      class Spielfeld extends Canvas {
        // Arrays für das Feld (um zu zeichnen)
    	int[] waage = new int[9];
    	// Array um zu gucken, welche Felder belegt sind
    	boolean[][] p_feld = new boolean[9][8];
    	boolean[][] n_feld = new boolean[9][8];
    	boolean[][] feld = new boolean[9][8];
    	// Variable mit der später die Chips gezeichnet werden
        int m_Xpos;
    	// Variable um festzustellen welches Kästchen benutzt wird
    	int a,b;
    	// Variablen für spätere Schleifen
    	int x,y;
    
        class klick extends MouseAdapter {
          public void mousePressed(MouseEvent e1) {
    		  // die aktuelle Position der Maus merken
    		  m_Xpos = e1.getX();
    
    		  // Malfläche aktualisieren
    		  repaint();
    	  }
    	}
    
    	public void unbenutzt() {
    	  // Arrays initialisieren
    
    	  x = 0;
    	  for(a = 1; a <= 8; a += 1) {
    	    waage[a] = x;
    		x += 100;
    	  }
    	  if(ende == 0) {
    	    // alle Felder auf unbenutzt setzen
    	    for(a = 0; a <= 8; a += 1) { 
    		  for(b = 0; b <= 7; b += 1) {
    		    p_feld[a][b] = true;
    		    n_feld[a][b] = true;
    		    feld[a][b] = true;
    		  }
    	    }
    	  }
    	}
    
        // Konstruktor
    	Spielfeld() {
    
    	  // Ereignisbehandlung im Konstruktor implementieren,
    	  // damit hier auch die Mauskoord. abgefangen werden
    	  addMouseListener(new klick());
    
    	  // Hintergrund auf grau setzen
    	  setBackground(new Color(180,180,180));
    
    	  // Vordergrund bzw. Zeichenfarbe
    	  setForeground(Color.green);
    	} // Ende des Konstruktors
    
    	public void kontrolle(boolean[][] k, String n) {
    	  for(a = 1; a <= 7; a += 1) {
    	    for(b = 1; b <= 6; b += 1) {
    		  // Kontrolle für die waagerechte
    		  if(k[a][b] == false && k[a+1][b] == false && k[a+2][b] == false && k[a+3][b] == false) {
    		    text.setText(n);
    		    ende = 1;
    			neu.setEnabled(true);
                break;
    		  }
    		  // Kontrolle für die senkrechte
    		  else if(k[a][b] == false && k[a][b+1] == false && k[a][b+2] == false && k[a][b+3] == false) {
    		    text.setText(n);
    		    ende = 1;
    			neu.setEnabled(true);
                break;
    		  }
    		  // Kontrolle für normaldiagonal
              else if(k[a][b] == false && k[a+1][b+1] == false && k[a+2][b+2] == false && k[a+3][b+3] == false) {
    		    text.setText(n);
    	        ende = 1;
    			neu.setEnabled(true);
                break;
    		  }
    		  // Kontrolle für rückwärtsdiagonal
    		  else if(k[a][b] == false && k[a-1][b+1] == false && k[a-2][b+2] == false && k[a-3][b+3] == false) {
    		    text.setText(n);
    		    ende = 1;
    			neu.setEnabled(true);
                break;
    		  }
    		  else
    	        continue;
    		}
    	  }
    	} // Ende von kontrolle
    
    	public void chipsSetzen(Graphics g, boolean[][] s) {
    	  // wenn Spieler dran ist
    	  if(player == 1 && npc == 1) {
    	    npc = 2;
          }
    	  // wenn NPC dran ist
    	  else if(player == 2 && npc == 2) {
    	    player = 1;
    		npc = 0;
    	  }
    
    	  for(a = 1; a <= 7; a += 1) {
            // es wird geguckt welches Feld auf x-Aches gewählt wurde		
    		if(m_Xpos >= waage[a] && m_Xpos <= waage[a+1]) {
    	      m_Xpos = waage[a];
    		  // es wird geguckt, ob eines der unteren Felder schon belegt ist
    		  for(b = 6; b >= 1; b -= 1) {
    		    if(feld[a][b] == true) {
    			  g.fillOval(m_Xpos+4,((b-1)*100)+4,92,92);
    			  // Feld wird als belegt deklariert
    			  s[a][b] = false;
    		      feld[a][b] = false;
    			  break;
    			}
    			else
    			  continue;
    		  }
    		}
    		else
    		  continue;
    	    }
    
        } // Ende von chipsSetzen
    
        public void zeichnen(Graphics g) {
    	  // x wird vor der Schleife initialisiert
    	  x = 0;
    	  for(y = 0; y <= 700; y += 100 ) {
    	    // senkrechte Linien; mehrere, damit Linie dicker ist
    		g.drawLine(x,0,x,600);
    		g.drawLine(x+1,0,x+1,600);
    		g.drawLine(x-1,0,x-1,600);
    		x += 100;
    		// waagerechte Linien; mehrere, damit Linie dicker ist
    		g.drawLine(0,y,700,y);
    		g.drawLine(0,y+1,700,y+1);
    		g.drawLine(0,y-1,700,y-1);
    	  }
    	}
    
    	// Spielfeld zeichnen
    	public void paint(Graphics g) {
    	  zeichnen(g);
    
    	  // zeichnet einen Kreis wenn Spieler dran ist
    	  // in das Feld auf das der Spieler mit der Maus klickt
    	  if(player == 0 || npc == 0)
    	    return;
    	  else if(player == 1 && npc == 1){
    		// Farbe von SP1
    		g.setColor(new Color(10,105,225));
    
    		// Falls gewonnen wird das angezeigt
    		String sieg = "Gewonnen";
    
    		chipsSetzen(g, p_feld);
    
    		kontrolle(p_feld, sieg);
    
    	  }
    	  else if(npc == 2 && player == 2){
    		// Farbe von NPC
    		g.setColor(new Color(210,30,75));
    
    		// Falls verloren wird das angezeigt
    		String niederlage = "Verloren";
    
    		chipsSetzen(g, n_feld);
    
    		kontrolle(n_feld, niederlage);
    
    	  }
    
    	} // Ende von paint
    
    	// Damit gezeichnetes erhalten bleibt, wenn neuer Zug beginnt.
    	public void update(Graphics g) {
    	  paint(g);
    	}
    
    	// Diese Methode liefert die minimale Größe der Canvas
    	public Dimension getMinimumSize() {
    	  return new Dimension(700,600);
    	}
    
    	// Die Lieblingsgröße wird auf die Minimalgröße gesetzt
    	public Dimension getPreferredSize() {
    	  return getMinimumSize();
    	}
    
      } // Ende von Spielfeld
    
    } // Ende von Spiel
    

Anmelden zum Antworten