【问题标题】:Java Listener to Check if the boolean of a Object is trueJava侦听器检查对象的布尔值是否为真
【发布时间】:2019-01-25 08:27:56
【问题描述】:

我有一个名为 menuBarObject 的对象。它的类隐藏了一个名为“changed”的布尔值。如果单击子菜单,则返回 true。 在我的 Mainclass 中,我构建了 menuBarObject。我可以通过一种名为“hasChanged”的方法获取更改的值。如果主方法完成了它的工作,它将所有一个名为“contentIsBuild”的方法再次设置为 false。 如果更改返回 true,我可以编写一个活跃的侦听器吗?我可以在 menuBar 类中做到这一点。但我不喜欢那个解决方案。

我的代码放入那个监听器:

if (newCustomerIsSelected) {
    //Content Area   
    JPanel contentArea = new JPanel();
    //Selection from Sub Menu
    String selectedName = menuBarObject.getSelectedCustomer();
    //Selected Customer Object / Instanze of selectecCustomer Class!
    SelectedCustomer selectedCustomerObject = new SelectedCustomer(selectedName);
    //The seleted Customer
    Customer selectedCustomer = selectedCustomerObject.getSelectedCustomer();
    //Name of selected Customer
    String dataOfSelectedCustomer = selectedCustomer.toString();
    //Creating the content Area
    setCustomerContentArea(dataOfSelectedCustomer, contentArea);
    //Call Menu Bar that content is build
    menuBarObject.contentIsBuild(true);
}

【问题讨论】:

  • 你为什么要这样做?只需将其添加到单击项目时处理操作的侦听器中
  • 在 menuBar 类中设置已更改。但是菜单栏不应该负责构建内容。会更容易,我知道。 ^^
  • 创建自己的线程,在其上使用 while(!changed) 循环,不断检查“已更改”布尔变量的值
  • 我建议您看看 ChangeListener,它已经在 API 中可用 - for example
  • “点击了子菜单”是什么意思?是当单击一个按钮时会产生一个子菜单或一个窗口,任何单击它都会将changed 字段设置为true?还是别的什么?

标签: java swing listener


【解决方案1】:

您可以使用 MouseListener (https://docs.oracle.com/javase/tutorial/uiswing/events/mouselistener.html) 来监听点击,而不是使用 changed 来记录点击(假设您的子菜单扩展了 Component 类,例如是 JPanel 或类似的东西)。

在您实例化子菜单的类中,您将执行以下操作:

submenu.addMouseListener(new MouseListener()
        {

            @Override
            public void mouseReleased(MouseEvent e)
            {
                // Do nothing
            }

            @Override
            public void mousePressed(MouseEvent e)
            {
                // Do nothing
            }

            @Override
            public void mouseExited(MouseEvent e)
            {
                // Do nothing
            }

            @Override
            public void mouseEntered(MouseEvent e)
            {
                // Do nothing
            }

            @Override
            public void mouseClicked(MouseEvent e)
            {
                if (newCustomerIsSelected) {
                    //Content Area   
                    JPanel contentArea = new JPanel();
                    //Selection from Sub Menu
                    String selectedName = menuBarObject.getSelectedCustomer();
                    //Selected Customer Object / Instanze of selectecCustomer Class!
                    SelectedCustomer selectedCustomerObject = new SelectedCustomer(selectedName);
                    //The seleted Customer
                    Customer selectedCustomer = selectedCustomerObject.getSelectedCustomer();
                    //Name of selected Customer
                    String dataOfSelectedCustomer = selectedCustomer.toString();
                    //Creating the content Area
                    setCustomerContentArea(dataOfSelectedCustomer, contentArea);
                    //Call Menu Bar that content is build
                    menuBarObject.contentIsBuild(true); // N.B. This would no longer need to set the changed variable to false.
                }
            }
        });

如果changed 对您的应用程序很重要,那么您可以考虑使用 PropertyChangeSupport (https://docs.oracle.com/javase/tutorial/uiswing/events/propertychangelistener.html) 来触发您自己的事件。这可能最好放在设置changed = true 的同一类中。

这看起来像:

private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);

... // Other code in class

public void addChangeListener(PropertyChangeListener listener) {
    this.pcs.addPropertyChangeListener(listener);
}

...

// In the method which sets changed = true
this.pcs.firePropertyChange(null, null, null) // Args are: Property name, old value and new value - set as necessary

然后在您希望侦听器代码所在的方法中添加:

// object is the name of the instantiation of the class which sets changed = true
object.addChangeListener(new PropertyChangeListener()
        {

            @Override
            public void propertyChange(PropertyChangeEvent evt)
            {
                if (newCustomerIsSelected) {
                    //Content Area   
                    JPanel contentArea = new JPanel();
                    //Selection from Sub Menu
                    String selectedName = menuBarObject.getSelectedCustomer();
                    //Selected Customer Object / Instanze of selectecCustomer Class!
                    SelectedCustomer selectedCustomerObject = new SelectedCustomer(selectedName);
                    //The seleted Customer
                    Customer selectedCustomer = selectedCustomerObject.getSelectedCustomer();
                    //Name of selected Customer
                    String dataOfSelectedCustomer = selectedCustomer.toString();
                    //Creating the content Area
                    setCustomerContentArea(dataOfSelectedCustomer, contentArea);
                    //Call Menu Bar that content is build
                    menuBarObject.contentIsBuild(true);
                }
            }
        });

编辑:修正了错误的方法名称。

【讨论】:

  • 感谢您的回复。但是当我写:“this.pcs.firePropertyChange(changed, false, true)”时,我得到一个错误,因为我不能在这个方法上使用布尔值。
  • 那是因为firePropertyChange的第一个参数是一个String,表示属性事件的名称。您可以存储一个存储名称的属性,例如final String CHANGED_EVENT = "CHANGED_EVENT";。然后 firePropertyChange 将接受参数 (CHANGED_EVENT, false, true)。然后,您可以访问 PropertyChangeEvent evt 以获取属性名称并检查它是否等于 CHANGED_EVENT。如果确实如此,那么您就知道它与您的 changed 变量正在更新有关。
猜你喜欢
  • 1970-01-01
  • 2016-09-19
  • 2012-03-17
  • 2019-08-07
  • 2013-04-02
  • 2011-03-02
  • 2012-08-18
  • 2021-03-12
  • 2019-05-22
相关资源
最近更新 更多