0

左、右、上、下のボタンを使用して画面上でボールを動かす宿題に取り組んでいます。さらに、緑と赤のボタンを使用してボールの色を変更します。何らかの理由で、リスナーから「Btns.RightListener を型に解決できません」というエラーが表示されます。理由はわかりません。

どんな助けでも大歓迎です。

これは私がこれまでに持っているものです...

メインクラス:

import javax.swing.*;

@SuppressWarnings("serial")
public class Lab2Main extends JFrame {


        Lab2Main()
    {
        setTitle("Lab 2 - Move The Ball");
        Lab2 p = new Lab2();
        add(p);
    }

    public static void main (String[] args) { 

        Lab2 frame = new Lab2();
        frame.setTitle("Lab 2 - Move The Ball");
        frame.setSize(450, 500);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

    }   

}

リスナーを保持するクラス:

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

@SuppressWarnings("serial")
public class Lab2 extends JFrame { 

    Btns canvas = new Btns();
    JPanel panel = new JPanel();

    JButton jbtL = new JButton("Left");
    JButton jbtR = new JButton("Right");
    JButton jbtU = new JButton("Up");
    JButton jbtD = new JButton("Down");
    JButton jbtRd = new JButton("Red");
    JButton jbtG = new JButton("Green");

    Lab2()
        {
        setLayout(new BorderLayout());

        panel.add(jbtR);
        panel.add(jbtL);
        panel.add(jbtU);
        panel.add(jbtD);
        panel.add(jbtRd);
        panel.add(jbtG);

        this.add(canvas, BorderLayout.CENTER);
        this.add(panel, BorderLayout.SOUTH);

        jbtL.addActionListener(new Btns.LeftListener(canvas));
        jbtR.addActionListener(new Btns.RightListener(canvas));
        jbtU.addActionListener(new Btns.UpListener(canvas));
        jbtD.addActionListener(new Btns.DownListener(canvas));
        jbtRd.addActionListener(new Btns.RdColorChangeListener(canvas));
        jbtG.addActionListener(new Btns.GColorChangeListener(canvas));
        }
}   

ボタンを保持するクラス:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class  Btns extends JPanel
{
    int radius = 5;
    int x = -1;
    int y = -1;

        protected void paintComponent(Graphics g) {
            if (x < 0 || y < 0)
            {
                x = getWidth() / 2 -radius;
                y = getHeight() / 2 -radius;
            }
            super.paintComponent(g);
            g.setColor(Color.RED);
            g.fillOval(5,10,25,25);
    } 
    public void moveLeft()
    { 

             x -= 5; 
             this.repaint(); 
        } 

        public void moveRight()
        { 

            x += 5; 
            this.repaint(); 
        } 
        public void moveUp()
        { 

            y -= 5; 
            this.repaint(); 
        } 

        public void moveDown()
        { 
            y += 5; 
            this.repaint(); 
        } 


        public class LeftListener implements ActionListener
        { 
            private Btns canvas; 

            LeftListener(Btns canvas) 
            { 
              this.canvas = canvas; 
            } 

             public void actionPerformed(ActionEvent e)
            { 
             canvas.moveLeft(); 
            } 


        public class RightListener implements ActionListener
        { 
            private Btns canvas; 

            RightListener(Btns canvas) 
            { 
                this.canvas = canvas; 
            } 

            public void actionPerformed(ActionEvent e)
            { 
              canvas.moveRight(); 
            } 
        } 


         class UpListener implements ActionListener
         { 
            private Btns canvas; 

            UpListener(Btns canvas) 
            { 
                this.canvas = canvas; 
            } 

            public void actionPerformed(ActionEvent e)
            { 
                canvas.moveUp(); 
            } 
        } 



        class DownListener implements ActionListener
        { 
            private Btns canvas; 

            DownListener(Btns canvas) 
            { 
                this.canvas = canvas; 
            } 

            public void actionPerformed(ActionEvent e)
            { 
             canvas.moveDown(); 
            } 
        }

        class RdColorChangeListener implements ActionListener 
            { 
            private Btns canvas; 

            RdColorChangeListener(Btns canvas) { 
                this.canvas = canvas; 
            } 
            public void actionPerformed(ActionEvent e){ 
                canvas.setColor(Color.RED); 
                repaint();
            } 

        class GColorChangeListener implements ActionListener 
            { 
            private Btns canvas; 

            GColorChangeListener(Btns canvas) { 
                this.canvas = canvas; 
            } 
            public void actionPerformed(ActionEvent e){ 
                canvas.setColor(Color.GREEN); 
                repaint();
            } 
       }
    }
  }


        public void setColor(Color red) {
        // TODO Auto-generated method stub

        }
}
4

2 に答える 2

2

あなたが行っているように新しいインスタンスを作成するには、クラスBtns.RightListener(および実際には、のすべての内部クラスBtns)をクラスとして宣言する必要があります。各クラス宣言に修飾子をstatic追加するだけです。staticそれ以外の場合は、次のようにする必要があります。

jbtL.addActionListener(canvas.new Btns.LeftListener(canvas));

ああ、@antlersoft が指摘しているように、クラスのネストを修正する必要があります。

于 2013-02-05T21:28:07.653 に答える
2

Btns.LeftListener の終了 } が欠落しているため、Eclipse は RightListener が LeftListener の内部にあると見なします。

于 2013-02-05T21:28:19.120 に答える