java - 不必要地创建多个框架

标签 java swing

我正在开发 Java 项目,这是一个 child 游戏。我有菜单类,它也有 main 方法,我有 Board 类,它扩展了 JPanel 并其中有游戏 GUI,我有 Player 类,它有玩家的移动方法。我在扩展 jframe 的菜单类中设计了整个菜单,我在一个框架(Menu 对象)中拥有所有操作和事件,因此我使用大量 repaint() 和 validate() 方法来更改主框架中的 JPanel。它对某些人来说效果很好,但是当我想添加游戏面板供用户启动游戏时,这是我设计中的 Board 对象。又创建了一个不必要的框架。在我的菜单中,第一个用户会看到一个面板,我在代码中将其称为startingPanel,其中包含“开始游戏按钮”、“最高分”、“积分”和“退出”按钮。然后用户单击开始游戏,然后 userNamepanel 出现,用户输入他/她的名字,然后他/她通过使用开始游戏按钮开始游戏,该按钮删除 userNamePanel 并将 Board 添加到框架中。但问题出现了,java 在该框架中打开 Board 面板,但同时它创建了一个新的菜单框架实例,并且我在屏幕中有 2 个框架,一个显示 Board 面板,另一个显示启动面板。那么我怎样才能摆脱这个额外的框架呢?这是我的代码;首先是板类

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Board extends JPanel implements ActionListener {



    private Timer timer;
    private Player player;
    private final int DELAY = 10;
    private Image image;
    private JLabel label;
    private JPanel panel;
    private JButton button1, button2;
    private int mapNumber;
    private boolean talkProfessor = false;
    private ImageIcon front = new ImageIcon("player_front.png");
    private ImageIcon left = new ImageIcon("player_left.png");
    private ImageIcon right = new ImageIcon("player_right.png");
    private ImageIcon back = new ImageIcon("player_back.png");
    private ImageIcon front2 = new ImageIcon("player_front2.png");
    private ImageIcon left2 = new ImageIcon("player_left2.png");
    private ImageIcon right2 = new ImageIcon("player_right2.png");
    private ImageIcon back2 = new ImageIcon("player_back2.png");
    private ImageIcon front3 = new ImageIcon("player_front3.png");
    private ImageIcon left3 = new ImageIcon("player_left3.png");
    private ImageIcon right3 = new ImageIcon("player_right3.png");
    private ImageIcon back3 = new ImageIcon("player_back3.png");




    public Board() {

        initBoard();





    }

    private void initBoard() {

        setPreferredSize(new Dimension(900,900));
        image = Toolkit.getDefaultToolkit().createImage("map4.png");
        mapNumber = 4;

        addKeyListener(new TAdapter());
        setFocusable(true);

        player = new Player();

        timer = new Timer(DELAY, this);
        timer.start();      

    }

    public Image getImage(){
        return image;
    }


    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.drawImage(image,0,0,null);

        doDrawing(g);       
    }

    private void doDrawing(Graphics g) {

        Graphics2D g2d = (Graphics2D) g;   
        g2d.drawImage(player.getImage(), player.getX(), player.getY(), this);

    }



    public void actionPerformed(ActionEvent e) {

        player.move();


        if(((player.getY() == 350 && mapNumber == 1) && (player.getX() <= 500 && player.getX() >= 400)) ){
            JOptionPane.showMessageDialog(null,"" +  
                " ");       
            player.setdY(0);
            player.setY(player.getY() + 50);
        }

        if((player.getX() == 350 && mapNumber == 1) && (player.getY() <= 500 && player.getY() >= 400)){
            JOptionPane.showMessageDialog(null,"");
            player.setX(player.getX() + 50);
            player.setdX(0);
        }

        if((player.getY() == 750 && mapNumber == 2) && (player.getX() <= 500 && player.getX() >= 400)){
            JOptionPane.showMessageDialog(null,"" + 
                "");
            player.setY(player.getY() - 50);
            player.setdY(0);
            talkProfessor = true;
        }

        if((player.getY() == 500 && mapNumber == 3) && (player.getX() <= 500 && player.getX() >= 400)){
            JOptionPane.showMessageDialog(null,"" + 
                "  " + 
                    "");

            player.setY(player.getY() - 50);
            player.setdY(0);
        }

        if((player.getY() == 400 && mapNumber == 3) && (player.getX() <= 280 && player.getX() >= 270)){
            JOptionPane.showMessageDialog(null,"");
            player.setY(player.getY() + 10);
            player.setdX(0);
            player.setdY(0);            
        }


        if((player.getX() == 200 && mapNumber == 4) && (player.getY() <= 500 && player.getY() >= 400)){
            if(talkProfessor){
                JOptionPane.showMessageDialog(null,"" + 
                " ");

            }
            else
            JOptionPane.showMessageDialog(null,"" + 
                " ");
            player.setX(player.getX() + 50);
            player.setdX(0);
        }

        if((player.getX() == 100 && mapNumber == 5) && (player.getY() <= 500 && player.getY() >= 400)){
            JOptionPane.showMessageDialog(null," " +
                "");

            player.setX(player.getX() + 50);
            player.setdX(0);
        }

        if((player.getY() == 400 && mapNumber == 101) && player.getX() <= 50){
            JOptionPane.showMessageDialog(null,"");

            player.setX(player.getX() + 50);
            player.setdY(0);

        }

        if((player.getX() >= 800 && mapNumber == 101) && player.getY() == 420){
            player.setX(player.getX() - 50);
            player.setdX(0);
            player.setdY(0);

            JOptionPane.showMessageDialog(null," ");

        }

        if(player.getX() == 850 && mapNumber == 1){
            image = Toolkit.getDefaultToolkit().createImage("map2.png");
            player.setX(10);
            mapNumber = 2;
        }

        if(player.getX() == 0 && mapNumber == 2){
            image = Toolkit.getDefaultToolkit().createImage("map.png");
            player.setX(840);
            mapNumber = 1;
        }

        if((player.getX() == 240 && mapNumber == 2) && player.getdX() == 1){
            player.setImage(front2, left2, right2, back2);
        }

        if((player.getX() == 200 && mapNumber == 2) && player.getdX() == -1){
            player.setImage(front, left, right, back);
        }


        if(player.getY() == 0 && mapNumber == 3){
            image = Toolkit.getDefaultToolkit().createImage("map4.png");
            player.setY(840);
            mapNumber = 4;
        }

        if(player.getY() == 850 && mapNumber == 4){
            image = Toolkit.getDefaultToolkit().createImage("map3.png");
            player.setY(10);
            mapNumber = 3;
        }



        if(player.getY() == 0 && mapNumber == 1){
            image = Toolkit.getDefaultToolkit().createImage("map5.png");
            player.setY(840);
            mapNumber = 5;
        }

        if(player.getY() == 850 && mapNumber == 1){
            image = Toolkit.getDefaultToolkit().createImage("map4.png");
            player.setY(10);
            mapNumber = 4;
        }



        if((player.getY() == 400 && mapNumber == 3) && (player.getX() >= 100 && player.getX() <= 200)){
            image = Toolkit.getDefaultToolkit().createImage("house.png");
            player.setX(400);
            player.setY(840);
            mapNumber = 101;
            player.setImage(front3, left3, right3, back3);
        }

        if(player.getY() == 850 && mapNumber == 101){
            image = Toolkit.getDefaultToolkit().createImage("map3.png");
            player.setX(150);
            player.setY(410);
            mapNumber = 3;
            player.setImage(front, left, right, back);
        }

        repaint();  


    }


    private class TAdapter extends KeyAdapter {

        @Override
        public void keyReleased(KeyEvent e) {
            player.keyReleased(e);
        }

        @Override
        public void keyPressed(KeyEvent e) {
            player.keyPressed(e);
        }
    }
    }

然后这是 Menu 类,它也有 main 方法

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Menu extends JFrame {


private JButton buttonToStartTheQuest, buttonToShowCredits, buttonToExit, buttonToShowTopScores, buttonToTurnMenu, buttonToExit1, buttonToExit2, buttonToTurnMenu2;
private JPanel startingPanel, creditsPanel, topScoresPanel, userNamePanel;
private JLabel creditsLabel, topScoresLabel;
private JLabel inputLabel,outputLabel;
private JTextField userName;
private ImageIcon image;
private JButton startTheGame;
private Board board;





public Menu() {

    buttonToStartTheQuest = new JButton("Start A New Quest");
    buttonToShowTopScores = new JButton("View Top Scores");
    buttonToShowCredits = new JButton("Credits");
    buttonToExit = new JButton("Exit");
    buttonToTurnMenu=new JButton("Turn Back To Main Menu");
    buttonToExit1 = new JButton("Exit");
    buttonToExit2 = new JButton("Exit");
    buttonToTurnMenu2=new JButton("Turn Back To Main Menu");
    startTheGame=new JButton("Start The Game");




    startingPanel = new JPanel();
    startingPanel.setPreferredSize(new Dimension(900,900));
    startingPanel.setLayout(new GridLayout(4,1));



    creditsPanel=new JPanel();
    creditsPanel.setPreferredSize(new Dimension(900,900));
    creditsLabel=new JLabel("Credits\nThis Game is Created By:\nPokeMan");
    creditsPanel.add(creditsLabel);

    image=new ImageIcon("bigKid.png");
    userName=new JTextField(20);
    userName.addActionListener(new UserListener());

    inputLabel= new JLabel("Enter Your User Name To Start The Quest",image, SwingConstants.CENTER);
    outputLabel=new JLabel("");

    userNamePanel=new JPanel();
    userNamePanel.setPreferredSize(new Dimension(900,900));
    userNamePanel.setBackground(Color.white);

    userNamePanel.add(inputLabel);
    userNamePanel.add(userName);
    userNamePanel.add(outputLabel);



    topScoresPanel=new JPanel();
    topScoresPanel.setPreferredSize(new Dimension(900,900));
    topScoresLabel=new JLabel("Top Score\n 1----\n2-----\n3------");
    topScoresPanel.add(topScoresLabel);



    ButtonListener listener = new ButtonListener();
    buttonToStartTheQuest.addActionListener(listener);
    buttonToShowTopScores.addActionListener(listener);
    buttonToShowCredits.addActionListener(listener);
    buttonToExit.addActionListener(listener);

    ButtonListener1 listener1= new ButtonListener1();
    buttonToExit1.addActionListener(listener1);
    buttonToTurnMenu.addActionListener(listener1);

    ButtonListener2 listener2 = new ButtonListener2();
    buttonToExit2.addActionListener(listener2);
    buttonToTurnMenu2.addActionListener(listener2);



    startingPanel.add(buttonToStartTheQuest);
    startingPanel.add(buttonToShowTopScores);
    startingPanel.add(buttonToShowCredits);
    startingPanel.add(buttonToExit);

    setTitle("Quest for Philosophy");  
    setSize(900, 900);
    setResizable(true);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    getContentPane().add(startingPanel);
    pack();
    setVisible(true);


    startTheGame.addActionListener(new GameStarter());




}


private class ButtonListener implements ActionListener{
    public void actionPerformed(ActionEvent e){

        Object source = e.getSource();


        if(source == buttonToExit){
            System.exit(0);

        }

        if(source == buttonToShowCredits){

            remove(startingPanel);
            creditsPanel.add(buttonToExit1);
            creditsPanel.add(buttonToTurnMenu);
            add(creditsPanel);
            repaint();
            validate();
        }

        if(source == buttonToShowTopScores){
            remove(startingPanel);
            topScoresPanel.add(buttonToExit2);
            topScoresPanel.add(buttonToTurnMenu2);
            add(topScoresPanel);
            repaint();
            validate();

         }
         if(source==buttonToStartTheQuest){
            remove(startingPanel);
            add(userNamePanel);
            repaint();
            validate();
         }
    }       
}
private class ButtonListener1 implements ActionListener{
    public void actionPerformed(ActionEvent e1){
        Object source1= e1.getSource();
        if(source1==buttonToExit1)
            System.exit(0);
        else if(source1==buttonToTurnMenu){
            System.out.println("a");
            remove(creditsPanel);
            add(startingPanel);
            repaint();
            validate();
        }
    }
}

private class ButtonListener2 implements ActionListener{
    public void actionPerformed(ActionEvent e2){
        Object source2=e2.getSource();
        if(source2==buttonToExit2)
            System.exit(0);
        else if(source2==buttonToTurnMenu2){
            remove(topScoresPanel);
            add(startingPanel);
            repaint();
            validate();
            }           
    }
}
private class UserListener implements ActionListener{
    public void actionPerformed(ActionEvent event){
        String text=userName.getText();
        outputLabel.setText("Game Is Started with User Name: " + text);
        userNamePanel.add(startTheGame);
        repaint();
        validate();


    }
}
private class GameStarter implements ActionListener{
    public void actionPerformed(ActionEvent event){
        Object source=event.getSource();

        if(source==startTheGame){ //here is where problem occurs
            System.out.println("a");
            board= new Board();
            remove(userNamePanel);
            add(board);
            repaint();
            validate();


        }
    }
}




public static void main(String[] args) {

    EventQueue.invokeLater(new Runnable() {
        public void run() {

            Menu ex = new Menu();
        }
    });
} 
}

提前致谢。

最佳答案

您可以使用JOptionPane

例如:

JOptionPane.showOptionDialog(_parentComponent_,
             _message_, // Message String
             _title_,  // Title of the Dialog
             _optionType_, // 0, as you give the options
             _messageType_,  // type - information, question etc
             _icon_, // whatever icon you want
             _options_, // the options as an array of Objects
             _initialValue_ );// The selected value - index

这将创建一个带有按钮的对话框,其中包含 o 元素中的文本。它将返回所选项目的索引。 对于您来说,它可能是:

Object o = {"Start", "Top Scores"....};
int selectedIndex = JOptionPane.showOptionDialog(null, "Choose an option", "Game", 0, -1, null,o, 0);

关于java - 不必要地创建多个框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36939464/

相关文章:

java - 网络连接测试/故障排除工具?

java - 将 ArrayList 元素存储在字符串中

java - 想要在使用 java swing 在网络浏览器中打开链接时隐藏/修改地址栏中的链接

java - 在 JTree 上设置 SUID?

java - DatePickerCellEditor() 有什么问题?

java - 从应用程序内启动 Android 应用程序

java - Eclipse插件: How to specify what launch configurations appear in a project's properties?

java - 如何在不使用AJAX的情况下从servlet获取arrayList的元素到jsp并显示在同一个jsp上

java - 使用 Swing 应用程序运行时部署 tomcat

java - 为什么我的 JFrame 在 Mac 上启动时随机收缩?