java - 如何重置类内的值?

标签 java swing class jframe

我尝试重新构建我找到的程序,但无法继续

我想创建一个重置/新游戏

我尝试给类(class)打电话,然后 单击“新游戏”按钮并创建新输出后处理当前输出,导致类返回默认值。 但我无法让它发挥作用。请帮忙

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


                }

            });
        }
    });
}

}

最佳答案

尝试将前一个类(即您要处理的类)的属性也包含到新类中,这样,新类看起来就像旧类一样,但具有默认属性!

这样的事情对我来说会做的!

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();



    }

然后,对于重置按钮的 Action 监听器,执行如下操作

 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();



    }

关于java - 如何重置类内的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40831953/

相关文章:

java - 运行 Netty HttpStaticFileServer 示例

Java - 如何检查 ArrayList 中是否有值是 HashMap 中键的值?

java - 从 Firebase 数据库中按 id 检索对象

java - 使用 GSON 序列化/反序列化简单对象 - 无时区指示器错误

java - 将列表添加到 JScrollPane 时无法添加到 JList

Java编译警告

java - 构建我的 Java Swing 应用程序。 IE。何时何地使用类和不使用类

java - 访问表示原始类型的调用对象

java - 如何让右侧JPanel始终显示

javascript - 访问构造函数内的数据 javascript 不起作用