1

最近、私はスペース インベーダーを Java で複製して、Java およびプログラミング言語全般を使用したアプリケーションの開発について学習できるようにしようとしています。ただし、JFrame で小さな問題が発生しました。ウィンドウ用に宣言した背景色が保持されず、点滅してからデフォルトに戻ります。これが私のコードです:

import javax.imageio.ImageIO;`
import java.io.*;`
import javax.swing.*;`
import java.awt.*;`
import java.awt.image.*;`
import java.awt.image.ImageObserver;`
import java.awt.event.*;`

public class Invaders extends JPanel{

    public static int x = 40;
    public static int y = 345;
    public static int h = 20;
    public static int k = 180;
    public static int move = 1;
    static final Invaders m = new Invaders();

    public static void main(String[] args){

        final JFrame frame = new JFrame("Movement of 2d Shapes");
        frame.setSize(404,390);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(m);
        frame.setBackground(Color.BLACK);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        Action actionRight = new AbstractAction(){
            public void actionPerformed(ActionEvent actionRightEvent){
                if(x <= 350){
                    x += 10;
                    m.repaint();
                };
            }
        };

        Action actionLeft = new AbstractAction(){
            public void actionPerformed(ActionEvent actionLeftEvent){
                if(x >= 10){
                    x -= 10;
                    m.repaint();
                };
            }
        };

        KeyStroke right = KeyStroke.getKeyStroke("RIGHT");
        KeyStroke left = KeyStroke.getKeyStroke("LEFT");

        InputMap inputMap = m.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
        inputMap.put(right, "RIGHT");
        inputMap.put(left, "LEFT");
        m.getActionMap().put("RIGHT", actionRight);
        m.getActionMap().put("LEFT", actionLeft);

    }

    @Override
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        draw(g);
        cpu_move(m);
    }

    public void cpu_move(Invaders m){ 
        if(h == 0){
            move = 0;
        }else if(h == 375){
            move = 1;
        }
        if(move == 0){
            try {
                Thread.sleep(60);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            h += 5;
            m.repaint();
        }else if(move == 1){
            try {
                Thread.sleep(60);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            h -= 5;
            m.repaint();
        };
    }

    public void draw(Graphics g){
        try{
            g.drawImage(ImageIO.read(getClass().getResource(
                 "images/Ship.jpg")), x, y, 35, 23, Color.BLACK, null);
            g.drawImage(ImageIO.read(getClass().getResource(
                 "images/Alien.jpg")), h, k, 28, 20, Color.BLACK, null);
        }catch(IOException k){
            Component temporaryLostComponent = null;
            JOptionPane.showMessageDialog(temporaryLostComponent, 
                  "one or more image files missing or corrupt");
        }
    }
}

背景色の宣言の何が問題になっていますか? コンパイル時にエラーはありませんが、それでもこれは実行されます。私は何を間違っていますか?

4

2 に答える 2

1

次を試してください:

frame.getContentPane().add(m);
m.setBackground(Color.BLACK);

すべてのフレームを埋めるframe.setBackground(Color.BLACK);ためではなく。Invaders m

あなたの背景は画像で黒になります。

于 2013-11-08T18:50:13.183 に答える