2016-04-24 18 views
0

Ich versuche, ein Hangman-Spiel für meine Java-Klasse zu erstellen und ich kämpfe mit, wie man jede Klasse zusammen arbeiten lässt. In diesem Fall versuche ich, meine Phrase von der selectPhrase-Methode in das mainPanel zu schreiben. Ich bin sehr neu in der Programmierung, so dass jede Hilfe sehr geschätzt werden würde. DankeProbleme beim Aufruf einer JPanel aus einer anderen Klasse

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

/** 
* Created by Alex on 4/22/2016. 
*/ 
``public class HangmanGame extends JFrame implements ActionListener { 

    public HangmanGame() { 
     JPanel lettersPanel = new JPanel(new GridLayout(5,8,5,5)); 

     JButton jbtA = new JButton("A"); 
     JButton jbtB = new JButton("B"); 
     JButton jbtC = new JButton("C"); 
     JButton jbtD = new JButton("D"); 
     JButton jbtE = new JButton("E"); 
     JButton jbtF = new JButton("F"); 
     JButton jbtG = new JButton("G"); 
     JButton jbtH = new JButton("H"); 
     JButton jbtI = new JButton("I"); 
     JButton jbtJ = new JButton("J"); 
     JButton jbtK = new JButton("K"); 
     JButton jbtL = new JButton("L"); 
     JButton jbtM = new JButton("M"); 
     JButton jbtN = new JButton("N"); 
     JButton jbtO = new JButton("O"); 
     JButton jbtP = new JButton("P"); 
     JButton jbtQ = new JButton("Q"); 
     JButton jbtR = new JButton("R"); 
     JButton jbtS = new JButton("S"); 
     JButton jbtT = new JButton("T"); 
     JButton jbtU = new JButton("U"); 
     JButton jbtV = new JButton("V"); 
     JButton jbtW = new JButton("W"); 
     JButton jbtX = new JButton("X"); 
     JButton jbtY = new JButton("Y"); 
     JButton jbtZ = new JButton("Z"); 

     lettersPanel.add(jbtA); 
     lettersPanel.add(jbtB); 
     lettersPanel.add(jbtC); 
     lettersPanel.add(jbtD); 
     lettersPanel.add(jbtE); 
     lettersPanel.add(jbtF); 
     lettersPanel.add(jbtG); 
     lettersPanel.add(jbtH); 
     lettersPanel.add(jbtI); 
     lettersPanel.add(jbtJ); 
     lettersPanel.add(jbtK); 
     lettersPanel.add(jbtL); 
     lettersPanel.add(jbtM); 
     lettersPanel.add(jbtN); 
     lettersPanel.add(jbtO); 
     lettersPanel.add(jbtP); 
     lettersPanel.add(jbtQ); 
     lettersPanel.add(jbtR); 
     lettersPanel.add(jbtS); 
     lettersPanel.add(jbtT); 
     lettersPanel.add(jbtU); 
     lettersPanel.add(jbtV); 
     lettersPanel.add(jbtW); 
     lettersPanel.add(jbtX); 
     lettersPanel.add(jbtY); 
     lettersPanel.add(jbtZ); 

     JPanel mainPanel = new JPanel(new BorderLayout()); 
     setLayout(new GridLayout(2,2,5,5)); 

     mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 
     mainPanel.add(lettersPanel, BorderLayout.EAST); 
     mainPanel.setBackground(Color.BLACK); 

     //mainPanel.add() 



     add(mainPanel, BorderLayout.CENTER); 
    } 



    public static void main(String[] args) { 
     JFrame frame = new HangmanGame(); 
     frame.add(new HangmanGraphics()); 
     frame.setTitle("Hangman"); 
     frame.setSize(1020, 800); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
     frame.setResizable(false); 


    } 
    static String selectPhrase() 
    { 
     String currentGuess = "*"; 
     int[] previousValues = new int[5]; 
     int totalRounds = 0; 
     //set isValid equal to false and creates a random number between 1 and 6 
     //(between 1 and 6 because previousValues is used to store the old numbers, 
     //and if between 0 and 5 were used, 0 would trip every time because an uninitialized 
     //array has 0's (null) in every position) 
     boolean isValid = false; 
     int index = (int)(Math.random() * 5 + 1); 

     //enters loop because isValid is false, so !isValid is true 
     while(!isValid) 
     { 
      //sets isValid equal to true, so if it never gets changed during the loop, it will exit next time around 
      isValid = true; 
      for(int i = 0; i < totalRounds; i++) 
      { 
       //if the randomly generated value is one of the previous ones, make isValid false 
       if(index == previousValues[i]) 
       { 
        isValid = false; 
       } 
      } 

      //if isValid is false, create a new random number between 1 and 6 
      if(!isValid) 
      { 
       index = (int)(Math.random() * 5 + 1); 
      } 
     } 

     //once a value that's never been used before is created, save it in previousValues 
     //so that it is not used again 
     previousValues[totalRounds] = index; 
     totalRounds++; 

     //return phrase at the index of the random number 
     String[] phrase = {"NULL", "Go Team", "Hello World" , "Java Rocks", "Bread Bowl" , "Soup"}; 
     return phrase[index]; 


     for(int i=0; i<phrase.length; i++) { 
      currentGuess = currentGuess.concat("?"); 
     } 
     .setText(currentGuess); 

    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 

    } 
} 

class HangmanGraphics extends JPanel { 

    JPanel graphicsPanel = new JPanel(); 

    int incorrectGuesses =0; 

    @Override 
    public void paintComponent(Graphics g){ 

     super.paintComponent(g); 
     Graphics2D g2D = (Graphics2D) g; 
     BasicStroke aStroke = new BasicStroke(15.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND); 
     g2D.setStroke(aStroke); 
     g2D.setColor(Color.BLUE); 

     switch (incorrectGuesses) { 
      case 10: 
       g2D.drawLine(200, 200, 150, 250); // Left leg 
      case 9: 
       g2D.drawLine(200, 200, 250, 250); // Right leg 
      case 8: 
       g2D.drawLine(150, 150, 200, 175); // Left arm 
      case 7: 
       g2D.drawLine(250, 150, 200, 175); // Right arm 
      case 6: 
       g2D.drawLine(200, 200, 200, 150); // Torso 
      case 5: 
       g2D.drawOval(175, 100, 50, 50); // Head 
      case 4: 
       g2D.drawLine(200, 100, 200, 50);// Noose 
      case 3: 
       g2D.drawLine(200, 50, 100, 50);//Plank 
      case 2: 
       g2D.drawLine(100, 300, 100, 50); //Post 
      case 1: 
       g2D.drawLine(20, 300, 300, 300); //Stage 
     } 

     repaint(); 

     graphicsPanel.add(new HangmanGraphics()); 

    } 


} 

Antwort

1

Ihre Frage, die viele, wenn nicht die meisten neuen Entwickler gemeinsam ist, ist die über den Einsatz von static und ein Mangel an Verständnis der objektorientierten Programmierung und wie Objekte zu verwenden. In Ihrem Fall versuchen Sie, eine Hauptmethode innerhalb eines JFrame Objekttyps (HangmanGame) zu erstellen, und dann haben Sie eine statische Methode, die Sie aufrufen möchten, in der Regel, weil Sie versuchen, herauszufinden, wie Sie es von der static main Methode aufrufen. Sie sollten besser eine separate "Treiber" -Klasse für HangManGame erstellen, die die Hauptmethode enthält. Die Klasse HangManGame erstellt dann eine Instanz eines HangManFrame (Aufrufe new HangManFrame()).

Die 2 wichtige Punkte zu beachten sind:

1) In der Hauptmechanismus, eine Instanz der Klasse erstellen, die die Haupt in definiert ist, dann Methoden aufrufen, auf das Objekt. Auf diese Weise müssen Sie nicht eine Reihe von statischen Methoden deklarieren und vermeiden so viele Schmerzen, wie Sie es jetzt erleben. Zum Beispiel, hier ist eine Definition der HangManGame Klasse:

package hangman; 

public class HangManGame { 
    HangManFrame frame; 

    public HangManGame(){ 
     frame = new HangManFrame(); 
    } 

    public void play() { 
     frame.setVisible(true); 
     String selectedPhrase = selectPhrase(); 
     System.out.println("Selected phrase: " + selectedPhrase); 
    } 

    public String selectPhrase() { 
     String currentGuess = "*"; 
     int[] previousValues = new int[5]; 
     int totalRounds = 0; 
     //set isValid equal to false and creates a random number between 1 and 6 
     //(between 1 and 6 because previousValues is used to store the old numbers, 
     //and if between 0 and 5 were used, 0 would trip every time because an uninitialized 
     //array has 0's (null) in every position) 
     boolean isValid = false; 
     int index = (int)(Math.random() * 5 + 1); 

     //enters loop because isValid is false, so !isValid is true 
     while(!isValid) 
     { 
      //sets isValid equal to true, so if it never gets changed during the loop, it will exit next time around 
      isValid = true; 
      for(int i = 0; i < totalRounds; i++) 
      { 
       //if the randomly generated value is one of the previous ones, make isValid false 
       if(index == previousValues[i]) 
       { 
        isValid = false; 
       } 
      } 

      //if isValid is false, create a new random number between 1 and 6 
      if(!isValid) 
      { 
       index = (int)(Math.random() * 5 + 1); 
      } 
     } 

     //once a value that's never been used before is created, save it in previousValues 
     //so that it is not used again 
     previousValues[totalRounds] = index; 
     totalRounds++; 

     //return phrase at the index of the random number 
     String[] phrase = {"NULL", "Go Team", "Hello World" , "Java Rocks", "Bread Bowl" , "Soup"}; 
     return phrase[index]; 
    } 

    public static void main(String[] args) { 
     HangManGame game = new HangManGame(); 
     game.play(); 
    } 
} 

Beachten Sie, dass die einzige Aufgabe führt die wichtigste Methode ist eine Instanz der Klasse HangManGame und rufen Sie die play() Methode auf, dass zu erstellen object..that es ist!

Beachten Sie auch, dass die selectPhrase()-Methode nicht als statisch deklariert wird, da dies nicht erforderlich ist.

2) Für alle Ihre Klassen müssen Objekte, auf die Sie Zugriff haben müssen und Methoden aufrufen können, außerhalb von Methoden als 'Klassenweite Instanzvariablen' deklariert werden. Beachten Sie zum Beispiel, wie die HangManFrame innerhalb der HangManGame Klasse deklariert ist, aber außerhalb der Methoden. Dann wird der Rahmen erstellt und innerhalb des Konstruktors zugewiesen für `HangManGame

public class HangManGame { 
    HangManFrame frame; 

    public HangManGame(){ 
     frame = new HangManFrame(); 
    } 
... 
} 

dies tun können Sie Methoden auf dem Rahmen rufen aus einem der HangManGame Methoden.

Ich habe Refactoring leicht Ihre HangManFrame und HangManGraphics Klasse, ähnlich stategies folgenden, unten enthalten.

Schließlich sollten Sie beginnen, andere Methoden auf der HangManGame Klasse zu erstellen, vielleicht wie nextMove() oder updateBoard() oder was auch immer, die durch und riefen aus dem play() Verfahren angetrieben werden.

HangManFrame Klasse:

Paket Henker;

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class HangManFrame extends JFrame implements ActionListener { 
    JPanel lettersPanel; 

    public HangManFrame() { 
     lettersPanel = new JPanel(new GridLayout(5, 8, 5, 5)); 

     JButton jbtA = new JButton("A"); 
     JButton jbtB = new JButton("B"); 
     JButton jbtC = new JButton("C"); 
     JButton jbtD = new JButton("D"); 
     JButton jbtE = new JButton("E"); 
     JButton jbtF = new JButton("F"); 
     JButton jbtG = new JButton("G"); 
     JButton jbtH = new JButton("H"); 
     JButton jbtI = new JButton("I"); 
     JButton jbtJ = new JButton("J"); 
     JButton jbtK = new JButton("K"); 
     JButton jbtL = new JButton("L"); 
     JButton jbtM = new JButton("M"); 
     JButton jbtN = new JButton("N"); 
     JButton jbtO = new JButton("O"); 
     JButton jbtP = new JButton("P"); 
     JButton jbtQ = new JButton("Q"); 
     JButton jbtR = new JButton("R"); 
     JButton jbtS = new JButton("S"); 
     JButton jbtT = new JButton("T"); 
     JButton jbtU = new JButton("U"); 
     JButton jbtV = new JButton("V"); 
     JButton jbtW = new JButton("W"); 
     JButton jbtX = new JButton("X"); 
     JButton jbtY = new JButton("Y"); 
     JButton jbtZ = new JButton("Z"); 

     lettersPanel.add(jbtA); 
     lettersPanel.add(jbtB); 
     lettersPanel.add(jbtC); 
     lettersPanel.add(jbtD); 
     lettersPanel.add(jbtE); 
     lettersPanel.add(jbtF); 
     lettersPanel.add(jbtG); 
     lettersPanel.add(jbtH); 
     lettersPanel.add(jbtI); 
     lettersPanel.add(jbtJ); 
     lettersPanel.add(jbtK); 
     lettersPanel.add(jbtL); 
     lettersPanel.add(jbtM); 
     lettersPanel.add(jbtN); 
     lettersPanel.add(jbtO); 
     lettersPanel.add(jbtP); 
     lettersPanel.add(jbtQ); 
     lettersPanel.add(jbtR); 
     lettersPanel.add(jbtS); 
     lettersPanel.add(jbtT); 
     lettersPanel.add(jbtU); 
     lettersPanel.add(jbtV); 
     lettersPanel.add(jbtW); 
     lettersPanel.add(jbtX); 
     lettersPanel.add(jbtY); 
     lettersPanel.add(jbtZ); 

     JPanel mainPanel = new JPanel(new BorderLayout()); 
     setLayout(new GridLayout(2, 2, 5, 5)); 

     mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 
     mainPanel.add(lettersPanel, BorderLayout.EAST); 
     mainPanel.setBackground(Color.BLACK); 

     add(mainPanel, BorderLayout.CENTER); 
     add(new HangmanGraphics()); 
     setTitle("Hangman"); 
     setSize(1020, 800); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setResizable(false); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("Received actionPerformed event: " + e.getActionCommand()); 
    } 
} 

HangManGraphics Klasse:

Paket Henker;

importieren Sie javax.swing.; Import java.awt.;

Klasse HangmanGraphics erstreckt JPanel {

JPanel graphicsPanel = new JPanel(); 

int incorrectGuesses =0; 

@Override 
public void paintComponent(Graphics g){ 

    super.paintComponent(g); 
    Graphics2D g2D = (Graphics2D) g; 
    BasicStroke aStroke = new BasicStroke(15.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND); 
    g2D.setStroke(aStroke); 
    g2D.setColor(Color.BLUE); 

    switch (incorrectGuesses) { 
     case 10: 
      g2D.drawLine(200, 200, 150, 250); // Left leg 
     case 9: 
      g2D.drawLine(200, 200, 250, 250); // Right leg 
     case 8: 
      g2D.drawLine(150, 150, 200, 175); // Left arm 
     case 7: 
      g2D.drawLine(250, 150, 200, 175); // Right arm 
     case 6: 
      g2D.drawLine(200, 200, 200, 150); // Torso 
     case 5: 
      g2D.drawOval(175, 100, 50, 50); // Head 
     case 4: 
      g2D.drawLine(200, 100, 200, 50);// Noose 
     case 3: 
      g2D.drawLine(200, 50, 100, 50);//Plank 
     case 2: 
      g2D.drawLine(100, 300, 100, 50); //Post 
     case 1: 
      g2D.drawLine(20, 300, 300, 300); //Stage 
    } 

    repaint(); 

    graphicsPanel.add(new HangmanGraphics()); 

} 

}

Verwandte Themen