【问题标题】:Sliding Puzzle Java Shuffle issue滑动拼图 Java Shuffle 问题
【发布时间】:2014-04-07 02:14:11
【问题描述】:

当您单击随机播放按钮时,我正在尝试随机播放 15 块滑动拼图的碎片。不幸的是,我不知道如何“抓取” JPanel 按钮,因为它们是动态的并且不会“传递”给 Action Listener: 这是我创建和添加按钮的 for 循环:

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


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

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

    int counter = 0;
    for ( int i = 0; i < 4; i++) {
        for ( int j = 0; j < 4; j++) {
            if ( j == 3 && i == 3) {
                label = new JLabel("");
                centerPanel.add(label); // EMPTY LABEL
            } else {
                counter++;
                button = new JButton();
                button.setText(String.valueOf(counter));
                button.addActionListener(this);
                centerPanel.add(button);

            }
        }
    }

然后我添加随机播放按钮:

    southPanel = new JPanel(new FlowLayout());
    JButton shuffleButton = new JButton("Shuffle");
    southPanel.add(shuffleButton);
    shuffleButton.addActionListener(this);

然后这是随机播放代码我有 4 个随机移动到目前为止我有(我知道这很糟糕,我不知道更好)。它移动标签但按顺序按下所有按钮:(

     public void actionPerformed(ActionEvent e) {

    //GET EMPTY LABEL LOCATION
            int labelX = label.getX();
    int labelY = label.getY();

    int labelPosX = labelX / sizeLabel.width;
    int labelPosY = labelY / sizeLabel.height;

    int labelIndex = pos[labelPosX][labelPosY];


                         // GET button location
            buttonX = label.getX() - size.width;
            buttonY = label.getY();

            // GET button position
            buttonPosX = buttonX / size.width;
            buttonPosY = buttonY / size.height;
            buttonIndex = pos[buttonPosY][buttonPosX];

            // IF LABEL can be moved
            if ((labelY == buttonY && (labelX - buttonX) == size.width )) {

                System.out.println("LABEL MOVES LEFT");
                labelIndex = buttonIndex + 1;

                centerPanel.add(label,buttonIndex);

                // HERE I NEED TO "GRAB BUTTON" AND PUT it 
                // IN LABEL INDEX ???

                labelY = label.getY();
                labelX = label.getX();

            }

任何帮助表示赞赏!我尝试使用 Component getComponent(int) 但我不知道如何实现它。我认为这样的事情会很完美......

【问题讨论】:

  • 将标签放入某种List。您可以随机播放列表并将标签重新应用于容器
  • 我并没有完全遵循您的所有代码,但在我看来,您可能想要button.setText(String.valueOf(pos[i][j])) 而不是button.setText(String.valueOf(counter)。然后,您可以在洗牌并填充 pos 后创建按钮并运行此循环。
  • Swing 组件布局后不应移动它们。您可以更改 JButton 中的文本以模拟它们的移动。
  • @GilbertLeBlanc 但我如何从 Shuffle Action Listener 中“获取/知道”标签?我只根据我的 ListArray 知道 buttonIndex
  • 你有一个 JButton 数组和一个字符串数组。更改字符串数组,然后将字符串数组覆盖在 JButton 数组上。您应该为磁贴可以移动的 4 个方向设置一个单独的动作侦听器。每个动作侦听器都会对字符串数组进行适当的更改。

标签: java swing jpanel jbutton actionlistener


【解决方案1】:

更多地依赖于维护对JLabels 的某种引用,然后尝试维护有关标签所载内容的信息。

例如,您可以简单地将JLabels 放入List 并打乱列表,删除标签并再次添加它们。

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Shuffle {

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

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

                final PuzzelPane puzzelPane = new PuzzelPane();
                JButton shuffle = new JButton("Shuffel");
                shuffle.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        puzzelPane.shuffle();
                    }
                });

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

    public class PuzzelPane extends JPanel {

        private List<JLabel> labels;

        public PuzzelPane() {
            setLayout(new GridLayout(3, 3));
            labels = new ArrayList<>(9);
            for (int index = 0; index < 9; index++) {
                JLabel label = new JLabel(String.valueOf(index));
                label.setHorizontalAlignment(JLabel.CENTER);
                labels.add(label);
            }
            shuffle();
        }

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

        public void shuffle() {
            removeAll();
            Collections.shuffle(labels);
            for (JLabel label : labels) {
                add(label);
            }
            revalidate();
        }
    }

}

同样的想法你也可以使用数组...

【讨论】:

  • 我正在尝试运行您的代码,但问题是我无法进行随机改组 - 我需要“手动”移动这些片段以确保有解决方案。另外-它们需要是按钮:(
  • “另外 - 他们需要是按钮” - 所以让他们成为按钮。您可以自己补充 shuffle 算法,重点是,您应该维护对组件的某种引用,以便在需要时可以访问它们
猜你喜欢
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多