2016-04-04 1 views
0

基本的に、私はすべてのコードをメインメソッドで引き出しました。私は開始メニューを作ろうとしているので、メソッド(名前はdrawMenuという名前)を持つことができ、チック・タック・トゥ・ボタンを描くことができます。作成したメソッドの外にあるボタンを描画しますか?

この短いメソッドの外に、このdrawMenuメソッドでボタンを描画するにはどうすればよいですか?

package myClass; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.util.HashMap; 
import java.util.Map; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.tools.ToolProvider; 

public class mainClass { 


    //Boolean switcher for playing/not 


    //Create panel sides for action listeners 
    enum ESide { 
       tleft, tmid, tright, 
       mleft, mmid, mright, 
       bleft, bmid, bright, 
      }; 

public static void main(String[] args) { 

    //Objects 

    //create window 
    JFrame mainWindow = new JFrame("Tic Tac Toe"); 
    //properties of mainWindow 
    mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    mainWindow.setSize(600, 600); // buttons will fill entirely, 200x200  buttons 
    mainWindow.setLayout(new GridLayout(3, 3)); 

    //create buttons 
    JButton startButton = new JButton("Start"); 
    JButton topLeft = new JButton(""); 
    JButton topMid = new JButton(""); 
    JButton topRight = new JButton(""); 
    JButton midLeft = new JButton(""); 
    JButton midMid = new JButton(""); 
    JButton midRight = new JButton(""); 
    JButton botLeft = new JButton(""); 
    JButton botMid = new JButton(""); 
    JButton botRight = new JButton(""); 

    //Definitions 
    final Map<ESide, Boolean> board = new HashMap<>(); 
    for (ESide side : ESide.values()) { 
     board.put(side, false); 
    } 
    //Dimensions 
    Dimension selectionButtonSize = new Dimension(100,25); 
    Dimension buttonSize = new Dimension(200,200); 

    //Action listener 

topLeft.addMouseListener(new java.awt.event.MouseAdapter() { 
     public void mouseClicked(java.awt.event.MouseEvent evt) 
     { 
      if (board.get(ESide.tleft).booleanValue() == false) { 
       topLeft.setText("X"); 
       board.put(ESide.tleft, true); 
      } 
     } 

    }); 

topMid.addMouseListener(new java.awt.event.MouseAdapter() { 
     public void mouseClicked(java.awt.event.MouseEvent evt) 
     { 
      if (board.get(ESide.tmid).booleanValue() == false) { 
       topMid.setText("X"); 
       board.put(ESide.tmid, true); 
      } 
     } 

    }); 

topRight.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) 
       { 
        if (board.get(ESide.tright).booleanValue() == false) { 
         topRight.setText("X"); 
         board.put(ESide.tright, true); 
        } 
       } 

    }); 

midLeft.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) 
       { 
        if (board.get(ESide.mleft).booleanValue() == false) { 
         midLeft.setText("X"); 
         board.put(ESide.mleft, true); 
        } 
       } 

    }); 

midMid.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) 
       { 
        if (board.get(ESide.mmid).booleanValue() == false) { 
         midMid.setText("X"); 
         board.put(ESide.mmid, true); 
        } 
       } 

    }); 

midRight.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) 
       { 
        if (board.get(ESide.mright).booleanValue() == false) { 
         midRight.setText("X"); 
         board.put(ESide.mright, true); 
        } 
       } 

    }); 

botLeft.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) 
       { 
        if (board.get(ESide.bleft).booleanValue() == false) { 
         botLeft.setText("X"); 
         board.put(ESide.bleft, true); 
        } 
       } 

    }); 

botMid.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) 
       { 
        if (board.get(ESide.bmid).booleanValue() == false) { 
         botMid.setText("X"); 
         board.put(ESide.bmid, true); 
        } 
       } 

    }); 

botRight.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) 
       { 
        if (board.get(ESide.bright).booleanValue() == false) { 
         botRight.setText("X"); 
         board.put(ESide.bright, true); 
        } 
       } 

    }); 



drawMenu(); 
mainWindow.setVisible(true); // draw it 



} 

public static void drawMenu() { 
    System.out.println("Drawing menu button"); 
    //I want to be able to access the buttons to draw them here. 

} 

} 
+0

「メイン」の外に参照を保持します。 – Mordechai

答えて

3

提案:あなたが現在それを持っている主な方法のうちすべてを取得します。

静的でないインスタンスのJButtonフィールドと必要なその他のフィールドを持つOOP準拠のクラスを作成し、このクラスのコンストラクタでGUIを作成し、mainメソッドを使用してこのクラスのインスタンスを作成し、それをJFrameに配置し(JPanelの場合)、それを可視に設定します。ここでの重要な概念は、オブジェクト指向の技術を使用することです。なぜなら、Javaはオブジェクト指向のプログラミング言語の第一であり、そうすることによって、現在の、そして特に将来の複雑さを減らすことができます。例えば

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class SimpleTicTacToe extends JPanel { 
    private static final int SIDE = 3; 
    private static final float BTN_FONT_SIZE = 64f; 
    public static final Color X_COLOR = Color.RED; 
    public static final Color O_COLOR = Color.BLUE; 
    private boolean xTurn = true; 
    private JButton[][] buttonGrid = new JButton[SIDE][SIDE]; 

    public SimpleTicTacToe() { 
     JPanel btnPanel = new JPanel(new GridLayout(SIDE, SIDE)); 
     for (int i = 0; i < buttonGrid.length; i++) { 
      for (int j = 0; j < buttonGrid[i].length; j++) { 
       buttonGrid[i][j] = new JButton(new TicTacToeBtnAction()); 
       buttonGrid[i][j].setFont(buttonGrid[i][j].getFont().deriveFont(Font.BOLD, BTN_FONT_SIZE)); 
       btnPanel.add(buttonGrid[i][j]); 
      } 
     } 

     JPanel bottomPanel = new JPanel(); 
     bottomPanel.add(new JButton(new ResetAction("Reset", KeyEvent.VK_R))); 

     setLayout(new BorderLayout()); 
     add(btnPanel, BorderLayout.CENTER); 
     add(bottomPanel, BorderLayout.PAGE_END); 
    } 

    class TicTacToeBtnAction extends AbstractAction { 
     public TicTacToeBtnAction() { 
      super(" "); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      JButton btn = (JButton) e.getSource(); 
      String btnText = btn.getText().trim(); 
      if (!btnText.isEmpty()) { 
       return; 
      } 
      if (xTurn) { 
       btn.setForeground(X_COLOR); 
       btn.setText("X"); 
      } else { 
       btn.setForeground(O_COLOR); 
       btn.setText("O"); 
      } 
      xTurn = !xTurn; 
     } 
    } 

    private class ResetAction extends AbstractAction { 
     public ResetAction(String name, int mnemonic) { 
      super(name); 
      putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      for (JButton[] jButtons : buttonGrid) { 
       for (JButton jButton : jButtons) { 
        jButton.setText(""); 
       } 
      } 
      xTurn = true; 
     } 
    } 

    private static void createAndShowGui() { 
     SimpleTicTacToe mainPanel = new SimpleTicTacToe(); 

     JFrame frame = new JFrame("Tic Tac Toe"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> { 
      createAndShowGui(); 
     }); 
    } 
} 

そして、はい、FredKが示唆するように - (上記実証されたように)スイングイベントスレッド上のすべてのSwingアプリケーションを起動してください。

+1

また、イベントディスパッチスレッド – FredK

+0

のGUI操作をすべて行う必要があります。これは完全に動作します。ヒントとポインタをありがとうございます。私は文字通り、基本的に何もないから数日前にJavaを開始したので、この種の考え方は仕事をするときに非常に便利です。私が知っているもの以外のグーグル・コードの習慣を身に付け、Javaについてもっと学ぶための良いスタート・チュートリアルが分かっていれば、私は非常に感謝しています。 –

関連する問題