为什么按UP键时面板会消失?

时间:2016-04-27 03:32:20

标签: java swing applet actionlistener

这是我制作游戏的代码。目前我并不担心游戏功能如何让我更加担心每次按下UP按钮时面板消失,有时我也会点击左按钮。有没有解释,任何人都可以帮助我理解为什么会这样?我觉得它与我的if语句有关但我不太确定。此外,我正在搞乱关键的听众,如果你能给我一些关于主要听众的建议,比如一些dos和donts,我真的很感激帮助!!

  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 个答案:

答案 0 :(得分:3)

问题和建议:

  1. 您将AWT(例如,小程序,按钮,标签)与Swing(例如,JPanel,JLabel)混合危险地且不需要。坚持使用Swing并摆脱AWT的所有残余。
  2. 你直接在顶级窗口绘画,这里是Applet,这是一件很危险的事情。唐&#39;吨。按照Swing图形教程,在JPanel的paintComponent方法中进行绘制。
  3. 你没有在你的绘画方法覆盖中调用超级方法,这是另一个危险的事情,另一个迹象表明你在没有阅读重要的相关教程的情况下尝试这样做。
  4. 请勿使用==!=来比较字符串。请改用equals(...)equalsIgnoreCase(...)方法。理解==检查两个对象引用是否相同而不是您感兴趣的内容。另一方面,这些方法检查两个字符串是否具有相同顺序的相同字符,以及#39;这里重要的是什么。
  5. 您尝试直接设置组件(如JPanel)的位置,而不考虑布局管理器。不要这样做。而是移动逻辑(非组件)实体并在图形中显示移动。
  6. 您可以在此处找到指向Swing教程和其他Swing资源的链接:Swing Info

    稍后我们可以说出为什么你应该避免各种口味的小程序......

    我自己,我将ImageIcons移动到JLabel网格周围,而不是直接使用绘画方法。例如,

    Example program animation

    要查看,请运行以下代码:

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