2016-04-04 21 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

將引用保留在'main'之外。 – Mordechai

回答

3

建議:得到一切出主要方法,你現在有它。

相反,創建一個符合OOP的類,它具有非靜態實例JButton字段以及您需要的任何其他字段,在此類的構造函數中創建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事件線程上所有Swing應用程序(如上面所示)。

+1

此外,您還需要在事件調度線程上執行所有GUI操作 – FredK

+0

此功能完美,謝謝您的提示和指示。我幾天前從幾乎沒有任何事情開始就開始使用Java,所以在工作時這種心態非常有用。如果你知道任何優秀的初學者教程,以幫助我養成更整潔的代碼習慣,並學習更多關於Java的知識,除了使用我不知道的搜索引擎之外,我會非常感激。 –