在单独的类中编辑和更新正在运行的实例变量

时间:2016-04-07 18:06:41

标签: java action jcolorchooser

我正在制作一个西蒙说的风格游戏,有四个彩色方块,计算机执行一个序列,然后你复制它等等,我想要添加一些更高级的功能。我正在研究的当前功能是寻找用户将改变颜色面板的实际颜色,并能够彼此单独更改它们。

如何通过JColorChooser将“颜色面板”更改为新颜色,同时保留其他所有设置?

目前,我将它分成了几个不同的类,并且在让它们全部通信并且正常工作方面遇到了问题。

主类(只有一个片段):

public class Simonish implements ActionListener, MouseListener {

private ColorPanel colorPanel[] = new ColorPanel[4];
private ScorePanel scorePanel = new ScorePanel();
private Menu menuBar = new Menu();
private JPanel gameBoard = new JPanel();
private Random rand = new Random();
private ArrayList<ColorPanel> compSeq = new ArrayList<ColorPanel>();
private Iterator<ColorPanel> iter;
private JFrame frame = new JFrame();
private boolean playerTurn = false;
private int speed = 500;

public Simonish(Color[] colors){
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel pane = (JPanel)frame.getContentPane();
    pane.setLayout(new BorderLayout());

    gameBoard.setLayout(new GridLayout(2,2));
    gameBoard.setPreferredSize(new Dimension(400,400));

    for (int i=0;i<colorPanel.length;i++){
        colorPanel[i] = new ColorPanel(colors[i]);
        colorPanel[i].addMouseListener(this);
        gameBoard.add(colorPanel[i]);
    }

    scorePanel.addStartListener(this);

    frame.setJMenuBar(menuBar);
    pane.add(scorePanel, BorderLayout.NORTH);
    pane.add(gameBoard, BorderLayout.CENTER);

    frame.setLocationRelativeTo(null);
    frame.pack();
    frame.setVisible(true);

}

我的菜单代码(构建菜单栏并实现操作):

public class Menu extends JMenuBar {

private JMenuBar menuBar = new JMenuBar();

private JMenu settings = new JMenu("Settings");
private JMenu stats = new JMenu("Stats");
private JMenu help = new JMenu("Help");

private JMenuItem chooseColor = new JMenuItem(new ChooseColorAction("Choose Color"));
private JMenuItem colorMode = new JMenuItem(new ColorModeAction("Color Mode"));
private JMenuItem hScore = new JMenuItem("High Scores");
private JMenuItem history = new JMenuItem("History");
private JMenuItem about = new JMenuItem("About");
private JMenuItem rules = new JMenuItem("Rules");

public Menu(){
    this.add(settings);
    this.add(stats);
    this.add(help);

    settings.add(chooseColor);
    settings.add(colorMode);

    stats.add(hScore);
    stats.add(history);

    help.add(about);
    help.add(rules);
}
}

用于容纳换色代码的动作类:

public class ColorModeAction extends AbstractAction {

public ColorModeAction(String name){
    super(name);
}

@Override
public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    Color[] colors = {Color.CYAN, Color.BLACK, Color.WHITE, Color.GREEN};
    //new Simonish(colors);
    //JOptionPane.showMessageDialog(null, "Color Mode");
}
}

1 个答案:

答案 0 :(得分:0)

使用界面来传达您的课程。例如; ColorModeAction需要更改颜色,因此它应该将接口作为能够更改颜色的参数:

public interface ColorChanger {

    public void changeColor(int index, Color newColor);
} 

让Simonish实现该界面:

public class Simonish implements ActionListener, MouseListener, ColorChanger  {

    public void changeColor(int index, Color new Color) {
        //Change the given panel's color
    }
}

Simonish作为参数传递给菜单,然后将new ColorModeAction("Color Mode")移至构造函数。然后将ColorChanger作为参数传递给ColorModeAction

public class Menu extends JMenuBar {

    ...
    private JMenuItem colorMode;
    ...

    public class Menu(ColorChanger colorChanger) {
         colorMode = new JMenuItem(new ColorModeAction(colorChanger, "Color Mode"));
    }
}

新的ColorModeAction

public class ColorModeAction extends AbstractAction {

    private ColorChanger colorChanger;

    public ColorModeAction(ColorChanger colorChanger, String name) {
        super(name);

        this.colorChanger = colorChanger;
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        Color[] colors = { Color.CYAN, Color.BLACK, Color.WHITE, Color.GREEN };

        colorChanger.changeColor(index, Color)

    }
}

这不是完全可行的代码,但我认为你有了这个想法。