2016-04-04 4 views
0

В принципе, я рисовал и имел весь свой код в основном методе. Я пытаюсь создать начальное меню, поэтому хочу иметь способ (с именем drawMenu), который я могу запустить, чтобы вытащить кнопки tic-tac-toe.Рисование кнопок за пределами метода, в котором они были сделаны?

Более короткое объяснение, как рисовать кнопки вне этого основного метода в этом методе 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

Предложение: получить все из основного метода, который в настоящее время есть в нем.

Вместо этого создайте класс, совместимый с ООП, который имеет нестатические поля JButton экземпляра, а также любые другие поля, которые вам нужны, создайте графический интерфейс в конструкторе этого класса и используйте основной метод, чтобы просто создать экземпляр этого класса, поместите его в 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

Это прекрасно работает, спасибо за советы и указатели. Я буквально запустил java пару дней назад из практически ничего, поэтому этот вид мышления при выполнении работы очень полезен. Если вы знакомы с хорошими учебными пособиями для начинающих, чтобы помочь мне привыкнуть к более аккуратным кодам и узнать больше о Java, кроме того, что я не знаю, я буду очень благодарен. –

Смежные вопросы