繁体   English   中英

创建对象时代码崩溃,因此可以从另一个类调用重绘

[英]Code crashes when making an object so repaint can be called from another class

我目前正在做一个新项目,长话短说我正在尝试在矩形对象上实现动作侦听器,以便它可以上下移动。

但是在这里,当在 test3 类中创建一个对象时,代码完全崩溃,在这种情况下 test2 类在 test3 类中(是的,我知道类需要大写)。 因为我已经复制了制作新项目的问题并且只使用了所需的代码。

public class test {

    test2 board = new test2();

    public void frame() {
        JFrame b = new JFrame("test");
        b.setSize(905,705);
        b.setLocation(300,60);
        b.setResizable(false);
        b.setVisible(true);
        b.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);         
        b.add(board);
    }

    public static  void main(String[] args) {
        test start = new test();
        start.frame();
    }
}

public class test2 extends JPanel {

    public int playerScore = 0;
    public int opponentScore = 0;
    test3 player = new test3();
    
    public void paint(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;

        board(g);
        g.setColor(Color.WHITE);

        g2d.fill(player.player);
    }

    public void board(Graphics g) {
        g.setColor(Color.black);
        g.fillRect(0, 0, 900, 900);
    }
}

public class test3 {

    public boolean down = false;
    public boolean up = false;
    public int playerXpos = 45;
    public int playerYpos = 300;
    public int playerWidth = 15;
    public int playerHeight = 80;
    Rectangle player = new Rectangle(playerXpos, playerYpos, playerWidth, playerHeight);
    test2 theBoard = new test2();

    public void actionPerformed(ActionEvent e) {
        if (down) {
            down = true;

            if (up != true) {
                down = true;
            } else {
                up = true;
                down = false;
            }
        }
        
        if (up) {
            up = true;

            if (down != true) {
                up = true;
            } else {
                up = false;
                down = true;
            }
        }
    }

    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub
    }

    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_UP) {
            for (int r = playerYpos; r >=0; r--) {
                if (r == 0) {
                    playerYpos = playerYpos - 20;
                } else {
                    playerYpos = playerYpos - 1;
                }
            
                if (playerYpos < 50) {
                    playerYpos = 50;
                }
            }

            theBoard.repaint();
        }

        if (e.getKeyCode() == KeyEvent.VK_DOWN) {
            for (int r = playerYpos; r >= 0; r--) {
                if (r == 0) {
                    playerYpos = playerYpos + 20;   
                } else {
                    playerYpos = playerYpos - 1;
                }
            
                if (playerYpos > 800){
                    playerYpos = 800;
                }
            }

            theBoard.repaint();
        }
    }

    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub
    }
}

您的代码无法编译。

我使用了您的一些代码并创建了以下 GUI。

示例图形用户界面 1

这是移动播放器矩形后的 GUI。

示例图形用户界面 2

Oracle 有一个有用的教程,用 JFC/Swing 创建 GUI 跳过 Netbeans 部分。

我做的第一件事是通过调用SwingUtilities invokeLater方法来启动 Swing 应用程序。 此方法可确保在Event Dispatch Thread上创建和执行 Swing 组件。

我创建了一个Player类来保存播放器矩形。 这样,您可以在一个地方更改播放器形状。

我创建了一个JFrame JFrame方法必须按特定顺序调用。 这是我用于 Swing 应用程序的顺序。

我创建了一个绘图JPanel 这个JPanel与你的相似,除了我覆盖了paintComponent方法。 我将Player一个实例传递给绘图JPanel以便JPanel可以绘制播放器矩形。

我使用键绑定而不是键侦听器。 无论绘图JPanel是否处于焦点,这都会使键起作用。 键绑定还使我可以轻松添加 WASD 键和箭头键。

这是完整的可运行代码。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;

public class ExampleGUI implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new ExampleGUI());
    }
    
    private final DrawingPanel drawingPanel;
    
    private final Player player;
    
    public ExampleGUI() {
        this.player = new Player();
        this.drawingPanel = new DrawingPanel(player);
    }

    @Override
    public void run() {
        JFrame frame = new JFrame("Example GUI");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        frame.add(drawingPanel, BorderLayout.CENTER);
        
        frame.pack();
        frame.setLocationByPlatform(true);
        setKeyBindings(drawingPanel);
        frame.setVisible(true);
    }
    
    private void setKeyBindings(JPanel panel) {
        String up = "up";
        String down = "down";
        String left = "left";
        String right = "right";
        
        InputMap inputMap = panel.getInputMap();
        ActionMap actionMap = panel.getActionMap();
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, false), up);
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, false), down);
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, false), left);
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, false), right);
        
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0, false), up);
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_S, 0, false), down);
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, false), left);
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, false), right);
        
        actionMap.put(up, new PlayerAction(this, player, 0, -10));
        actionMap.put(down, new PlayerAction(this, player, 0, +10));
        actionMap.put(left, new PlayerAction(this, player, -10, 0));
        actionMap.put(right, new PlayerAction(this, player, +10, 0));
    }
    
    public void repaint() {
        drawingPanel.repaint();
    }
    
    public class DrawingPanel extends JPanel {

        private static final long serialVersionUID = 1L;
        
        private final Player player;
        
        public DrawingPanel(Player player) {
            this.player = player;
            this.setPreferredSize(new Dimension(600, 600));
        }
        
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            Graphics2D g2d = (Graphics2D) g;
            drawBoard(g2d);
            drawPlayer(g2d);
        }

        private void drawBoard(Graphics2D g2d) {
            g2d.setColor(Color.BLACK);
            g2d.fillRect(0, 0, getWidth(), getHeight());
        }

        private void drawPlayer(Graphics2D g2d) {
            g2d.setColor(player.getColor());
            g2d.fill(player.getPosition());
        }
        
    }
    
    public class PlayerAction extends AbstractAction {
        
        private static final long serialVersionUID = 1L;

        private final ExampleGUI frame;
        
        private final Player player;
        
        private final Point moveDirection;
        
        public PlayerAction(ExampleGUI frame, Player player, int x, int y) {
            this.frame = frame;
            this.player = player;
            this.moveDirection = new Point(x, y);
        }

        @Override
        public void actionPerformed(ActionEvent event) {
            player.move(moveDirection);
            frame.repaint();
        }
        
    }
    
    public class Player {
        
        private final Color color;
        
        private Rectangle position;
        
        public Player() {
            this.color = Color.WHITE;
            this.position = new Rectangle(300, 300, 20, 80);
        }
        
        public void move(Point point) {
            position.x += point.x;
            position.y += point.y;
        }

        public Color getColor() {
            return color;
        }

        public Rectangle getPosition() {
            return position;
        }
        
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM