【问题标题】:How To Scramble Image in Java如何在 Java 中打乱图像
【发布时间】:2015-07-16 01:31:25
【问题描述】:

我从http://zetcode.com/tutorials/javagamestutorial/puzzle/ 找到了这个源代码 我想玩弄它。这是一个图片益智游戏,但是当我运行程序时,它并没有显示为乱码,我想知道我将如何解决这个问题才能让它乱码?我还是编程新手,我只是想玩这个来学习一点。谢谢!

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;

import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class Puzzle extends JFrame implements ActionListener {

private JPanel centerPanel;
private JButton button;
private JLabel label;
private Image source;
private Image image;
int[][] pos;
int width, height;

public Puzzle() {

    pos = new int[][] {
                        {0, 1, 2}, 
                        {3, 4, 5}, 
                        {6, 7, 8}, 
                        {9, 10, 11}
                    };


    centerPanel = new JPanel();
    centerPanel.setLayout(new GridLayout(4, 4, 0, 0));

    ImageIcon sid = new ImageIcon(Puzzle.class.getResource("icesid.jpg"));
    source = sid.getImage();

    width = sid.getIconWidth();
    height = sid.getIconHeight();


    add(Box.createRigidArea(new Dimension(0, 5)), BorderLayout.NORTH);    
    add(centerPanel, BorderLayout.CENTER);


    for ( int i = 0; i < 4; i++) {
        for ( int j = 0; j < 3; j++) {
            if ( j == 2 && i == 3) {
                label = new JLabel("");
                centerPanel.add(label);
            } else {
                button = new JButton();
                button.addActionListener(this);
                centerPanel.add(button);
                image = createImage(new FilteredImageSource(source.getSource(),
                    new CropImageFilter(j*width/3, i*height/4, 
                        (width/3)+1, height/4)));
                button.setIcon(new ImageIcon(image));
            }
        }
    }

    setSize(325, 275);
    setTitle("Puzzle");
    setResizable(false);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    setVisible(true);
}


public static void main(String[] args) {

    new Puzzle();

}

public void actionPerformed(ActionEvent e) {
    JButton button = (JButton) e.getSource();
    Dimension size = button.getSize();

    int labelX = label.getX();
    int labelY = label.getY();
    int buttonX = button.getX();
    int buttonY = button.getY();
    int buttonPosX = buttonX / size.width;
    int buttonPosY = buttonY / size.height;
    int buttonIndex = pos[buttonPosY][buttonPosX];



    if (labelX == buttonX && (labelY - buttonY) == size.height ) {

         int labelIndex = buttonIndex + 3;

         centerPanel.remove(buttonIndex);
         centerPanel.add(label, buttonIndex);
         centerPanel.add(button,labelIndex);
         centerPanel.validate();
    }

    if (labelX == buttonX && (labelY - buttonY) == -size.height ) {

         int labelIndex = buttonIndex - 3;
         centerPanel.remove(labelIndex);
         centerPanel.add(button,labelIndex);
         centerPanel.add(label, buttonIndex);
         centerPanel.validate();
    }

    if (labelY == buttonY && (labelX - buttonX) == size.width ) {

         int labelIndex = buttonIndex + 1;

         centerPanel.remove(buttonIndex);
         centerPanel.add(label, buttonIndex);
         centerPanel.add(button,labelIndex);
         centerPanel.validate();
    }

    if (labelY == buttonY && (labelX - buttonX) == -size.width ) {

         int labelIndex = buttonIndex - 1;

         centerPanel.remove(buttonIndex);
         centerPanel.add(label, labelIndex);
         centerPanel.add(button,labelIndex);
         centerPanel.validate();
    }
}
}

【问题讨论】:

    标签: java image swing puzzle scramble


    【解决方案1】:
    1. 创建每个Icon 并将Icon 添加到ArrayList
    2. 那么就可以使用Collections.shuffle(...)方法了
    3. 然后遍历改组的ArrayList 并创建您的按钮,将图标添加到每个按钮。

    编辑:

    显示概念的简单示例:

    import java.awt.*;
    import java.util.*;
    import javax.swing.*;
    
    public class SSCCE extends JPanel
    {
        public SSCCE()
        {
            setLayout( new GridLayout(3, 4) );
    
            ArrayList<Integer> numbers = new ArrayList<Integer>();
    
            for (int i = 0; i < 12; i++)
                numbers.add( new Integer(i) );
    
            Collections.shuffle(numbers);
    
            for (int i = 0; i < 12; i++)
                add( new JLabel( "" + numbers.get(i) ) );
        }
    
        private static void createAndShowGUI()
        {
            JFrame frame = new JFrame("SSCCE");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new SSCCE());
            frame.setLocationByPlatform( true );
            frame.setSize(300, 300);
            frame.setVisible( true );
        }
    
        public static void main(String[] args)
        {
            EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    createAndShowGUI();
                }
            });
        }
    }
    

    【讨论】:

    • 您好,谢谢您的建议。你能给我一个如何编码的例子吗?
    • @James,您已经拥有了大部分代码。唯一新的是 Collections.shuffle(...) ,这是一个单一的声明。您需要创建两个循环,而不是一个循环。您还需要一个 ArrayList 来临时保存 12 个图标。第一个循环从图像创建图标。第二个循环使用图标创建按钮。试一试,如果您有问题,请提出具体问题。如果你不尝试,你就不会学习。
    • 私有 ArrayList ImgIcon = new ArrayList();件=新的ArrayList(); for (int i=0; i
    • 1) 是的,这就是您创建循环的方式。 2) 不,这不是您创建 ArrayList 的方式。我建议您需要 ArrayList 包含 Icons,而不是整数。如果您需要更多帮助,请在问题中发布您更新的代码,而不是在评论中。我们无法阅读注释部分的代码,因为它没有格式化。
    • 我不知道您在做什么,也不知道您对我的建议有什么困惑?您还没有发布任何代码来显示您尝试过的内容。当您在理解某个概念时遇到问题时,请创建SSCCE 以简化概念并忘记真正的程序。我发布了一个简单的SSCCE,展示了我所描述的概念。它包含 2 个循环和一个 shuffle 语句。您的代码将基本相同,只是您的 ArrayLIst 将包含图标而不是整数。
    猜你喜欢
    • 2017-10-31
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 2015-11-20
    • 2018-10-18
    • 2021-11-08
    • 1970-01-01
    • 2018-08-17
    相关资源
    最近更新 更多