Java 循环完成后,如何禁用JButton

Java 循环完成后,如何禁用JButton,java,Java,嗨,你好,这是我的主课。如果我单击按钮,例如。轻松按钮,它将出现另一种形式,我使我的循环。不管怎么说,这是一个商标测试。如果循环达到9以上(currentItem>9),请参阅下一段代码,它将再次设置主类,该类具有EASY按钮,现在我的问题是,一旦完成循环,如何禁用EASY按钮 package rebuzz; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Rebuzz extend

嗨,你好,这是我的主课。如果我单击按钮,例如。轻松按钮,它将出现另一种形式,我使我的循环。不管怎么说,这是一个商标测试。如果循环达到9以上(currentItem>9),请参阅下一段代码,它将再次设置主类,该类具有EASY按钮,现在我的问题是,一旦完成循环,如何禁用EASY按钮

package rebuzz;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Rebuzz extends JFrame implements ActionListener
{

public static void main (String args [])
{
    new Rebuzz().setVisible(true);
}
public Rebuzz() 
{
    super("sample");
    setSize(400,300);
    setResizable(false);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    Menu();
}

/*private void Easy()
{
    JButton next = new JButton("Next");
    setLayout(new FlowLayout(1,200,25));
    next.addActionListener(this);
    JLabel pic = new JLabel();
    pic.setIcon(new ImageIcon("1easy.gif"));
    add(pic);
    add(answer);
    add(next);
}*/

    public void Menu()
         {
            easyButton = new JButton("easy");//EASY BUTTON
            easyButton.setActionCommand("easy");
            setLayout(new FlowLayout(1,200,25));
            easyButton.addActionListener(this);

            mediumButton = new JButton ("Medium");//MEDIUM BUTTON
            mediumButton.setActionCommand("medium");
            setLayout(new FlowLayout(1,200,25));
            mediumButton.addActionListener(this);

            insaneButton = new JButton ("Insane");//INSANE BUTTON
            insaneButton.setActionCommand("insane");
            setLayout(new FlowLayout(1,200,25));
            insaneButton.addActionListener(this);
            add(easyButton);
            add(mediumButton);
            add(insaneButton);

        }

@Override
public void actionPerformed(ActionEvent e) 
{
    String open = e.getActionCommand();

    if (open.equals("easy"))
    {
        Easy easy = new Easy();
        this.setVisible(false);
        easy.setVisible(true);
    }
    else if (open.equals("medium"))
    {
        Medium medium = new Medium();
        this.setVisible(false);
        medium.setVisible(true);
    }
    else if (open.equals("insane"))
    {
        Insane insane = new Insane();
        this.setVisible(false);
        insane.setVisible(true);
    }
}
}
这是我的简单课

package rebuzz;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;


public class Easy extends JFrame implements ActionListener
{
JLabel[] img = new JLabel[11];
JTextField[] answer = new JTextField[11];
String[] rightAnswer = {"cross breed", "forgive and forget", "side show",     "big brother", "cross roads", "quite right", "small talk", "too little too late", "see for yourself", "once in a blue moon"};
ImageIcon[] easy = new ImageIcon[rightAnswer.length];


//int currentItem=0;
int currentItem;
JLabel imageContainer;
JTextField answerContainer;
JButton submit;
JButton home;
JButton back;
String ans;
private String[] args;
//private String[] frame;

public Easy() 
{
    super("Easy Sample");
    setSize(300,400);
    setResizable(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    Easy1();
}

public void Easy1()
{
imageContainer = new JLabel();
for(int x = 0; x < rightAnswer.length ; x++)
{
    System.out.println(Integer.toString(x));//loop output
    easy[x] = new ImageIcon((x+1)+"easy.gif");

}

//JPanel jpanel = new JPanel();

answerContainer = new JTextField(null, 10);
currentItem = 0;
imageContainer.setIcon(easy[currentItem]);
ans = rightAnswer[currentItem];
submit = new JButton("Submit");
home = new JButton("Home");

submit.addActionListener(new java.awt.event.ActionListener() 
{
        public void actionPerformed(java.awt.event.ActionEvent evt) 
        {
            submitActionPerformed(evt);
        }
});

home.addActionListener(new java.awt.event.ActionListener()
{
        public void actionPerformed(java.awt.event.ActionEvent evt)
        {
            homeActionPerformed(evt);

        }
});
back.addActionListener(new java.awt.event.ActionListener()
{
        public void actionPerformed(java.awt.event.ActionEvent evt)
        {
            backActionPerformed(evt);

        }
});

setLayout(new FlowLayout(1,20,10));
add(imageContainer);
add(answerContainer);
add(submit);
add(home);

}        
@Override
public void actionPerformed(ActionEvent e) 
{

}

private void submitActionPerformed(java.awt.event.ActionEvent evt)
{
    if (answerContainer.getText().equalsIgnoreCase(ans))
    {
            if (currentItem < 9)
              {
                  JOptionPane.showMessageDialog(null, "No."+(currentItem+1)+" Easy Puzzle is correct!","Great!",JOptionPane.PLAIN_MESSAGE);
                  currentItem++;
                  imageContainer.setIcon(easy[currentItem]);
                  ans = rightAnswer[currentItem];
                  answerContainer.setText("");

              }
            else
            {
                JOptionPane.showMessageDialog(null,"Done!");
                this.setVisible(false);
                Rebuzz.main(args);
                Rebuzz rebuzz = new Rebuzz();
                rebuzz.easy = false;
            }
    }
    else if (answerContainer.getText().equals(""))
    {
        JOptionPane.showMessageDialog(null,"Please enter your answer.","Errrr",JOptionPane.ERROR_MESSAGE);
    }
    else 
    {
        JOptionPane.showMessageDialog(null, "Incorrect Answer!");
        answerContainer.setText("");
    }
}

    }
  private void homeActionPerformed(ActionEvent evt) 
    {
        Rebuzz.main(args);
        this.setVisible(false);
    }

} 
package-rezz;
导入java.awt.FlowLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.ImageIcon;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JOptionPane;
导入javax.swing.JTextField;
公共类Easy extends JFrame实现ActionListener
{
JLabel[]img=新JLabel[11];
JTextField[]答案=新的JTextField[11];
String[]rightAnswer={“杂交品种”、“原谅和忘记”、“配角秀”、“老大哥”、“十字路口”、“完全正确”、“闲聊”、“太少太晚”、“自己看”、“千载难逢”};
ImageIcon[]easy=新的ImageIcon[rightAnswer.length];
//int currentItem=0;
int当前项目;
JLabel图像容器;
JTextField应答器容器;
JButton提交;
杰布顿之家;
钮扣背;
字符串ans;
私有字符串[]args;
//私有字符串[]帧;
公共轻松()
{
超级(“简易样品”);
设置大小(300400);
可设置大小(真);
setDefaultCloseOperation(关闭时退出);
setLocationRelativeTo(空);
Easy1();
}
公开无效1()
{
imageContainer=newjlabel();
for(int x=0;x
禁用按钮很容易——您只需调用
myButton.setEnabled(true)
,但这并不是您的问题所在。相反,你的问题,提炼到最简单的本质,是:

如何根据B类状态的更改(currentItem的值>9)更改A类的状态(按钮启用或未启用)

我看到了两种方法中的一种:

  • 当currentItem>9时,让类B调用类a上的方法,或者
  • 通过侦听currentItem的值或其他一些状态变量,让类A侦听对类A状态的更改
我自己,我更喜欢第二条路线,因为这允许类B在不了解类A的情况下沿着它的快乐之路前进,一个体面的方法是让类A向类B添加一个侦听器,当属性状态发生变化时,该侦听器会收到通知。我会考虑使用PropertyChangeListener。B可以创建一个方法,
setCurrentItem(int currentItem)
,并在其中通知其属性更改支持,这将通知所有侦听器currentItem已更改。它还需要一个
int getCurrentItem()
方法,以便a可以查询B的状态

例如:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.*;

public class WatchState extends JPanel {
    private A a = new A();
    private B b = new B(a);

    public WatchState() {
        setLayout(new BorderLayout());
        add(a);
        add(b, BorderLayout.PAGE_END);
    }

    private static void createAndShowGui() {
        WatchState mainPanel = new WatchState();

        JFrame frame = new JFrame("WatchState");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}

class A extends JPanel {
    // a String for the property name
    public static final String CURRENT_ITEM = "current item";
    private int currentItem = 0;

    public A() {
        add(new JButton(new AbstractAction("Press Me to Advance Current Item") {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                int temp = getCurrentItem();
                temp++;
                setCurrentItem(temp);
            }
        }));
        setBorder(BorderFactory.createTitledBorder("Class A"));
    }

    public int getCurrentItem() {
        return currentItem;
    }

    public void setCurrentItem(int currentItem) {
        int oldValue = this.currentItem;
        int newValue = currentItem;
        this.currentItem = currentItem;
        firePropertyChange(CURRENT_ITEM, oldValue, newValue);
    }    

}

class B extends JPanel {
    public static final int MAX_CURRENT_ITEM = 9;
    private A a;
    private JLabel currentItemStateLabel = new JLabel("00");
    private JButton someButton = new JButton("Some Button");

    public B(A a) {
        this.a = a;
        a.addPropertyChangeListener(A.CURRENT_ITEM, new CurrentItemListener());
        add(someButton);
        add(new JLabel("Current Item: "));
        add(currentItemStateLabel);
        setBorder(BorderFactory.createTitledBorder("Class B"));
    }

    private class CurrentItemListener implements PropertyChangeListener {
        @Override
        public void propertyChange(PropertyChangeEvent evt) {
            int newValue = (int) evt.getNewValue();
            currentItemStateLabel.setText(String.format("%02d", newValue));
            if (newValue > MAX_CURRENT_ITEM) {
                someButton.setEnabled(false);
            }
        }
    }


}
if (open.equals("easy"))
    {
        Easy easy = new Easy();
        this.setVisible(false);
        easy.setVisible(true);
        game_state_easy = true;
    }

使全局变量表示游戏状态(其中三个),即
boolean game\u state\u easy=false

例如:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.*;

public class WatchState extends JPanel {
    private A a = new A();
    private B b = new B(a);

    public WatchState() {
        setLayout(new BorderLayout());
        add(a);
        add(b, BorderLayout.PAGE_END);
    }

    private static void createAndShowGui() {
        WatchState mainPanel = new WatchState();

        JFrame frame = new JFrame("WatchState");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}

class A extends JPanel {
    // a String for the property name
    public static final String CURRENT_ITEM = "current item";
    private int currentItem = 0;

    public A() {
        add(new JButton(new AbstractAction("Press Me to Advance Current Item") {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                int temp = getCurrentItem();
                temp++;
                setCurrentItem(temp);
            }
        }));
        setBorder(BorderFactory.createTitledBorder("Class A"));
    }

    public int getCurrentItem() {
        return currentItem;
    }

    public void setCurrentItem(int currentItem) {
        int oldValue = this.currentItem;
        int newValue = currentItem;
        this.currentItem = currentItem;
        firePropertyChange(CURRENT_ITEM, oldValue, newValue);
    }    

}

class B extends JPanel {
    public static final int MAX_CURRENT_ITEM = 9;
    private A a;
    private JLabel currentItemStateLabel = new JLabel("00");
    private JButton someButton = new JButton("Some Button");

    public B(A a) {
        this.a = a;
        a.addPropertyChangeListener(A.CURRENT_ITEM, new CurrentItemListener());
        add(someButton);
        add(new JLabel("Current Item: "));
        add(currentItemStateLabel);
        setBorder(BorderFactory.createTitledBorder("Class B"));
    }

    private class CurrentItemListener implements PropertyChangeListener {
        @Override
        public void propertyChange(PropertyChangeEvent evt) {
            int newValue = (int) evt.getNewValue();
            currentItemStateLabel.setText(String.format("%02d", newValue));
            if (newValue > MAX_CURRENT_ITEM) {
                someButton.setEnabled(false);
            }
        }
    }


}
if (open.equals("easy"))
    {
        Easy easy = new Easy();
        this.setVisible(false);
        easy.setVisible(true);
        game_state_easy = true;
    }
然后在菜单中:

    easyButton = new JButton("easy");//EASY BUTTON
    easyButton.setActionCommand("easy");
    setLayout(new FlowLayout(1,200,25));
    easyButton.addActionListener(this);
    if (game_state_easy){
       //disable the button
    }

代码中没有循环。要禁用按钮很容易,可以调用
myButton.setEnabled(false)
,或者如果按钮有指定的操作,则对按钮的操作进行相同的调用。@Xentros实际上有一个for循环easy类。但它不是一个更改currentItem的for循环,也不应该有。@气垫船上满是鳗鱼,但有问题,op有问题,最后的问题“代码中没有循环”不是原因。