Java 从另一个类禁用JButton

Java 从另一个类禁用JButton,java,swing,jbutton,Java,Swing,Jbutton,我试图禁用按钮,同时使用输入验证程序。我想在文本字段为空时禁用按钮。我是这样做的 AddEmployee.class public class AddEmployee extends javax.swing.JInternalFrame { public JButton getJButton() { return addEmployeeButton; } public void setJButton(JButton buttonObject)

我试图禁用按钮,同时使用输入验证程序。我想在文本字段为空时禁用按钮。我是这样做的

AddEmployee.class

public class AddEmployee extends javax.swing.JInternalFrame
{
    public JButton getJButton()
    {
        return addEmployeeButton;
    }

    public void setJButton(JButton buttonObject)
    {
        buttonObject = addEmployeeButton;
    }
}
ValidateComponents.class

public class ValidateComponents extends InputVerifier
{
   public void disable(JButton name)
   {
       AddEmployee employee = new AddEmployee();
       employee.setJButton(name);
       name.setEnabled(false);
   }

@Override
public boolean verify(JComponent input) 
{
    String tf = null;
    String ta = null;
    String name = input.getName(); //GETTING THE NAME OF THE COMPONENT
    if(input instanceof JTextField)
    {
        tf = ((JTextField) input).getText();

        if(name.equals("tfLastName") || name.equals("tfFirstName") || name.equals("tfMiddleName") || name.equals("tfNickname") || name.equals("tfGuardianContactName"))
        {
            if(tf.trim().length() == 0 || tf.equals(""))
            {
                input.setBackground(Color.PINK);//Set background color to pink if false.
                input.setToolTipText("Fields cannot left blank");
                return false;//Return false if the component need to keep focus
            }
       }
   }
}
在我的if条件下调用
disable()
方法是否有效?因此,如果文本字段为空,它可以调用。任何帮助都将不胜感激!谢谢:)

更新:

public class ValidateComponents extends InputVerifier
{
      private AddEmployee employee = new AddEmployee();
      JButton myButton;
      public void disable(JButton name, boolean disable)
      {
        employee.setJButton(name);
        name.setEnabled(!disable);
        myButton = name;
      }

@Override
public boolean verify(JComponent input) 
{
    String tf = null;

    String name = input.getName(); //GETTING THE NAME OF THE COMPONENT
    if(input instanceof JTextField)
    {
        tf = ((JTextField) input).getText();

        if(name.equals("tfLastName") || name.equals("tfFirstName") || name.equals("tfMiddleName") || name.equals("tfNickname") || name.equals("tfGuardianContactName"))
        {
            boolean valid = tf.trim().length() > 0;

            disable(myButton, !valid);
            if(!valid)
            {
                input.setBackground(Color.PINK);//Set background color to pink if false.
                input.setToolTipText("Fields cannot left blank");
                return false;//Return false if the component need to keep focus
            }
}
}
}

您的类应该稍微修改一下,以便更加灵活

private AddEmployee employee = new AddEmployee();

public void disable(JButton name, boolean disable){
    employee.setJButton(name);
    name.setEnabled(!disable); //NOT because yours is called disable and Swing's is called enabled ;)
}
由此,您可以轻松更改按钮的状态。问题是,为什么需要将其添加到
AddEmployee
?使用您的验证器创建一个布尔值(每个示例有效),它将告诉您是否应该启用按钮。如果不这样做,您将永远无法重新激活该按钮

if(name.equals("tfLastName") || name.equals("tfFirstName") || name.equals("tfMiddleName") || name.equals("tfNickname") || name.equals("tfGuardianContactName"))
        {
            boolean valid = tf.trim().length() > 0; //Change the sign here and no need for the following > || tf.equals("")
            disable(myButton, !valid); // YOU NEED TO HAVE THE BUTTON INSTANCE SOMEWHERE, IN THE CONSTRUCTOR OR A SETTER...
            if(!valid){
                input.setBackground(Color.PINK);//Set background color to pink if false.
                input.setToolTipText("Fields cannot left blank");
                return false;//Return false if the component need to keep focus
            } else {
                // ADD THE VALID CASE HERE
            }
       }
请注意,您应该将要检查的实例发送给验证器并将其存储在集合中,然后对于
输入
,检查集合中是否有相同的实例(例如列表),这将比检查名称更干净;)


您只需在创建ValidateComponents实例时设置该按钮。

您的类应该稍微修改一下,以便更加灵活

private AddEmployee employee = new AddEmployee();

public void disable(JButton name, boolean disable){
    employee.setJButton(name);
    name.setEnabled(!disable); //NOT because yours is called disable and Swing's is called enabled ;)
}
由此,您可以轻松更改按钮的状态。问题是,为什么需要将其添加到
AddEmployee
?使用您的验证器创建一个布尔值(每个示例有效),它将告诉您是否应该启用按钮。如果不这样做,您将永远无法重新激活该按钮

if(name.equals("tfLastName") || name.equals("tfFirstName") || name.equals("tfMiddleName") || name.equals("tfNickname") || name.equals("tfGuardianContactName"))
        {
            boolean valid = tf.trim().length() > 0; //Change the sign here and no need for the following > || tf.equals("")
            disable(myButton, !valid); // YOU NEED TO HAVE THE BUTTON INSTANCE SOMEWHERE, IN THE CONSTRUCTOR OR A SETTER...
            if(!valid){
                input.setBackground(Color.PINK);//Set background color to pink if false.
                input.setToolTipText("Fields cannot left blank");
                return false;//Return false if the component need to keep focus
            } else {
                // ADD THE VALID CASE HERE
            }
       }
请注意,您应该将要检查的实例发送给验证器并将其存储在集合中,然后对于
输入
,检查集合中是否有相同的实例(例如列表),这将比检查名称更干净;)



创建ValidateComponents实例时只需设置按钮。

这与SWT(一个与Swing完全不同的工具包)有什么关系?禁用
方法有点奇怪。
employee
实例将在方法执行结束时被“销毁”。。。我看不出这有什么意义method@AxelH哪一部分我错了?我没有得到将被销毁的员工实例。你能解释更多吗?
employee
在方法中声明,因此它将只存在于这个block语句中。在方法结束时,
employee
实例将被销毁,因为它不再在任何地方被引用(您不能使用它,因为您没有“返回它”)PS:关于在条件中调用
disable
,为什么不?但是如果文本字段不是空的,您是否想过重新激活按钮;)这与SWT(一个与Swing完全不同的工具包)有什么关系?
disable
方法有点奇怪。
employee
实例将在方法执行结束时被“销毁”。。。我看不出这有什么意义method@AxelH哪一部分我错了?我没有得到将被销毁的员工实例。你能解释更多吗?
employee
在方法中声明,因此它将只存在于这个block语句中。在方法结束时,
employee
实例将被销毁,因为它不再在任何地方被引用(您不能使用它,因为您没有“返回它”)PS:关于在条件中调用
disable
,为什么不?但是如果文本字段不是空的,您是否想过重新激活按钮;)你好我试过你的解决办法。但我认为调用
disable
时,它的方法有问题?因为我无法进入我的GUI:(嘿,我也注意到了。我对吗?我创建了一个
JButton myButton
并在disable参数中传递了这个参数?我在disable方法之外创建了这个参数。请参阅我更新的帖子。我将更新它。我将注册
addEmployeeButton
作为输入验证程序?如果我错了,请纠正我:当我在ValidateCo中传递
JButton按钮
时组件。我的
setInputVerifier(new ValidateComponents());
希望传递一个
JButton
:(我不知道是哪个原因。但我仍然无法进入我的GUI。我遵循了您的代码,它不会引发任何错误:(您好!我尝试了您的解决方案。但我认为在调用
禁用
时,该方法存在问题,因为我无法进入GUI。)(嘿,我也注意到了。我对吗?我创建了一个
JButton myButton
并在disable参数中传递了这个参数?我在disable方法之外创建了这个参数。请参阅我更新的帖子。我将更新它。我将注册
addEmployeeButton
作为输入验证程序?如果我错了,请纠正我:当我在ValidateCo中传递
JButton按钮
时组件。我的
setInputVerifier(new ValidateComponents());
希望传递一个
JButton
:(我不知道是哪个原因。但我仍然无法进入我的GUI。我遵循了您的代码,它不会引发任何错误:(