У меня есть 9 JButtons в ArrayList. Но я не могу изменить Lable of the Buttons в любом случае ,,, - PullRequest
0 голосов
/ 01 мая 2011
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

class One implements ActionListener
{
    JFrame frame = new JFrame();
    ArrayList<JButton> myB = new ArrayList<JButton>();
    Panel p = new Panel();
    Dimension d = new Dimension(20, 20);
    String s = "", s1 = "";
    JButton B = new JButton(), B1 = new JButton();

    public void addButtons()
    {
        for(int i = 0; i < 9; i++)
        {
            myB.add(new JButton());         //IMP
        }
    }

    public void display()
    {
        frame.getContentPane().add(p);
        for(JButton btn : myB)
        {
            btn.setPreferredSize(d);
            p.add(btn);        //IMP
        }
        p.setLayout(new FlowLayout(FlowLayout.CENTER, 20, 5));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200, 300);
        frame.setVisible(true);
    }

    public void GamePlay()
    {
        s = JOptionPane.showInputDialog(null, "HUMAN or COMPUTER");
        if(s.equals("HUMAN"))
        {
            for(JButton B1 : myB)
            {// advanced for loop
                B1.addActionListener(this);
            }
        }
        else
        {
            s1 = "COMPUTER";
        }
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
        // TODO Auto-generated method stub
        System.out.println(" action performed!!");
        B1.setText("X");
    }
}

public class Two
{
    public static void main(String[] args)
    {
        One a = new One();
        a.addButtons();
        a.display();
        a.GamePlay();
    }
}

Ответы [ 3 ]

4 голосов
/ 01 мая 2011

По сути, @mKorbel прав: вы не видите, как кнопка меняется, потому что она никогда не добавлялась в пользовательский интерфейс.Кроме того, есть несколько правил, которые вы не выполняли

  • . Не смешивайте AWT с компонентами Swing, используйте Swing последовательно.Их легко узнать по префиксу J
  • в соответствии с соглашениями о присвоении имен в java
  • при выборе именных описаний (против B, s1, ...)
  • не вызывать setPreferredSize
  • форматировать код, чтобы сделать его легко читаемым (против слишком большого количества белых линий, несовместимых отступов)
2 голосов
/ 01 мая 2011

добавить B1 = new JButton() к Panel p = new Panel();

1 голос
/ 01 мая 2011

Я думаю, что вы путаете B1 с кнопкой в ​​списке и вызываете setText не той кнопкой.Если вы хотите изменить метку нажатой кнопки, быстрое решение будет.

public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub

    System.out.println(" action performed!!");
    B1 = (JButton)e.getSource();
    B1.setText("X");

}

Вы должны были разделить ActionListener на другой класс, чтобы избежать путаницы, подобной этой.Чтобы применить текст для всех кнопок в списке, вы можете попробовать что-то вроде этого.

class MyActionListener implements ActionListener{

    ArrayList<JButton> buttonList;
    public MyActionListener(ArrayList<JButton> a) {
        buttonList = a;
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        for(JButton jb: buttonList) {
            jb.setText("X");
        }
    }
}


class One {
    MyActionListener buttonListener;
    ...
    public void GamePlay() {
    ...
        if(s.equals("HUMAN")) {
            buttonListener = new MyActionListener(myB);
            for(JButton B1 : myB) {
                B1.addActionListener(buttonListener);
        }
    ...
    }

}

По сути, создайте свой собственный слушатель действий, содержащий соответствующие данные, чтобы делать то, что вы хотите,

...