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

亚历克斯·卡皮斯特兰(Alex Capistran)

这是我编写游戏代码的代码。目前,我并不担心游戏的运行方式,我更加担心的是,每次我按下UP按钮时,面板都会消失,有时甚至当我按下LEFT按钮时也会消失。有没有对此的解释,任何人都可以帮助我理解为什么会发生这种情况吗?我觉得这与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. 您直接在顶层窗口(这里是Applet)中绘画,这是一件危险的事情。别。遵循Swing图形教程,并使用JPanel的paintComponent方法绘制图形。
  3. 您不会在绘画方法重写中调用super方法,这是另一件事要做的危险,并且是在没有阅读重要的相关教程的情况下试图执行此操作的另一种指示。
  4. 不要使用==比较字符串!=改用equals(...)equalsIgnoreCase(...)方法。理解==检查两个对象引用是否相同,这不是您感兴趣的对象。另一方面,方法检查两个Strings是否具有相同顺序的相同字符,这就是这里的要点。
  5. 您试图直接设置诸如JPanel之类的组件的位置,而不考虑布局管理器。不要这样 而是移动逻辑(非组件)实体并在图形中显示移动。

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

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

我本人会在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();
        });
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么当我按下这个按钮时一切都消失了?

为什么当我在 pygame 中按下特定键时我的精灵不移动

当我按下“tab”键时,为什么我的响应式导航栏被选中?

当我按下模态按钮时,导航栏消失

当我按下播放时,游戏对象消失了

为什么在我的本机应用程序中按下每个键后键盘消失了?

为什么当我按下退出键时框架没有关闭?

为什么当我使用 <TouchableWithoutFeedback> 时我的设计消失了?

为什么当我在 JavaScript 中按下按钮时我的粒子会加速?

当我按下按钮时,为什么小球没有在我的小程序中移动?

为什么当我按下按钮时我的 onclick 功能没有激活?

当我按下按键时,为什么我的精灵不在pygame中移动?

当我按下 .button 时,为什么我的 div 没有移动?

当我按超级键时,为什么窗口描述会这样显示?

为什么当我按下 ENTER 键时触发表单中第一个按钮的 onclick(并且没有 keyCode 事件)?

为什么当我按下按钮时UILabel没有改变?

为什么当我按下“提交”按钮时,表单没有提交?

当我按下按钮开始 Toast 时,Java 应用程序关闭。但为什么?

为什么当我按下按钮在表中插入值时应用程序崩溃?

每当我按下按钮时,如何制作一个刷新的面板?

当我同时按下 fn 键时,功能键起作用

为什么当我按下通知但PendingIntent没有转到另一个Fragment时?

当我从 index.html 转到 index.html/#contact 时,为什么我的 CSS 消失了?

为什么当我使用 flex-direction 时我的 div 消失了?

当我将 Meteor App 转换为使用 Docker 时,为什么我的 MongoDB 数据消失了?

为什么当我调用.place_forget()方法时,我的Label不消失?

当我按下箭头键时,文本光标滚动我

当我按下按钮时

当我将窗口移到不同的工作区时,为什么窗口消失了?