使用独特的ImageIcons动态初始化JButton

时间:2014-02-22 18:29:26

标签: java dynamic jframe jpanel jbutton

这是我第一次尝试在Java中使用GUI布局。我正在尝试创建一个简单的记忆卡游戏,用户翻转两张牌,并试图获得一场比赛,如果没有匹配,他们会翻转,如果有匹配,他们会一直翻转,直到你得到所有的比赛。我可能会对自己造成困难,尽管我将整个游戏动态化为定义卡片列数和行数的构造函数变量。我认为这比硬编码某个值更好,但现在我无法将图像放入我的img文件夹中。

我理解Java和Java中不允许使用变量变量。这对我来说很难适应ColdFusion开发人员。你能帮我想一想用Java实现这个方法吗?

以下是我的代码的简化版本。

import javax.swing.JFrame;

public class MemoryApp
{
    public static void main(String args[])
    {
        //Creates a new game with 3 columns and 4 rows
        final CardGame myGame = new CardGame(3, 4);

        javax.swing.SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI(myGame.getCols(), myGame.getRows());
            }
        });
    }

    private static void createAndShowGUI(int c, int r) {
        //Create and set up the window.
        Window frame = new Window("GridLayoutDemo", c, r);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //Set up the content pane.
        frame.addComponentsToPane(frame.getContentPane());
        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }
}

纸牌游戏课程:

public class CardGame
{
    private int cols, rows;

    public CardGame(int c, int r)
    {
        cols = c;
        rows = r;
    }

    public int getCols(){
        return cols;
    }

    public int getRows(){
        return rows;
    }
}

具有网格布局的窗口:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSeparator;

public class Window extends JFrame
{
    private int cols, rows;
    GridLayout windowGrid = new GridLayout(1,1);

    public Window(String t, int c, int r)
    {
        super(t);
        cols = c;
        rows = r;
        windowGrid.setColumns(c);
        windowGrid.setRows(r);
    }

    public void addComponentsToPane(final Container pane)
    {
        final JPanel compsToExperiment = new JPanel();
        compsToExperiment.setLayout(windowGrid);
        JPanel controls = new JPanel();
        controls.setLayout(new GridLayout(cols,rows));

        int countCard = (cols * rows) / 2;

        /**
         * Add buttons to experiment with Grid Layout.
         * This is where I'd like to be able to loop through
         * countCard and create the required number of buttons
         * as well as put images on the buttons like so:
         * 
         * ImageIcon image1 = new ImageIcon(getClass().getResource("card1.png"));
         *  through
         * ImageIcon image1 = new ImageIcon(getClass().getResource("card" & cardCount & ".png"));
         * 
         * Below is how I would attempt this in ColdFusion- I know
         * the variable of variables syntax is invalid, it is just
         * to show you what I mean.
         */

        // for(int i = 0; i < countCard; i++;)
        // {    
        //      compsToExperiment.add(new JButton("../img/card" & i & ".png"));
        //      ImageIcon variables["image" & i] = new ImageIcon(getClass().getResource("card" & i & ".png"));
        //      imageButton.setIcon(variables["image" & i]);

        //      etc. with ButtonClickEventHandler, haven't gotten that far yet
        // }

        pane.add(compsToExperiment, BorderLayout.NORTH);
        pane.add(new JSeparator(), BorderLayout.CENTER);
    }
}

1 个答案:

答案 0 :(得分:1)

根据您目前发布的代码注释掉的代码,一种方法可能是这样的:

public class Window extends JFrame
{
    ...

    // A java.util.List that stores all the buttons, so
    // that their icons may be changed later
    private List<JButton> buttons = new ArrayList<JButton>();

    // A java.util.List that stores all the ImageIcons that
    // may be placed on the buttons
    private List<ImageIcon> imageIcons = new ArrayList<ImageIcon>();

    public void addComponentsToPane(final Container pane)
    {
        ...

        for(int i = 0; i < countCard; i++;)
        {    
            // String concatenation is done with "+" in Java, not with "&"
            String fileName = "card" + i + ".png";

            // Create the icon and the button containing the icon  
            ImageIcon imageIcon = new ImageIcon(getClass().getResource(fileName));
            JButton button = new JButton(imageIcon);

            // Add the button to the main panel
            compsToExperiment.add(button);

            // Store the button and the icon in the lists
            // for later retrieval
            imageIcons.add(imageIcon);
            buttons.add(button);

            // Attach an ActionListener to the button that will
            // be informed when the button was clicked.
            button.addActionListener(createActionListener(i));
        }
    }


    private ActionListener createActionListener(final int cardIndex) 
    {
        return new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                clickedCardButton(cardIndex);
            }
        };
    }

    private void clickedCardButton(int cardIndex)
    {
        System.out.println("Pressed button for card "+cardIndex);

        // Here you can change the icons of the buttons or so...
        JButton button = buttons.get(cardIndex);
        ImageIcon imageIcon = imageIcons.get(cardIndex);
        ....
    }

您提到这是您第一次尝试使用Java构建GUI。所以我认为这只是为了“练习”。如果你的目的是建立一个“真正的应用程序”,你应该考虑一些模型 - 视图 - 控制器(MVC)方法。