我试图改造我找到的程序,但我无法继续
我想创建一个重置/新游戏
我试着打电话给班级 单击“新游戏”按钮后输出当前输出并创建新输出,使类返回默认值。 但我不能让它工作。请帮忙
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
Puzzle_Act3 puzzle = new Puzzle_Act3();
puzzle.setVisible(true);
newGameBut.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
puzzle.dispose();
puzzle = new Puzzle_Act3(); //********************************************how to make this work
puzzle.setVisible(true); //********************************become new again
}
});
}
});
}
这是完整的代码
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
class MyButton extends JButton {
private boolean isLastButton;
public MyButton() {
super();
initUI();
}
public MyButton(Image image) {
super(new ImageIcon(image));
initUI();
}
private void initUI() {
isLastButton = false;
BorderFactory.createLineBorder(Color.LIGHT_GRAY);
addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY));
}
@Override
public void mouseExited(MouseEvent e) {
setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY));
}
});
}
public void setLastButton() {
isLastButton = true;
}
public boolean isLastButton() {
return isLastButton;
}
}
public class Puzzle_Act3 extends JFrame {
private JPanel panel; // Init
private BufferedImage source;
private ArrayList<MyButton> buttons;
ArrayList<Point> solution = new ArrayList();
private Image image;
private MyButton lastButton;
private int width, height;
private final int DESIRED_WIDTH = 310;
private BufferedImage resized;
JPanel controlPanel;
JLabel display; //try init
static JButton newGameBut;
public Puzzle_Act3() {
initUI();
}
private void initUI() {
solution.add(new Point(0, 0));
solution.add(new Point(0, 1));
solution.add(new Point(0, 2));
solution.add(new Point(1, 0));
solution.add(new Point(1, 1));
solution.add(new Point(1, 2));
solution.add(new Point(2, 0));
solution.add(new Point(2, 1));
solution.add(new Point(2, 2));
solution.add(new Point(3, 0));
solution.add(new Point(3, 1));
solution.add(new Point(3, 2));
buttons = new ArrayList();
panel = new JPanel();
panel.setBorder(BorderFactory.createLineBorder(Color.ORANGE));
add(Box.createRigidArea(new Dimension(0, 25)), BorderLayout.NORTH);
panel.setLayout(new GridLayout(4, 3, 0, 0)); //setPanel();
//insert
newGameBut = new JButton("new game"); //new game/reset
controlPanel = new JPanel();
controlPanel.setLayout(new FlowLayout());
display = new JLabel("move: "+ count);
controlPanel.add(display);
controlPanel.add(newGameBut);
this.setLayout(new BorderLayout());
this.add(controlPanel, BorderLayout.NORTH);
try {
source = loadImage();
int h = getNewHeight(source.getWidth(), source.getHeight());
resized = resizeImage(source, DESIRED_WIDTH, h,
BufferedImage.TYPE_INT_ARGB);
} catch (IOException ex) {
Logger.getLogger(Puzzle_Act3.class.getName()).log(
Level.SEVERE, null, ex);
}
width = resized.getWidth(null);
height = resized.getHeight(null);
add(panel, BorderLayout.CENTER);
for (int i = 0; i < 4; i++) { //column
for (int j = 0; j < 3; j++) { //row
image = createImage(new FilteredImageSource(resized.getSource(),
new CropImageFilter(j * width / 3, i * height / 4,
(width / 3), height / 4)));
MyButton button = new MyButton(image);
button.putClientProperty("position", new Point(i, j));
if (i == 3 && j == 2) {
lastButton = new MyButton();
lastButton.setBorderPainted(false);
lastButton.setContentAreaFilled(false);
lastButton.setLastButton();
lastButton.putClientProperty("position", new Point(i, j));
} else {
buttons.add(button);
}
}
}
Collections.shuffle(buttons);
buttons.add(lastButton);
for (int i = 0; i < 12; i++) {
MyButton btn = buttons.get(i);
panel.add(btn);
btn.setBorder(BorderFactory.createLineBorder(Color.gray));
btn.addActionListener(new ClickAction());
}
pack();
setTitle("Puzzle - ccuison");
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private int getNewHeight(int w, int h) {
double ratio = DESIRED_WIDTH / (double) w;
int newHeight = (int) (h * ratio);
return newHeight;
}
private BufferedImage loadImage() throws IOException {
BufferedImage bimg = ImageIO.read(new File("myArtWork.png"));
return bimg;
}
private BufferedImage resizeImage(BufferedImage originalImage, int width,
int height, int type) throws IOException {
BufferedImage resizedImage = new BufferedImage(width, height, type);
Graphics2D g = resizedImage.createGraphics();
g.drawImage(originalImage, 0, 0, width, height, null);
g.dispose();
return resizedImage;
}
int count;
private class ClickAction extends AbstractAction {
@Override
public void actionPerformed(ActionEvent e) { //Clicks
count = count+1;
display.setText("move: "+count);
System.out.println(count);
checkButton(e);
checkSolution();
}
private void checkButton(ActionEvent e) {
int lidx = 0;
for (MyButton button : buttons) {
if (button.isLastButton()) {
lidx = buttons.indexOf(button);
}
}
JButton button = (JButton) e.getSource();
int bidx = buttons.indexOf(button);
if ((bidx - 1 == lidx) || (bidx + 1 == lidx)
|| (bidx - 3 == lidx) || (bidx + 3 == lidx)) {
Collections.swap(buttons, bidx, lidx);
updateButtons();
}
}
private void updateButtons() {
panel.removeAll();
for (JComponent btn : buttons) {
panel.add(btn);
}
panel.validate();
}
}
private void checkSolution() {
ArrayList<Point> current = new ArrayList();
for (JComponent btn : buttons) {
current.add((Point) btn.getClientProperty("position"));
}
if (compareList(solution, current)) { //WIN
JOptionPane.showMessageDialog(panel, "Finished",
"Congratulation", JOptionPane.INFORMATION_MESSAGE);
Puzzle_Act3 puzzle = new Puzzle_Act3();
puzzle.dispose();
puzzle.setVisible(true);
}
}
public static boolean compareList(List ls1, List ls2) {
return ls1.toString().contentEquals(ls2.toString());
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
Puzzle_Act3 puzzle = new Puzzle_Act3();
puzzle.setVisible(true);
newGameBut.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
puzzle.dispose();
puzzle = new Puzzle_Act3(); //********************************************how to make this work
puzzle.setVisible(true); //********************************become new again
}
});
}
});
}
}
答案 0 :(得分:0)
尝试将前一个类的属性(即,您正在处置的属性)包含在新类中,这样,新类看起来像旧类,但默认属性存在!
这样的事情对我有用!
public class Welcome {
static GUI run = new GUI ();
public static void main (String [] args) {
run.setPreferredSize(new Dimension(800, 500));
run.setResizable(false);
run.setVisible(true);
run.setLocation(250,150);
run.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
ImageIcon img = new ImageIcon("C:/Users/hp/documents/MyLogo.png");
run.setIconImage(img.getImage());
run.setTitle( "Pearl Math-Whiz");
run.pack();
}
然后,对于重置按钮的actionlistener,执行类似这样的操作
run.dispose();
GUI ran = new GUI();
ran.setPreferredSize(new Dimension(800, 500));
ran.setResizable(false);
ran.setVisible(true);
ran.setLocation(250,150);
ran.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
ImageIcon img = new ImageIcon("C:/Users/hp/documents/MyLogo.png");
ran.setIconImage(img.getImage());
ran.setTitle( "Pearl Math-Whiz");
ran.pack();
}