0

我正在创建一个 6x6 网格记忆游戏。它的要求是使用面板中的图像作为按钮的替代品。

在此处输入图像描述210×70

该项目需要在以下条件下实现 MouseListeners: 按钮将显示第一个 pokebell。当鼠标悬停在精灵球上时,它会变成第二个精灵球。当鼠标离开精灵球时,它会恢复到第一个精灵球。当鼠标点击精灵球时,它会变成第三个精灵球。

网格鼠标事件

 public void mouseEntered(MouseEvent e) {
    for(i = 0; i < 36; i++){        
        if(e.getSource() == pkm[i]){                
                pkb[i].repaint();                       
        }
    }
}

public void mouseExited(MouseEvent e) {   
    for(i = 0; i < 36; i++){
        if(e.getSource() == pkm[i]){
                pkb[i].repaint();           
        }
    }  
}

精灵球类

int start = 0;
int ht = 0, wt = 0;
URL url;
BufferedImage img, sp1;

public PokeBall(String imgLink, int w, int h, int x){
wt = w;
ht = h;
start = x;
url = this.getClass().getResource(imgLink);     
    try{   
        img = ImageIO.read(url);
    }
    catch(Exception e){         
    }
}


public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D)g;

    sp1 = img.getSubimage(start, 0, wt, ht);  
    g2d.drawImage(sp1,20,10,null);

    if(start == 70) {
        start = 0;
    } 
    else {
        start += 70;
    }           
} 

我的想法是精灵的变化将在相应的鼠标事件上被调用,但是即使鼠标没有调用任何事件,我也让整个 pokeball 在无限循环中进行动画处理。

我需要一些关于如何阻止它自行循环并实际调用指定 pokeball 的想法或建议。

4

2 回答 2

0

基本上,绘制球的责任是类,它需要知道状态何时发生变化,因此对它应用andPokeBall是有意义的。然后你就不需要关心尝试更新网格位置和其他有趣的东西了。MouseListenerMouseMotionListener

在你的 上GridPane,我会附加另一个MouseListener,这样你就可以检测到何时点击球并在那里采取适当的行动......

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class MyPokeBalls {

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

    public MyPokeBalls() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new PokeBall());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class PokeBall extends JPanel {

        private BufferedImage balls;
        private int ballWidth = 70;
        private int ballHeight = 70;
        private int ballOffset = 0;

        public PokeBall() {
            try {
                balls = ImageIO.read(new File("PokeBalls.png"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }

            MouseAdapter ma = new MouseAdapter() {

                private boolean isIn = false;

                @Override
                public void mouseEntered(MouseEvent e) {
                    ballOffset = 1;
                    isIn = true;
                    repaint();
                }

                @Override
                public void mouseExited(MouseEvent e) {
                    ballOffset = 0;
                    isIn = true;
                    repaint();
                }

                @Override
                public void mousePressed(MouseEvent e) {
                    ballOffset = 2;
                    repaint();
                }

                @Override
                public void mouseReleased(MouseEvent e) {
                    if (isIn) {
                        ballOffset = 1;
                    } else {
                        ballOffset = 2;
                    }
                    repaint();
                }

            };

            addMouseListener(ma);
            addMouseMotionListener(ma);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(ballWidth, ballHeight);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (balls != null) {
                Graphics2D g2d = (Graphics2D) g.create();
                BufferedImage ball = balls.getSubimage(ballWidth * ballOffset, 0, ballWidth, ballHeight);
                int x = (getWidth() - ball.getWidth()) / 2;
                int y = (getHeight() - ball.getHeight()) / 2;
                g2d.drawImage(ball, x, y, this);
                g2d.dispose();
            }
        }
    }
}
于 2013-09-24T07:35:22.957 回答
0
AbstractButton b=new JToggleButton(firstIcon);
b.setContentAreaFilled(false);
b.setFocusable(false);
b.setBorder(BorderFactory.createEmptyBorder());
b.setRolloverEnabled(true);
b.setRolloverIcon(secondIcon);
b.setSelectedIcon(thirdIcon);

为什么要重新发明轮子?

创建这样的按钮网格非常简单……</p>

于 2013-09-24T07:45:03.667 回答