Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

[大至急]KeyListenerが使えません…

学校の課題にてテトリスを作っているのですがタイトル画面のスタートボタンを押すと始まるという風にしたいのですが始まったときKeyListenerが反応せずブロックの移動をすることができません
時間もなく焦っていますのでここで質問させていただきました
分かる方よろしくお願いします
※一部コードは載せていません


import java.awt.*;
import javax.swing.*;


public class Main4 extends JFrame {

    static int blockSize = 20;
    int blocks[][] = new int[23][31];
    int level = 1;
    JLabel leve = new JLabel("レベル" + level);
    JLabel time = new JLabel("残り    秒");
    private int times = 0;
    Timer t;
    Timer timer;
    Animation RPanel = new Animation();
    JLabel Icon;
    Panel LPanel = new Panel();

    public Main4() {
        Container contentPane = getContentPane();
        GameTitle p1 = new GameTitle();
        contentPane.add(p1);
        setResizable(false);
        setBounds(100, 100, 1000, 700);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        new Main4();
    }

    public void change() {
        getContentPane().removeAll();
        JLabel ll = new JLabel();
        LPanel.setSize(500, 700);
        LPanel.setBackground(Color.BLACK);

        RPanel.setSize(500, 700);
        RPanel.setBackground(Color.WHITE);
        RPanel.setLayout(null);

        new level();
        leve.setHorizontalAlignment(SwingConstants.CENTER);
        leve.setBounds(198, 0, 100, 50);
        leve.setFont(new Font("Serif", Font.BOLD, 20));

        time.setHorizontalAlignment(SwingConstants.CENTER);
        time.setBounds(394, 0, 100, 50);
        time.setFont(new Font("Serif", Font.BOLD, 20));

        ImageIcon icon1 = new ImageIcon("image/test.png");
        Icon = new JLabel(icon1);
        Icon.setBounds(81, 0, 338, 236);
        ll.add(Icon);
        RPanel.add(Icon);

        RPanel.add(leve);
        RPanel.add(time);

        getContentPane().setLayout(new GridLayout(1, 2));
        getContentPane().add(LPanel);
        getContentPane().add(RPanel);
        validate();//更新
        repaint();//再描画
    }

    //タイトル
    class GameTitle extends JPanel {
        GameTitle() {
            setLayout(null);
            //ボタン生成
            JButton b1 = new JButton("start");
            add(b1);
            b1.setBounds(450, 420, 100, 50);
            //ボタンが押されたら
            b1.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    change();
                    new movetime();
                }
            });
            setVisible(true);
        }
    }

    class Panel extends JPanel {
        Color col;
        int x;
        int y;
        int verticalNum;
        int horizontalNum;
        int rx, ry;

        kabe kabeL = new kabe(Color.WHITE, 1, 1, 30, 1);
        kabe kabeR = new kabe(Color.WHITE, 22, 1, 30, 1);
        kabe kabeF = new kabe(Color.WHITE, 2, 30, 1, 21);
        MoveBlock fall = new MoveBlock(Color.WHITE, 12, 1, 1, 1);

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponents(g);
            g.setColor(Color.black);
            g.fill3DRect(0, 0, getWidth(), getHeight(), true);
            kabeL.drawkabe(g);
            kabeR.drawkabe(g);
            kabeF.drawkabe(g);
            //            fall.drawkabe(g);
            g.fillRect(x * (blockSize + 1) + (blockSize + 1) * verticalNum,
                    y * (blockSize + 1) + (blockSize + 1) * horizontalNum, blockSize, blockSize);
        }

        Panel() {
            this.addKeyListener(new MoveByKey());
            this.setFocusable(true);

            Timer timer = new Timer(200, fall);
            timer.start();
        }

        class MoveBlock implements ActionListener {

            MoveBlock(Color c, int _x, int _y, int _verticalNum, int _horizontalNum) {
                col = c;
                x = _x;
                y = _y;
                verticalNum = _verticalNum;
                horizontalNum = _horizontalNum;
                blocks[x][y] = 1;
                rx = x * (blockSize + 1);
                ry = y * (blockSize + 1);
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                if (blocks[x][y + 2] == 0) {
                    ry += blockSize + 1;
                    blocks[x][y] = 0;
                    blocks[x][y + 1] = 1;
                    y++;
                }

                repaint();
                if (times == 0) {
                    timer.stop();
                }
            }
        }

        public class MoveByKey implements KeyListener {
            @Override
            public void keyPressed(KeyEvent e) {
                System.out.println("test");
                if (e.getKeyCode() == KeyEvent.VK_LEFT) {
                    rx -= blockSize + 1;
                    blocks[x][y] = 0;
                    blocks[x - 1][y] = 1;
                    x--;
                } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
                    rx += blockSize + 1;
                    blocks[x][y] = 0;
                    blocks[x + 1][y] = 1;
                    x++;
                } else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                    ry += blockSize + 1;
                    blocks[x][y] = 0;
                    blocks[x][y + 1] = 1;
                    y++;
                }
                repaint();
            }
    }

    public class kabe {
        Color col;
        int x;
        int y;
        int verticalNum;
        int horizontalNum;

        kabe(Color c, int _x, int _y, int _verticalNum, int _horizontalNum) {
            col = c;
            x = _x;
            y = _y;
            verticalNum = _verticalNum;
            horizontalNum = _horizontalNum;
        }

        public void drawkabe(Graphics g) { //描画

            for (int i = 0; i < verticalNum; i++)
                for (int j = 0; j < horizontalNum; j++) {
                    blocks[j + x][i + y] = 1;
                    g.setColor(col);
                    g.fill3DRect(x * (blockSize + 1) + (blockSize + 1) * j, y * (blockSize + 1) + (blockSize + 1) * i,
                            blockSize, blockSize, true);
                }
        }
    }

    class rectBlock {
        int x = 0;
        int y = 0;
        int verticalNum = 1;
        int horizontalNum = 1;
        int blockPosi[][] = {
                { 1, 1, 0, 0 },
                { 1, 1, 0, 0 },
                { 0, 0, 0, 0 },
                { 0, 0, 0, 0 }
        };
    }

    class Animation extends JPanel {

        int size = 10;

        Animation() {
            times = getTimes() + 1;

        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.BLACK);
            for (int i = 0; i < 30; i++) {
                g.fillRect(100 + (10 * i), 478, size, size);
            }
        }

        public int getTimes() {
            int a = 0;
            switch (level) {
            case 1:
                a = 60;
                break;

            default:
                break;
            }

            return a;
        }

    }

    //カウントダウンタイマー
    class movetime {

        movetime() {

            movetimer();
        }

        public void movetimer() {
            t = new Timer(1000, new move());
            t.start();
        }

    }

    class move implements ActionListener {
        int x = 81;
        int y = 10;

        @Override
        public void actionPerformed(ActionEvent e) {
            times = times - 1;
            String txt = "残り" + times + "秒";
            time.setText(txt);

            Icon.setLocation(x, y + 5);
            RPanel.add(Icon);
            validate();
            repaint();
            y = y + 5;

            if (times == 0) {
                t.stop();
            }
        }

    }
}

2

回答

180

閲覧

2件の回答

評価

0

まずはガイドラインを読んでこよう。

評価

0

以下などでしょうか。参考に。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=19433&forum=12
https://oshiete.goo.ne.jp/qa/996623.html

回答する

ログインしていません。

ログインしなくても回答はできますが、ログインすると、質問・回答の管理、更新があった場合のメールでの通知を受けることができます。 アカウントをお持ちでない方は会員登録を行ってください。

ユーザ名匿名