新手的几个问题

时间:2011-12-09 16:10:12

标签: java jframe jbutton

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class CSE141HW5 implements ActionListener
{

    public static void main (String[] args)
    {
        new CSE141HW5();

    }


    /*  Instance Variables */

    private JFrame gameWindow = new JFrame ("Tic-Tac-Toe");
    private int [][] winningCombinations = new int[][] {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}, {0, 3, 6}, {1, 4, 7}, {2, 5, 8}, {0, 4, 8}, {2, 4, 6}};
    private JButton buttons[] = new JButton [9];
    private int count = 0;
    private String mark = "";
    private boolean win = false;

    public CSE141HW5()
    {

        /* Creating gameWindow */

        Container con = gameWindow.getContentPane();
        con.setBackground(Color.WHITE);

        gameWindow.setVisible (true);
        gameWindow.setSize (220,220);
        gameWindow.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        gameWindow.setLayout (new GridLayout (3, 3));
        gameWindow.setLocation (830, 400);
        gameWindow.setBackground(Color.WHITE);



        /* Adding Buttons */

        for (int i = 0; i <= 8; i++)
        {
            buttons[i] = new JButton ();
            gameWindow.add (buttons [i]);
            buttons[i].addActionListener (this);
            buttons[i].setBackground(Color.WHITE);

        }    


    }


    /* When an object clicked... */

    public void actionPerformed (ActionEvent click)
    {
        JButton pressedButton = (JButton)click.getSource();
        /* Whose turn? */

        if ((count % 2) == 0)
        {
            mark = "O";
            pressedButton.setBackground(Color.CYAN);
        }
        else
        {
            mark = "X";
            pressedButton.setBackground(Color.yellow);
        }


        /* Write the letter to the button and deactivate it */


        pressedButton.setText (mark);
        pressedButton.setEnabled (false);


        /* Determining that who won */

        for (int i = 0; i <= 7; i++)
        {
            if (buttons[winningCombinations[i][0]].getText().equals(buttons[winningCombinations[i][1]].getText()) 
                && buttons[winningCombinations[i][1]].getText().equals(buttons[winningCombinations[i][2]].getText()) 
                    && buttons[winningCombinations[i][0]].getText() != "") win = true;
        }


        /* Ending Dialog */

        if (win == true)
        {
            byte response = (byte) (JOptionPane.showConfirmDialog(null, mark + " won!\nPlay again?", "Homework 5", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE));
            if (response == 0) new CSE141HW5();
            else System.exit(0);
        }

        else if (count == 8  &&  win == false)
        {
            byte response = (byte) (JOptionPane.showConfirmDialog(null, "Draw!\nPlay again?", "Homework 5", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE));
            if (response == 0) new CSE141HW5();
            else System.exit(0);
        }

        count++;             
    }

}  

我是编程新手,并在java上编写了一个tic-tac-toe游戏。我想改进这个程序,但有些东西是我无法处理的。

  1. 我用默认颜色更改了按钮颜色,比如Color.yellow等。我如何使用更详细的颜色?

  2. 游戏结束时,程序要求重新播放。如果用户选择是,则会出现新的游戏窗口,但旧窗口仍然存在,我不喜欢。我希望关闭旧窗口,但无法找到如何实现它。

  3. 如果您在我的程序中找到任何您认为不必要的代码,或者如果您认为有比我更好的方式,请告诉我。所以我可以学习。

3 个答案:

答案 0 :(得分:1)

  1. 使用RGB颜色进行着色。它是红色,绿色和蓝色的组合。红色,绿色和蓝色的值范围为0到255.例如:对于红色,组合为(255,0,0)
  2. 您可以使用gameWindow.setVisible (false);

答案 1 :(得分:1)

如果要完全删除窗口,请使用dispose()函数。

答案 2 :(得分:1)

  

我用默认颜色更改了按钮颜色,比如Color.yellow等。我该如何使用更详细的颜色?

您可以使用自己的按钮,让我们说public class XButton extends JButton。要更好地自定义按钮,请覆盖方法public void paintComponent(Graphics g)。然后,您可以使用fillRect填充按钮的矩形,使用标准颜色将对象Graphics g投射到Graphics2D,然后设置对象{{1填充具有线性颜色渐变的形状。

GradientPaint()

结果如下图所示:

enter image description here

PS:在添加按钮的同时,用Xbutton代替JButton以及所有这些。

  

游戏结束时,程序要求重新播放。如果用户选择是,则会出现新的游戏窗口,但旧窗口仍然存在,我不喜欢。我希望关闭旧窗口,但无法找到如何实现它。

您只需在JFrame对象public class XButton extends JButton { public XButton() { super(); } public void paintComponent(Graphics g){ Graphics2D g2d = (Graphics2D)g; GradientPaint gp = new GradientPaint(0, 0, Color.RED, 30, 30, Color.cyan, true); g2d.setPaint(gp); g2d.fillRect(0, 0, this.getWidth(), this.getHeight()); } } 上使用dispose()方法,因此您的代码中应该放置两个位置:

gameWindow

有关How to programmatically close a JFrame

的详细信息
  

如果您在我的程序中找到任何您认为不必要的代码,或者如果您认为有比我更好的方式,请告诉我。所以我可以学习。

嗯,你的代码很好。如果你想改进它。 StackOverflow不适合这样做。你最好检查一下:codereview.stackexchange.com

我希望我回答你的问题。