ActionListener не может ссылаться на массив из открытого класса? - PullRequest
1 голос
/ 23 ноября 2011

Почему public void actionPerformed (ActionEvent event), colorButton[] подсвечивается, поскольку не может найти символ или переменную?

Как мне его отладить? Я пытаюсь сделать colorButton[] определенным в public void actionPerformed (ActionEvent event)

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ColorOptionsPanel extends JPanel {
private final int WIDTH = 350, HEIGHT = 100, FONT_SIZE = 20;
private final int NUM_COLORS = 5;
private Color [] color = new Color[NUM_COLORS];
private JLabel heading;
private JRadioButton [] colorButton= new JRadioButton[color.length];

// ------------------------------------------------------------------
// Sets up a panel with a label at the top and a set of radio buttons
// that control the background color of the panel.
// ------------------------------------------------------------------
public ColorOptionsPanel ()
{

// Set up heading and colors
heading = new JLabel ("Choose the background color!");
heading.setFont (new Font ("Helvetica", Font.BOLD, FONT_SIZE));
color[0] = Color.yellow;
color[1] = Color.cyan;
color[2] = Color.red;
color[3] = Color.green;
color[4] = Color.magenta;

colorButton[0]=new JRadioButton("Yellow",true);
colorButton[1]=new JRadioButton("Cyan");
colorButton[2]=new JRadioButton("Red");
colorButton[3]=new JRadioButton("Green");
colorButton[4]=new JRadioButton("Magenta");

// Instantiate a ButtonGroup object and a ColorListener object

ButtonGroup group=new ButtonGroup();
ColorListener listener = new ColorListener();
 for(int i = 0; i <colorButton.length; i++)
 {group.add(colorButton[i]);
 colorButton[i].addActionListener(listener);
 colorButton[i].setBackground(Color.white);
 colorButton[i].addActionListener(listener);
   add(colorButton[i]);
 }

add(heading);
setBackground (Color.yellow);
setPreferredSize (new Dimension (WIDTH, HEIGHT));
 }






// Set up the panel

// Group the radio buttons, add a ColorListener to each,
 // set the background color of each and add each to the panel.
}
// **************************************************************
// Represents the listener for the radio buttons.
// **************************************************************
private class ColorListener implements ActionListener
{
// --------------------------------------------------------
// Updates the background color of the panel based on
// which radio button is selected.
// --------------------------------------------------------

public void actionPerformed (ActionEvent event)
{

Object source = event.getSource();


if (source==colorButton[i])
{setBackground(colorButton[i]);
}   



}



}
}

}

Ответы [ 4 ]

1 голос
/ 23 ноября 2011

Поскольку ColorListener является закрытым, его нельзя увидеть нигде снаружи, поэтому просто измените его на вложенный класс класса ColorOptionsPanel.Таким образом, приватные поля ColorOptionsPanel будут видны из ColorListener.

public class ColorOptionsPanel extends JPanel {
    private JRadioButton [] colorButton= new JRadioButton[color.length];
    //....
    private class ColorListener implements ActionListener{
    // --------------------------------------------------------
    // Updates the background color of the panel based on
    // which radio button is selected.
    // --------------------------------------------------------
    public void actionPerformed (ActionEvent event){
        Object source = event.getSource();
        if (source==colorButton[i]){setBackground(colorButton[i]);}   
    }
}
1 голос
/ 23 ноября 2011

Вы можете передать каждый элемент массива colorButton в качестве аргумента конструктору ColorListener class:

private class ColorListener implements ActionListener
{
    private JRadioButton rdoButton;
    public ColorListener(JRadioButton rdoButton)
    {
        this.rdoButton = rdoButton;
    }

    @Override
    public void actionPerformed(ActionEvent event)
    {
         Object source = event.getSource();
         if(source == rdoButton) //...
    }
}

и затем вы можете использовать его как:

ColorListener listener = new ColorListener(colorButton[i]);
colorButton[i].addActionListener(listener);

или, альтернативно, вы можете использовать ActionCommand (см. в этом примере ).

0 голосов
/ 23 ноября 2011
  1. colorButton является приватным для ColorOptionsPanel
  2. ColorListener является внешним по отношению к ColorOptionsPanel, поэтому может иметь доступ только к открытым членам ColorOptionsPanel
0 голосов
/ 23 ноября 2011

Вы не инициализировали i в методе actionPerformed().Держите внимание.

...