I am working on a homework assignment where a ball is moved around the screen using left, right, up and down buttons. In addition, the ball’s color is changed using green and red buttons. For some reason, my listeners are giving me the error “Btns.RightListener cannot be resolved to a type”. I am not sure why.
Any help would be appreciated.
This is what I have so far…
Main Class:
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);
}
}
Class holding listeners:
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));
}
}
Class holding the buttons:
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
}
}
The class
Btns.RightListener(and, in fact, all the inner classes ofBtns) need to be declared asstaticclasses in order to create new instances like you are doing. Just add thestaticmodifier to each class declaration. Otherwise, you would need to do something like this:Oh, and as @antlersoft points out, you need to correct the class nesting.