2016-04-24 11 views
0

私のJavaクラス用のハングマンゲームを作成しようとしていますが、各クラスを一緒に動作させる方法に苦しんでいます。この場合、私のフレーズをselectPhraseメソッドからmainPanelに書き込もうとしています。私はプログラミングに非常に新しいので、どんな助けも非常に高く評価されるでしょう。 が別のクラスからJPanelを呼び出すのに問題があります

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()); 

    } 


} 

答えて

1

最も新しい開発者の多くに共通している場合ではないあなたの問題を、ありがとう、staticの過剰使用とオブジェクト指向プログラミング、そしてどのようにオブジェクトを使用するの理解の欠如があります。あなたのケースでは、JFrameタイプのオブジェクト(HangmanGame)内にメインメソッドを作成しようとしています。次に、static mainメソッドから呼び出す方法を理解しようとしているため、呼び出す静的メソッドがあります。メインメソッドを含むHangManGameの別の 'ドライバ'クラスを作成するほうがよいでしょう。 HangManGameクラスは、HangManFramenew HangManFrame()を呼び出します)のインスタンスを作成します。覚えておくべき

2の重要なポイントは以下のとおりです。

1)あなたの主な方法では、メインの中で定義されているクラスのインスタンスを作成し、そのオブジェクトのメソッドを呼び出します。これを行うことで、静的メソッドを宣言する必要はなく、今体験しているように多くの苦痛を避けることができます。例えば、ここでHangManGameクラスの定義です:mainメソッドが実行するタスクのみがHangManGameクラスのインスタンスを作成し、それだobject..thatその上play()メソッドを呼び出すことであることを

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(); 
    } 
} 

お知らせ!

また、selectPhrase()メソッドは、必須ではないため、static宣言されていません。

2)すべてのクラスについて、アクセスが必要でメソッドを呼び出す必要があるオブジェクトは、メソッドの外部で「クラス全体のインスタンス変数」として宣言する必要があります。たとえば、HangManFrameHangManGameクラス内ではなくメソッドの外で宣言されていることに注意してください。そして、フレームが作成され、あなたがHangManGameのいずれかの方法の中からフレーム上のメソッドを呼び出すことができるようになりますこれを行う

public class HangManGame { 
    HangManFrame frame; 

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

HangManGame `のコンストラクタの内部で割り当てられます。

私はあなたのHangManFrameクラスとHangManGraphicsクラスを、以下のような同様の状態で少しリファクタリングしました。

最後に、あなたは多分play()方法からで駆動し、呼ばれてnextMove()、またはupdateBoard()または何でも、同様に、HangManGameクラスに他のメソッドを作成するために開始する必要があります。

HangManFrameクラス:

パッケージ絞首刑執行人。

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クラス:

パッケージ絞首刑執行人。

import javax.swing。; import java.awt。;

クラスHangmanGraphicsの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()); 

} 

}

を拡張
関連する問題