Как изменить значение jButton при нажатии - PullRequest
0 голосов
/ 02 мая 2018

Я продолжал получать ошибки при компиляции.

Я понятия не имею, как использовать список сгенерированных целых чисел и отобразить его в jButtons после нажатия.

 public static void Random ()
{
    int Rand [] = new int [49];
    for (int b = 0; b < 49; b++)
        Rand [b] = b;

    List<Integer> alist = Arrays.stream(Rand)
                                        .boxed()
                                        .map (x -> x + 1)
                                        .collect (Collectors.toList());                                 

    Collections.shuffle(alist);
}

private class HandleTextField implements ActionListener
{   
   @Override
   public void actionPerformed(ActionEvent event)
   {
       for (int a = 0; a < 49; a++)
       {
        if (event.getSource() == jbArray[a]) 
        {
            //error on this line "alist cannot be resolved to a variable"
            jbArray[a].setText(alist);
        }   
     }
   }
} 

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Во-первых, создание списка неэффективно. Вы создаете массив от 0 до 48, а затем используете поток для увеличения каждого значения на 1 и собираете результат в List, чтобы перемешать его ...

Вы можете либо

for(int i = 1; i < 50;  ++i){
    aList.add(i);
}
Collections.shuffle(aList);

Или используйте Stream, если вы действительно хотите

List<Integer> list = IntStream.range(1, 50).boxed().collect(Collectors.toList());
Collections.shuffle(list);

Затем вам нужно сделать этот список доступным из действия, вы можете либо

  • установить список статической или переменной-члена
  • вернуть список из метода

Я предпочитаю вторую версию

public static List<Integer> Random(){
    List<Integer> list = IntStream.range(1, 50).boxed().collect(Collectors.toList());
    Collections.shuffle(list);
    return list;
}

Отлично, у вас есть список, доступный в методе. Теперь вам просто нужно перебрать каждое значение для каждой кнопки и преобразовать Integer в String. Мне нравится конкатенация за это.

@Override
public void actionPerformed(ActionEvent event)
{
    //Shuffle the values on each buttons
    if(event.getSource() == shuffleButton){
        List<Integer> list = random();
        for(JButton btn : jbArray){
            btn.setText("" + list.remove(0)); //Removing the item is a security to be sure the value will not be used later by mistake.
        }
    }
}

Одним нажатием на кнопку «Перемешать» все кнопки, присутствующие в jbArray, получат свои значения. Это может быть адаптировано для создания длины динамического значения, скажем, динамического числа кнопок.

List<Integer> list = random(jbArray.length);
for(JButton btn : jbArray){
    btn.setText("" + list.remove(0)); //Removing the item is a security to be sure the value will not be used later by mistake.
}

, где random стало:

public static List<Integer> random(int range){
    List<Integer> list = IntStream.range(1, range).boxed().collect(Collectors.toList());
    Collections.shuffle(list);
    reutrn list;
}
0 голосов
/ 02 мая 2018

Итак, у вас есть две проблемы:

  1. alist доступен только внутри вашего метода Random, потому что это локальная переменная, и она была объявлена ​​там. Чтобы решить эту проблему, вам нужно объявить alist с большей областью действия , здесь является объяснением локальных переменных.

  2. setText требует ввода типа String, а alist - это не строка, а список. Если вы хотите получить доступ к элементу alist, вы можете использовать alist.get (yourIndex);

    static List<Integer> alist; //is not in random method so it can be accessed by other methods
    public static void Random ()
    {
    int Rand [] = new int [49];
    for (int b = 0; b < 49; b++)
        Rand [b] = b;
    
    alist = Arrays.stream(Rand)
                                        .boxed()
                                        .map (x -> x + 1)
                                        .collect (Collectors.toList());                                 
    
    Collections.shuffle(alist);
    }
    
    
    private class HandleTextField implements ActionListener
    {   
       @Override
       public void actionPerformed(ActionEvent event)
       {
           for (int a = 0; a < 49; a++)
           {
            if (event.getSource() == jbArray[a]) 
            {
                jbArray[a].setText(alist.get(a)+"");//uses only the element you want rather than all of the list
            }   
         }
       }
    }
    

Надеюсь, это вам поможет!

...