簡體   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