2016-04-07 13 views
0

Bir Simon Says tarzı oyun yapıyorum, dört renkli kareler var ve bilgisayar bir sıra yapıyor, sonra bunu kopyaladınız vb. Ve istediğim noktadayım bazı daha gelişmiş özellikler eklemek için. Baktığım şu anki özellik, kullanıcıların istedikleri renk panellerini gerçek renklerini değiştirmek ve birbirlerinden ayrı ayrı değiştirebilmek.Bir çalışan örneği değişkenini ayrı bir sınıfta düzenleyin ve güncelleyin

Diğer her şeyi korurken JColorChooser aracılığıyla yeni bir renge geçmek için 'renk panellerini' nasıl alabilirim?

Şu anda birkaç farklı sınıfa ayrıldım ve bunların hepsinin iletişim kurmasını ve düzgün çalışmasını sağlayan sorunlarım var.

Ana sınıfı (Yalnızca bir pasajı) :

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

} 

Menüm kodu (menü çubuğu oluşturur ve eylemleri uygulayan): Renk değiştirme kodu evine

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

Eylem sınıfı:

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

cevap

0

Sınıflarınızı iletmek için arabirimleri kullanın. Örneğin; o parametre olarak bir arayüz almalı böylece ColorModeAction ihtiyaçları renklerini değiştirmek için renkleri değiştirmek mümkün olan:

public interface ColorChanger { 

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

Simonish o arabirimini uygulayan olun: menüye parametre olarak

public class Simonish implements ActionListener, MouseListener, ColorChanger { 

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

Geçidi Simonish ve new ColorModeAction("Color Mode") hareket kurucuya. Sonra ColorChanger'u ColorModeAction parametresine bir parametre olarak geçirin.

public class Menu extends JMenuBar { 

    ... 
    private JMenuItem colorMode; 
    ... 

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

Ve yeni ColorModeAction: Tamamen çalışan kod değil,

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) 

    } 
} 

Sana fikrim var.

+0

Hızlı cevap için teşekkürler! Sanırım anladım. Bu gece bunu deneyeceğim. – link270

+0

Yardımlarınız için mutluyuz. Arayüz ile iletişimin neden daha iyi bir yaklaşım olduğunu anlamak için "gevşek bağlantı" anahtar sözcüğüyle arama yapabilirsiniz. – rdonuk

+1

Tekrar teşekkürler, kendi araştırmamla birlikte bazı deneme yanılma yoluyla öğrenmeyi seviyorum, ancak bazen sıkışıp kaldım ve ne araştırma yapacağım hakkında hiçbir fikrim yok, bu yüzden rehberlik için teşekkürler. – link270

İlgili konular