これは私の初めてのJava Swingでの作業ですので、私のプログラムはあまり言い表せないほど混沌です。目標は、8つのパズルがイメージを取って9つのセクターに分け、そのうち8つを特定の順序(移動の場合はドロップ1)に配置することです。このプログラムは最初からうまく動作します。それが解決されたら、JButton
コンポーネントをランダム化して、もう一度解くことができます。ボタンはランダム化されていますが、移動させることはできません。どんな助けでも大歓迎です。8パズルの2回目の反復は機能していません
通常、問題があると思うコードを投稿しますが、コードが混乱しているため、クラス全体を投稿しています。
EDIT: 線でコードラインを通過した後、問題が発注()メソッド内にあるように見えます。 2番目の "if"ステートメントをすべて削除すると、プログラムは正常に動作し、コンポーネントをランダム化しません。 (私はその文の「もし他に」&「他」を使用した場合と同じ)
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
public class JEightPuzzleFrame extends JFrame implements ActionListener {
JButton[] buttons = new JButton[9];
JButton[][] format = new JButton[3][3];
JPanel puzzle = new JPanel();
JPanel jp = new JPanel();
String path = null;
int h;
int w;
public JEightPuzzleFrame(String Title, String Path) {
super();
path = Path;
add(puzzle);
makeFrame();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
setSize(w + 10, h + 10);
setTitle(Title);
setResizable(false);
jp.setVisible(true);
}
public void makeFrame() {
puzzle.setVisible(true);
puzzle.setBounds(100, 100, 612, 519);
makeBtnImg();
puzzle.setLayout(new GridLayout(3, 3));
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
puzzle.add(format[i][j]);
if (format[i][j] == buttons[8]) {
puzzle.remove(format[i][j]);
puzzle.add(jp);
}
}
}
}
public void makeBtnImg() {
try {
BufferedImage pic = ImageIO.read(new File(path));
jp.setSize(h, w);
h = pic.getHeight();
w = pic.getWidth();
int count = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
BufferedImage bimg = pic.getSubimage(i * w/3, j * h/3, w/3, h/3);
if (count < 9) {
buttons[count] = new JButton(new ImageIcon(bimg));
buttons[count].addActionListener(this);
}
count++;
}
}
order(true);
} catch (IOException e) {
}
}
public void order(boolean initial) {
if (initial == true) {
format[0][0] = buttons[8];
format[1][0] = buttons[4];
format[2][0] = buttons[1];
format[0][1] = buttons[0];
format[1][1] = buttons[7];
format[2][1] = buttons[2];
format[0][2] = buttons[3];
format[1][2] = buttons[6];
format[2][2] = buttons[5];
}
if (initial == false) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
int rd = (int) Math.random() * (9 - 0);
JButton temp = buttons[rd];
format[i][j] = temp;
}
}
}
refresh();
}
public void refresh() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
puzzle.remove(format[i][j]);
}
}
puzzle.remove(jp);
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
puzzle.add(format[i][j]);
if (format[i][j] == buttons[8]) {
puzzle.remove(format[i][j]);
puzzle.add(jp);
}
}
}
getContentPane().validate();
if (format[0][0] == buttons[0] && format[0][1] == buttons[3] && format[0][2] == buttons[6]
&& format[1][0] == buttons[1] && format[1][1] == buttons[4] && format[1][2] == buttons[7]
&& format[2][0] == buttons[2] && format[2][1] == buttons[5] && format[2][2] == buttons[8]) {
JOptionPane.showMessageDialog(null, "YOU WON!");
order(false);
}
}
@Override
public void actionPerformed(ActionEvent e) {
JButton temp;
JButton button = (JButton) e.getSource();
Dimension size = button.getSize();
int buttonX = button.getX();
int buttonY = button.getY();
int buttonPosX = buttonX/size.width;
int buttonPosY = buttonY/size.height;
int leftNeighbor = buttonPosX - 1;
int rightNeighbor = buttonPosX + 1;
int topNeighbor = buttonPosY - 1;
int bottomNeighbor = buttonPosY + 1;
int c = 0;
if (leftNeighbor >= 0 && format[buttonPosY][leftNeighbor] == buttons[8]) {
c = 1;
} else if (rightNeighbor < 3 && format[buttonPosY][rightNeighbor] == buttons[8]) {
c = 2;
} else if (topNeighbor >= 0 && format[topNeighbor][buttonPosX] == buttons[8]) {
c = 3;
} else if (bottomNeighbor <= 2 && format[bottomNeighbor][buttonPosX] == buttons[8]) {
c = 4;
} else {
c = 0;
}
switch (c) {
case 0:
break;
case 1:
temp = format[buttonPosY][buttonPosX];
format[buttonPosY][buttonPosX] = format[buttonPosY][leftNeighbor];
format[buttonPosY][leftNeighbor] = temp;
refresh();
break;
case 2:
temp = format[buttonPosY][buttonPosX];
format[buttonPosY][buttonPosX] = format[buttonPosY][rightNeighbor];
format[buttonPosY][rightNeighbor] = temp;
refresh();
break;
case 3:
temp = format[buttonPosY][buttonPosX];
format[buttonPosY][buttonPosX] = format[topNeighbor][buttonPosX];
format[topNeighbor][buttonPosX] = temp;
refresh();
break;
case 4:
temp = format[buttonPosY][buttonPosX];
format[buttonPosY][buttonPosX] = format[bottomNeighbor][buttonPosX];
format[bottomNeighbor][buttonPosX] = temp;
refresh();
break;
}
}
}
「混沌とした性質のために、」私はこの問題はなく、ここであなたがそれを介して動作し、把握するのに時間がかかるしたくない知っていますどちらも私たちはしません。見て、それが壊れるかもしれないいくつかの可能性のあるスポットを見つけることができない場合参照してください。あなたがそれに取り組んでいるときにたくさんのログステートメントを追加してください。これを良い質問にするためには、[こちら](http://stackoverflow.com/help/mcve)をご覧ください。 – 3ocene
私はそれを1行ずつ作業してきましたが、問題はコンポーネントをランダム化するところにあるようです。私がelse {...のコードを削除した場合}ステートメントは、正常に動作するOrder()メソッドではランダム化しません。 – Heathen0042
あなたの質問にそれを入れてください – 3ocene