2015-03-08 2 views
1

Я пытаюсь создать сетку 12x12 из JButtons, а затем случайным образом назначить десять кнопок, чтобы под ними был «золотой самородок», каждый раз, когда вы запускаете программу. Когда вы нажимаете кнопку, на которой есть самородок, она должна изменить текст кнопки на «NUGGET», и если вы нажмете на тот, у которого нет самородок, он должен изменить текст на «Пропущенный!». Я установил сетку и кнопки, но я не могу понять, что происходит с ActionListener, и почему она только меняет первую кнопку (которая будет [1] [1] в мульти -мерный массив), независимо от того, какую кнопку вы нажмете, она просто изменит кнопки [1] [1] на «Пропущенные!». Вот код для моего JPanel:ActionListener для многомерного массива работает только для первой кнопки?

import java.awt.Color; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import java.util.Random; 

import javax.swing.*; 

public class Panel extends JPanel{ 

    private JButton[][]buttons; 
    private final int size = 12; 
    private GridLayout experimentLayout; 
    private int clicked; 
    private int k = 0; 
    private int j = 0; 
    private int max = 11; 
    private int min = 0; 
    private int randomNum1; 
    private int randomNum2; 
    public Random rand = new Random(); 

    public Panel(){ 

     experimentLayout = new GridLayout(size,size); 
     setLayout(experimentLayout); 
     buttons = new JButton[size][size]; 

     for (int k = 0; k < size; k++) { 
       for (int j = 0; j < size; j++) { 
       buttons[k][j] = new JButton("o"); 
       add(buttons[k][j]); 

       } 
     } 

     ArrayList<JButton> nuggetButtonList = new ArrayList<JButton>(); 
     for(int i = 0; i < 10; i++){ 
      randomNum1 = rand.nextInt((max - min) + 1) + min; 
      randomNum2 = rand.nextInt((max - min) + 1) + min; 
      nuggetButtonList.add((JButton)buttons[randomNum1][randomNum2]); 
      System.out.println(nuggetButtonList); 
     } 




     ActionListener listener = new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
        if(nuggetButtonList.contains((JButton)e.getSource())){ 
         buttons[k][j].setText("NUGGET."); 
        } else { 
         buttons[k][j].setText("Missed!"); 
        } 
      } 
     }; 

     buttons[k][j].addActionListener(listener); 

    } 

} 

И код драйвера:

import java.awt.BorderLayout; 
import java.awt.Dimension; 

import javax.swing.JFrame; 


public class Driver { 

    public static void main(String[] args) { 

     JFrame myFrame = new JFrame("Dig for nuggets~!"); 
     myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Panel nuggetGraphics = new Panel(); 
     nuggetGraphics.setPreferredSize(new Dimension(1500, 1000)); 
     myFrame.getContentPane().add(nuggetGraphics, BorderLayout.CENTER); 
     myFrame.pack(); 
     myFrame.setVisible(true); 

    } 

} 

ответ

2

Похоже, вы повторно рандомизации вещи каждый раз, когда ActionListener нажимается, который не звучит как то, что ваш требование требует.

Вместо этого вы должны назначить случайные кнопки один раз в своем конструкторе, а не в ActionListener. Возможно, создайте List<JButton>, который содержит все выбранные кнопки самородок, а затем в ActionListener, если исходный JButton удерживается в списке (if nuggetButtonList.contains(sourceButton)), затем покажите пользователю, что это кнопка «Самородок».

Например, рассмотреть вопрос о предоставлении вашей программе дваList<JButton>:

List<JButton> allButtons = new ArrayList<>(); 
List<JButton> selectedButtons = new ArrayList<>(); 

Первый держать все кнопки, только вторые выбранные из них.

В своем конструкторе заполните список allButtons при создании своих кнопок и добавьте свой ActionListener к каждой кнопке. Затем перетасуйте список allButtons и используйте перетасованный список, чтобы заполнить список выбранных кнопок. например,

MyListener myListener = new MyListener(); 
    for (int i = 0; i < SIZE; i++) { 
    for (int j = 0; j < SIZE; j++) { 
     JButton button = new JButton(DEFAULT); 
     button.addActionListener(myListener); 
     add(button); 
     allButtons.add(button); 
    } 
    } 
    Collections.shuffle(allButtons); 
    for (int i = 0; i < NUGGET_COUNT; i++) { 
    selectedButtons.add(allButtons.get(i)); 
    } 

то в вашем ActionListener, просто проверить, если кнопка находится в выбранном списке:

public void actionPerformed(ActionEvent e) { 
    JButton source = (JButton) e.getSource(); 
    if (selectedButtons.contains(source)) { 
     source.setText(NUGGET); 
     source.setBackground(Color.yellow); 
    } else { 
     source.setText(MISSED); 
    } 
    } 
+0

Большое спасибо, что делает много смысла. Я попытался изменить его, но он все еще не работает, но я не уверен, почему. – Sarah

+0

@Sarah: '' он по-прежнему не работает ''не дает нам достаточно информации, чтобы мы могли помочь. Что именно делает ваш код сейчас? –

+0

@Sarah: Обязательно ** создайте ** свои JButtons ** перед **, чтобы попытаться рандомизировать или добавить их в Список. В противном случае вы добавляете ничего, кроме нулей в список! –

Смежные вопросы