不知道在哪里放逻辑循环[java]

时间:2018-01-27 19:14:35

标签: java element do-while

我目前正在尝试为学校建立一个小型计划。如果单击复选框,则应显示其他元素。我在python中学到了你需要一个while循环,因为程序需要再次检查相同的行,你检查框是否被选中,但如果我放了一个循环,整个程序就不会启动。我不明白为什么。

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

public class test extends JFrame {
    private JCheckBox moredetailscheck;
    private JTextField inputfielduser;

    public static void main(String[] args) {
        test venster = new test();
        venster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        venster.setSize(800, 600);
        venster.setVisible(true);
        venster.setTitle("true");
        venster.setResizable(false);
    }
    public test() {
        setLayout(new FlowLayout());
        moredetailscheck = new JCheckBox("checkbox", false);
        add(moredetailscheck);
        inputfielduser = new JTextField(15);
        while(true) {   // you want to let the program keep going over these lines
        if(moredetailscheck.isSelected()) {
            add(inputfielduser);
        } 
    }
}

2 个答案:

答案 0 :(得分:1)

  

如果单击复选框,则应显示其他元素。

因此,您可以将一个侦听器附加到JCheckBox,这里是一个ItemListener,它在JCheckBox的状态发生变化时响应。

  

我在python中学到了你需要一个while循环,因为程序需要再次检查相同的行,你检查框是否被选中

这称为"民意调查"并且需要线性控制台程序,您需要不断地从用户那里获得输入,再次使用线性控制台程序。时尚。在这些类型的程序中,程序员可以完全控制程序代码流,但这不是你想要的。

  

但如果我放一个循环,整个程序就不会开始。我不明白为什么。

那是因为你现在正在使用一个事件驱动的GUI库,那里有Swing库,并且通过在事件线程上调用while (true)循环,你完全阻止它,渲染你的GUI无用。您的程序正在启动,但它无法构建GUI,绘制自己或监听事件。

解决方案:

  • 摆脱while (true)循环。同样,它对于简单的控制台程序很有用,但在这种情况下却不行。
  • 将ItemListener添加到JCheckBox。您可以在check box tutorial
  • 中了解如何执行此操作
  • 不要继续向GUI添加项目。使用CardLayout交换视图。可以在此处找到该教程:CardLayout tutorial
  • 甚至更好,在启动时在GUI上拥有所有GUI项目,但使用JCheckBox状态启用/禁用项目。

另外,您需要学习并使用Java naming conventions。变量名都应以较低的字母开头,而类名以大写字母开头。了解并遵循这一点将使我们能够更好地理解您的代码,并使您能够更好地理解其他代码。

例如:

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

public class TestCheckBox extends JPanel {
    private static final long serialVersionUID = 1L;
    private JCheckBox moreDetailsCheck = new JCheckBox("More Details", false);
    private JTextField inputFieldUser = new JTextField(15);

    public TestCheckBox() {
        inputFieldUser.setEnabled(false);
        add(moreDetailsCheck);
        add(inputFieldUser);

        // add a listener to the JCheckBox
        moreDetailsCheck.addItemListener(e -> {
            // if checkbox selected, enable the text field. else disable it
            inputFieldUser.setEnabled(e.getStateChange() == ItemEvent.SELECTED);
        });
    }

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

        JFrame frame = new JFrame("Test CheckBox");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

答案 1 :(得分:0)

在Java中,AWT启动一个线程来自动处理事件;你只需让main完成,程序就会继续运行,直到你拨打System.exit。但是,您确实需要事件处理程序,其中存在任意数量的教程。

(顺便提一下,你的无限循环甚至在展示你的JFrame之前就会出现。)