如何从gui按钮激活控制语句?

时间:2016-08-06 04:23:15

标签: java

在这个例子中,为什么如果变量被更改并且按钮是在另一个类中设置的话,方法是否会激活?

public class Printing {

  static boolean print = false;

  public static void main(String[] args){
    new Gui().setVisible(true);
    print();
  }

  public static void print(){
    while (print) {
      System.out.println("true");
    }
  }
}

当按下按钮时,它将boolean打印设置为true方法打印不会激活并开始打印真可以有人告诉我为什么会发生这种情况以及如何解决这个问题。

编写我的代码

我的代码

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

public class Gui extends JFrame {
boolean print = false;
public Gui() {
    initComponents();
}

public static void main(String[] args) {
    Gui gui = new Gui();
    new Gui().setVisible(true);
    gui.Print();
}
public void Print(){
    while(print == true){
        System.out.println("Its true");
    }
}
private void buttonActionPerformed(ActionEvent e) {
   print = true;
}
private void initComponents() {
    button = new JButton();
    Container contentPane = getContentPane();
    button.setText("Push");
    button.addActionListener(e -> buttonActionPerformed(e));
    GroupLayout contentPaneLayout = new GroupLayout(contentPane);
    contentPane.setLayout(contentPaneLayout);
    contentPaneLayout.setHorizontalGroup(
        contentPaneLayout.createParallelGroup()
            .addGroup(contentPaneLayout.createSequentialGroup()
                .addGap(81, 81, 81)
                .addComponent(button, GroupLayout.PREFERRED_SIZE, 219,       GroupLayout.PREFERRED_SIZE)
                .addContainerGap(84, Short.MAX_VALUE))
    );
    contentPaneLayout.setVerticalGroup(
        contentPaneLayout.createParallelGroup()
            .addGroup(GroupLayout.Alignment.TRAILING, contentPaneLayout.createSequentialGroup()
                .addContainerGap(144, Short.MAX_VALUE)
                .addComponent(button)
                .addGap(91, 91, 91))
    );
    pack();
    setLocationRelativeTo(getOwner());
}
private JButton button;

}

2 个答案:

答案 0 :(得分:1)

您的问题中提供的代码甚至无法编译,因此我们无法理解有哪些要求。无论如何,我假设您希望在标志为true时继续打印,因此您需要一个单独的线程来运行打印例程:

public class Printer implements Runnable {

  public volatile boolean keepPrinting;

  public static void main(String... args) {
    Printer printer = new Printer();
    Gui gui = new Gui(printer);
    Thread t = new Thread(printer);
    t.start();
  }

  @Override public void run() {
    while (true) {
      if (keepPrinting) {
        System.out.println("It works!");
      }
    }
  }
}

答案 1 :(得分:1)

没有理由应该这样做。 "而#34;循环肯定导致print()方法继续监视" print"变量用于其状态的更改(除非您打算将print()方法放在后台线程上并让它连续轮询;我不建议这样做)。否则,这将检查一次,然后再次检查,直到您再次明确调用Print()。

为了响应对象状态的变化而调用方法,需要实现Observer pattern。 Java中有许多合理的例子(可在Google上找到);我建议在Java中获取一个例子,如果它是您选择的语言(而不是C#),因为在Java中实现模式在Java中比在C#中更复杂(C#使用< em> events ,这是一个构建在框架内部的原语来支持这个)。基本上,你会得到这样的东西(伪代码):

interface IObserver
{
   void MethodToCall(bool newValue);
}

public class SomeObservers implements IObserver
{
   public void MethodToCall(bool newValue)
   {
      // ...
   }
}

public class ObservedClass
{
   private List<IObserver> observers = new List<IObserver>();
   private bool observedValue;

   public bool getObservedValue() { return observedValue; }

   public bool setObservedValue(bool newValue)
   {
      observedValue = newValue;
      NotifyObservers();
   }

   public void RegisterObserver(IObserver observer)
   {
      observers.Add(observer);
   }

   public void RemoveObserver(IObserver observer)
   {
       observers.Remove(observer);
   }

   public void NotifyObservers()
   {
      // Notify each interested party about the change in the value
      foreach (IObserver observer in observers)
      {
         observer.MethodToCall(observedValue);
      }
   }
}