2016-04-07 14 views
0

私はSimon Saysスタイルのゲームを作っています。四色の四角形があり、コンピュータがシーケンスを行い、それをコピーして、いくつかの高度な機能を追加する。私が見ている現在の機能は、ユーザーの意志でカラーパネルの実際の色を変更し、それぞれを個別に変更できるようにすることです。実行中のインスタンス変数を編集して別のクラスに更新する

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); 
} 
} 

コードを変更する色を収容するActionクラス:

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"); 
} 
} 

答えて

0

クラスを通信するためにインターフェイスを使用します。例えば;メニューにパラメータとして

public class Simonish implements ActionListener, MouseListener, ColorChanger { 

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

Simonish、および​​を移動:

public interface ColorChanger { 

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

がSimonishは、そのインターフェイスを実装してください:それは色を変更することができ、どのパラメータとしてのインタフェースを取る必要がありますので、色を変更する必要があるColorModeActionコンストラクタに渡します。次に、パラメータとしてColorModeActionColorChangerを渡します。

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) 

    } 
} 

それは完全に動作するコードはありませんが、私はあなたのアイデアを得たと思います。

+0

素早くお返事ありがとうございます!私はそれを得ると思う。私は今夜​​これを試してみる。 – link270

+0

お寄せください。キーワードを「疎結合」で検索すると、インタフェースを介した通信がより良いアプローチである理由を理解できます。 – rdonuk

+1

もう一度、私は自分の研究と一緒にいくつかの試行錯誤を経て学習するのが好きですが、時々私は立ち往生して何を研究するのか分からないので、指導に感謝します。 – link270

関連する問題