在 Swing 应用程序中使用方法
Using methods within Swing application
我正在创建我的第一个 Swing 应用程序 -> Tic Tac Toe。看了很多教程,还是没明白三点:
首先是:如何创建方法并在我的代码中使用它们(例如下面代码中的isWinner
方法)?我将它添加到 actionPerformed
但它仍然不起作用。我应该如何调用它才能使其实时工作?
第二个是:我不喜欢static
方法。我应该为 class 创建一个对象然后调用方法吗?
第三个是:我的isWinner
方法可以吗?或者我应该改变我尝试检查获胜者是否出现的方式?
我在网上看到了很多这样的内容和制作游戏的例子。
编辑
更改了 isWinner
方法。现在我从 actionPerformed
方法调用它。还是什么都不做...
package one.more.time;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
@SuppressWarnings("serial")
public class GameWindow extends JFrame implements ActionListener{
String player = "X";
JButton but[] = new JButton[9];
JLabel status = new JLabel("Start!");
public GameWindow() {
setLayout(new BorderLayout());
for (int i = 0; i < but.length; i++){
but[i] = new JButton(Integer.toString(i+1));
but[i].addActionListener(this);
}
JPanel gamePanel = new JPanel();
gamePanel.setLayout(new GridLayout(3, 3));
for (int i = 0; i < but.length; i++){
gamePanel.add(but[i]);
}
add(gamePanel, BorderLayout.CENTER);
add(status, BorderLayout.SOUTH);
setSize(new Dimension(300, 300));
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new GameWindow();
}
});
}
@Override
public void actionPerformed(ActionEvent e) {
JButton src = (JButton) e.getSource();
src.setActionCommand("player");
src.setText(player);
src.setEnabled(false);
if (isWinner(but, player)) {
System.exit(0);
};
}
boolean isWinner(JButton butt[], String player){
JButton but[] = butt;
for (int i = 0; i<3; i++){
if (but[i].getActionCommand().equals(but[i+3].getActionCommand()) &&
but[i+3].getActionCommand().equals(but[i+6].getActionCommand()) &&
but[i].getActionCommand().equals(but[i+6].getActionCommand()) &&
but[i].getActionCommand().equals(player))
{
return true;
}
}
for (int i = 0; i<9; i+=3)
if (but[i].getActionCommand().equals(but[i+1].getActionCommand()) &&
but[i+1].getActionCommand().equals(but[i+2].getActionCommand()) &&
but[i].getActionCommand().equals(but[i+2].getActionCommand()) &&
but[i].getActionCommand().equals(player))
{
return true;
}
if (but[0].getActionCommand().equals(but[4].getActionCommand()) &&
but[4].getActionCommand().equals(but[8].getActionCommand())&&
but[0].getActionCommand().equals(but[8].getActionCommand()) &&
but[0].getActionCommand().equals(player))
{
return true;
}
if (but[2].getActionCommand().equals(but[4].getActionCommand()) &&
but[4].getActionCommand().equals(but[6].getActionCommand()) &&
but[2].getActionCommand().equals(but[6].getActionCommand()) &&
but[2].getActionCommand().equals(player))
{
return true;
}
return false;
}
}
1-2。不要让 isWinner 静态化。这将允许您从 class 其他非静态方法内部调用它:例如 actionPerformed 方法。
but [I]==but [I+3]
- 您只需比较不同 JButton 的引用,这总是错误的。您需要比较他们身后的标记玩家:
but [I].getActionCommand().equals(but [I+3].getActionCommand());
编辑:
在 actionPerformed 方法中不要写 src.setActionCommand("player");
当然要替换为玩家的实际值: src.setActionCommand(player);
稍微干净一点的 isWinner 方法:
boolean isWinner(JButton buttons[], String player)
{
for (int i = 0; i < 3; i++)
{
if (buttons[i].getActionCommand().equals(player) &&
buttons[i + 3].getActionCommand().equals(player) &&
buttons[i + 6].getActionCommand().equals(player))
{
return true;
}
}
for (int i = 0; i < 9; i += 3)
if (buttons[i].getActionCommand().equals(player) &&
buttons[i + 1].getActionCommand().equals(player) &&
buttons[i + 2].getActionCommand().equals(player))
{
return true;
}
if (buttons[0].getActionCommand().equals(player) &&
buttons[4].getActionCommand().equals(player) &&
buttons[8].getActionCommand().equals(player))
{
return true;
}
return buttons[2].getActionCommand().equals(player) &&
buttons[4].getActionCommand().equals(player) &&
buttons[6].getActionCommand().equals(player);
}
我正在创建我的第一个 Swing 应用程序 -> Tic Tac Toe。看了很多教程,还是没明白三点:
首先是:如何创建方法并在我的代码中使用它们(例如下面代码中的isWinner
方法)?我将它添加到 actionPerformed
但它仍然不起作用。我应该如何调用它才能使其实时工作?
第二个是:我不喜欢static
方法。我应该为 class 创建一个对象然后调用方法吗?
第三个是:我的isWinner
方法可以吗?或者我应该改变我尝试检查获胜者是否出现的方式?
我在网上看到了很多这样的内容和制作游戏的例子。
编辑
更改了 isWinner
方法。现在我从 actionPerformed
方法调用它。还是什么都不做...
package one.more.time;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
@SuppressWarnings("serial")
public class GameWindow extends JFrame implements ActionListener{
String player = "X";
JButton but[] = new JButton[9];
JLabel status = new JLabel("Start!");
public GameWindow() {
setLayout(new BorderLayout());
for (int i = 0; i < but.length; i++){
but[i] = new JButton(Integer.toString(i+1));
but[i].addActionListener(this);
}
JPanel gamePanel = new JPanel();
gamePanel.setLayout(new GridLayout(3, 3));
for (int i = 0; i < but.length; i++){
gamePanel.add(but[i]);
}
add(gamePanel, BorderLayout.CENTER);
add(status, BorderLayout.SOUTH);
setSize(new Dimension(300, 300));
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new GameWindow();
}
});
}
@Override
public void actionPerformed(ActionEvent e) {
JButton src = (JButton) e.getSource();
src.setActionCommand("player");
src.setText(player);
src.setEnabled(false);
if (isWinner(but, player)) {
System.exit(0);
};
}
boolean isWinner(JButton butt[], String player){
JButton but[] = butt;
for (int i = 0; i<3; i++){
if (but[i].getActionCommand().equals(but[i+3].getActionCommand()) &&
but[i+3].getActionCommand().equals(but[i+6].getActionCommand()) &&
but[i].getActionCommand().equals(but[i+6].getActionCommand()) &&
but[i].getActionCommand().equals(player))
{
return true;
}
}
for (int i = 0; i<9; i+=3)
if (but[i].getActionCommand().equals(but[i+1].getActionCommand()) &&
but[i+1].getActionCommand().equals(but[i+2].getActionCommand()) &&
but[i].getActionCommand().equals(but[i+2].getActionCommand()) &&
but[i].getActionCommand().equals(player))
{
return true;
}
if (but[0].getActionCommand().equals(but[4].getActionCommand()) &&
but[4].getActionCommand().equals(but[8].getActionCommand())&&
but[0].getActionCommand().equals(but[8].getActionCommand()) &&
but[0].getActionCommand().equals(player))
{
return true;
}
if (but[2].getActionCommand().equals(but[4].getActionCommand()) &&
but[4].getActionCommand().equals(but[6].getActionCommand()) &&
but[2].getActionCommand().equals(but[6].getActionCommand()) &&
but[2].getActionCommand().equals(player))
{
return true;
}
return false;
}
}
1-2。不要让 isWinner 静态化。这将允许您从 class 其他非静态方法内部调用它:例如 actionPerformed 方法。
but [I]==but [I+3]
- 您只需比较不同 JButton 的引用,这总是错误的。您需要比较他们身后的标记玩家:but [I].getActionCommand().equals(but [I+3].getActionCommand());
编辑:
在 actionPerformed 方法中不要写 src.setActionCommand("player");
当然要替换为玩家的实际值: src.setActionCommand(player);
稍微干净一点的 isWinner 方法:
boolean isWinner(JButton buttons[], String player)
{
for (int i = 0; i < 3; i++)
{
if (buttons[i].getActionCommand().equals(player) &&
buttons[i + 3].getActionCommand().equals(player) &&
buttons[i + 6].getActionCommand().equals(player))
{
return true;
}
}
for (int i = 0; i < 9; i += 3)
if (buttons[i].getActionCommand().equals(player) &&
buttons[i + 1].getActionCommand().equals(player) &&
buttons[i + 2].getActionCommand().equals(player))
{
return true;
}
if (buttons[0].getActionCommand().equals(player) &&
buttons[4].getActionCommand().equals(player) &&
buttons[8].getActionCommand().equals(player))
{
return true;
}
return buttons[2].getActionCommand().equals(player) &&
buttons[4].getActionCommand().equals(player) &&
buttons[6].getActionCommand().equals(player);
}