为什么当我按下 UP 时面板消失了?

Why do the panels disappear when i press UP?

这是我正在制作的游戏代码。目前我并不担心游戏的功能,我更担心的是每次我按下向上按钮时面板都会消失,有时当我按下左按钮时面板也会消失。对此有任何解释吗,任何人都可以帮助我理解为什么会发生这种情况?我觉得这与我的 if 语句有关,但我不太确定。另外,我正在和关键听众打交道,如果你能给我一些关于关键听众的建议,比如一些注意事项,我真的很感激你的帮助!!

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


  public class Game extends Applet implements ActionListener,KeyListener {
     Image image;
     MediaTracker tr;
     JLabel label,computerLabel;
     JPanel panel,computerPanel;
     Button start,up,down;
     Label result;
     Dimension SIZE = new Dimension(50,50);

     int x = 0;
     int y = 0;
     int w = 100;
     int q = 100;
     int WIDTH = 50;
     int HEIGHT = 50;
     //Player Integers
     int zeroPosX,zeroPosY,xLeft,xUp;
     //Computer integers
     int compZeroPosX,compZeroPosY,compXLeft,compXUp;

     //--------------------------------------
     public void init()   {
        setLayout(new FlowLayout());

        start = new Button("Start");
        up = new Button("UP");
        down = new Button("LEFT");
     //PlayerPiece stuff    
        ImageIcon icon = new ImageIcon("playerpiece.png");      
        label = new JLabel(icon);
        panel = new JPanel();

        label.setVisible(true);
        panel.add(label);
        panel.setPreferredSize(SIZE);
     //ComputerPiece Stuff
        ImageIcon computerIcon = new ImageIcon("computerPiece.png");
        computerPanel = new JPanel();
        computerLabel = new JLabel(computerIcon);

        computerLabel.setVisible(true);
        computerPanel.add(computerLabel);
        computerPanel.setPreferredSize(SIZE);

     //===============================================     

        result = new Label("=========");
        addKeyListener(this);

        setSize(650,650);

        up.addActionListener(this);
        down.addActionListener(this);
        start.addActionListener(this);

        label.setSize(WIDTH,HEIGHT);
        label.setLocation(0,0);

        add(computerPanel);
        add(panel);
        add(start);
        add(up);
        add(down);
        add(result);


        }

     //--------------------------------------  
        public void paint(Graphics g)  {


           Graphics2D firstLayer = (Graphics2D)g;
           Graphics2D secondLayer = (Graphics2D)g;
           Graphics2D thirdLayer = (Graphics2D)g;


        secondLayer.setColor(Color.BLACK);


           for(x=100; x<=500; x+=100) 
               for(y=100; y <=500; y+=100)
               {

               firstLayer.fillRect(x,y,WIDTH,HEIGHT);


               }
           for(w=150; w<=500; w+=100) 
               for(q=150; q <=500; q+=100)
                  {

               secondLayer.fillRect(w,q,WIDTH,HEIGHT);


               }





           }
        //--------------------------------------
           public void actionPerformed(ActionEvent ae)   {

           int [] range = {50,0,0,0,0};
           int selection = (int)Math.random()*5 ;


        //~~~~~~~~~~~~~~~~~~~~~~~~~

        //PlayerPositioning
            zeroPosX = panel.getX();
            zeroPosY = panel.getY();
            xLeft = zeroPosX - 50;
            xUp = zeroPosY - 50;  
        //ComputerPositioning
            compZeroPosX = computerPanel.getX();
            compZeroPosY = computerPanel.getY();
            compXLeft = compZeroPosX - range[selection];
            compXUp = compZeroPosY - range[selection];
        //~~~~~~~~~~~~~~~~~~~~~~~~~~    


            Button user = (Button)ae.getSource();




        //Starting the game
        if(user.getLabel() == "Start")   {
            result.setText("=========");
        //playersetup
            label.setLocation(0,0);
            panel.setLocation(300,500);
        //============================
        //npc setup
            computerLabel.setLocation(0,0);
            computerPanel.setLocation(500,300);


         }



           if(compZeroPosX >= 150)    {
              if(compZeroPosY >= 150)    {
                 if(zeroPosX >= 150)       {
                   if(zeroPosY >=150)         {  


                      if(user.getLabel() == "UP")   {
                        panel.setLocation(zeroPosX,xUp);

                        }
                        else     
                          computerPanel.setLocation(compZeroPosX,compXUp);




                      if(user.getLabel() == "LEFT") {
                         panel.setLocation(xLeft,zeroPosY);

                      }

                      else      
                         computerPanel.setLocation(compXLeft,compZeroPosY);

                       if(panel.getX() < 150) 
                          result.setText("GAME-OVER");


                       if(panel.getY() < 150)
                          result.setText("GAME-OVER");

                       }
                 }      
                 }
              }  
           }
        @Override
        public void keyPressed(KeyEvent kp) {
           int keycode = kp.getKeyCode();

              switch (keycode)  {
                 case KeyEvent.VK_W:
                 panel.setLocation(xLeft,zeroPosY);
                 break;
                 }





        }
        @Override
        public void keyReleased(KeyEvent kr)   {

        }
        @Override
        public void keyTyped(KeyEvent kt)   {

        }

       }

问题与建议:

  1. 您将 AWT(例如,Applet、Button、Label)与 Swing(例如,JPanel、JLabel)危险地混合使用,而且没有必要。坚持使用 Swing 并摆脱 AWT 的所有痕迹。
  2. 您直接在顶级 window 中绘画,这里是 Applet,这是一件危险的事情。不。遵循 Swing 图形教程并在 JPanel 的 paintComponent 方法中进行绘图。
  3. 您没有在绘画方法覆盖中调用 super 方法,这是另一件危险的事情,也表明您在未阅读重要的相关教程的情况下尝试这样做。
  4. 不要使用 ==!= 比较字符串。请改用 equals(...)equalsIgnoreCase(...) 方法。了解 == 检查两个对象引用是否相同,这不是您感兴趣的。另一方面,这些方法检查两个字符串是否具有相同顺序的相同字符,这才是最重要的这里。
  5. 您正在尝试直接设置 JPanel 等组件的位置,而不考虑布局管理器。不要这样做。而是移动逻辑(非组件)实体并在图形中显示移动。

您可以在此处找到 Swing 教程和其他 Swing 资源的链接:Swing Info

稍后我们会讨论为什么您应该避免使用各种口味的小程序...

我自己会在 JLabel 网格周围移动 ImageIcons,根本不直接使用绘画方法。例如,

看看,运行下面的代码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import javax.imageio.ImageIO;
import javax.swing.*;

@SuppressWarnings("serial")
public class Game2 extends JPanel {
    private static final String CPU_PATH = "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4f/"
            + "Gorilla-thinclient.svg/50px-Gorilla-thinclient.svg.png";
    private static final String PERSON_PATH = "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d8/"
            + "Emblem-person-blue.svg/50px-Emblem-person-blue.svg.png";
    private static final int SQR_WIDTH = 50;
    private static final int SIDES = 10;
    private static final Dimension SQR_SIZE = new Dimension(SQR_WIDTH, SQR_WIDTH);
    private static final Color DARK = new Color(149, 69, 53);
    private static final Color LIGHT = new Color(240, 220, 130);
    private JLabel[][] labelGrid = new JLabel[SIDES][SIDES];
    private Icon playerIcon;
    private Icon computerIcon;

    public Game2() throws IOException {
        // would use images instead
        playerIcon = createIcon(PERSON_PATH);
        computerIcon = createIcon(CPU_PATH);

        JPanel buttonPanel = new JPanel();
        buttonPanel.add(new JButton(new StartAction("Start", KeyEvent.VK_S)));
        buttonPanel.add(new JButton(new UpAction("Up", KeyEvent.VK_U)));
        buttonPanel.add(new JButton(new LeftAction("Left", KeyEvent.VK_L)));

        JPanel gameBrd = new JPanel(new GridLayout(SIDES, SIDES));
        gameBrd.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        for (int i = 0; i < labelGrid.length; i++) {
            for (int j = 0; j < labelGrid[i].length; j++) {
                JLabel label = new JLabel();
                label.setPreferredSize(SQR_SIZE);
                label.setOpaque(true);
                Color c = i % 2 == j % 2 ? DARK : LIGHT;
                label.setBackground(c);
                gameBrd.add(label);
                labelGrid[i][j] = label;
            }
        }

        setLayout(new BorderLayout());
        add(buttonPanel, BorderLayout.PAGE_START);
        add(gameBrd);

        // random placement, just for example
        labelGrid[4][4].setIcon(computerIcon);
        labelGrid[5][5].setIcon(playerIcon);
    }

    private Icon createIcon(String path) throws IOException {
        URL url = new URL(path);
        BufferedImage img = ImageIO.read(url);
        return new ImageIcon(img);        
    }

    private abstract class MyAction extends AbstractAction {
        public MyAction(String name, int mnemonic) {
            super(name);
            putValue(MNEMONIC_KEY, mnemonic);
        }
    }

    private class StartAction extends MyAction {
        public StartAction(String name, int mnemonic) {
            super(name, mnemonic);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO start game code

        }
    }

    // move all icons up
    private class UpAction extends MyAction {
        public UpAction(String name, int mnemonic) {
            super(name, mnemonic);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            // collection to hold label that needs to be moved
            Map<JLabel, Icon> labelMap = new HashMap<>();
            for (int i = 0; i < labelGrid.length; i++) {
                for (int j = 0; j < labelGrid[i].length; j++) {
                    Icon icon = labelGrid[i][j].getIcon();
                    if (icon != null) {
                        int newI = i == 0 ? labelGrid.length - 1 : i - 1;
                        labelGrid[i][j].setIcon(null);
                        labelMap.put(labelGrid[newI][j], icon);
                    }
                }
            }

            // move the icon after the iteration complete so as not to move it twice
            for (JLabel label : labelMap.keySet()) {
                label.setIcon(labelMap.get(label));
            }
        }
    }

    // move all icons left
    private class LeftAction extends MyAction {
        public LeftAction(String name, int mnemonic) {
            super(name, mnemonic);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            Map<JLabel, Icon> labelMap = new HashMap<>();
            for (int i = 0; i < labelGrid.length; i++) {
                for (int j = 0; j < labelGrid[i].length; j++) {
                    Icon icon = labelGrid[i][j].getIcon();
                    if (icon != null) {
                        int newJ = j == 0 ? labelGrid[i].length - 1 : j - 1;
                        labelGrid[i][j].setIcon(null);
                        labelMap.put(labelGrid[i][newJ], icon);
                    }
                }
            }
            for (JLabel label : labelMap.keySet()) {
                label.setIcon(labelMap.get(label));
            }
        }

    }

    private static void createAndShowGui() {
        Game2 mainPanel = null;
        try {
            mainPanel = new Game2();
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(-1);
        }

        JFrame frame = new JFrame("Game2");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            createAndShowGui();
        });
    }
}