java - 不确定将逻辑循环放在哪里[java]

标签 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);
        } 
    }
}

最佳答案

If you click on a checkbox it should show other elements.

因此,您可以将一个监听器附加到 JCheckBox,这里是一个 ItemListener,它会在 JCheckBox 的状态更改时做出响应。

I learned in python that you need a while loop because the program needs to go over the same lines again where you check if the box is checked

这称为“轮询”,线性控制台程序需要它,您需要再次以“线性”方式不断获取用户的输入。在这些类型的程序中,程序员可以完全控制程序代码流,但这不是您想要的。

but if i put a loop the whole program won't start. I don't understand why.

那是因为您现在使用的是事件驱动的 GUI 库(即 Swing 库),并且通过在事件线程上调用 while (true) 循环,您可以完全阻止它,从而呈现您的图形界面没用。您的程序正在启动,但无法构建 GUI、绘制自身或监听事件。

解决方案:

  • 摆脱 while (true) 循环。同样,它对于简单的控制台程序很有用,但在这种情况下则不然。
  • 将 ItemListener 添加到您的 JCheckBox。您可以在 check box tutorial 中了解如何执行此操作。
  • 不要不断向 GUI 中添加项目。使用 CardLayout 交换 View 。该教程可以在这里找到: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());
    }
}

关于java - 不确定将逻辑循环放在哪里[java],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48479556/

相关文章:

java - 在 Java 中元素编号应该从 0 还是 1 开始?

c - 为什么在 C 语言中退出 do-while 循环请求输入后程序会崩溃?

java - while 循环忽略我的参数。基本 10 以上 0 以上

c - 使用循环语句进行 C 练习 : Write code to reverse numbers with do-while statement

java - 仅当其他字段为 false 时才验证字段

java - 是否可以同时运行嵌入式 AND 客户端服务器 derby 数据库?

web - 如何在 dart 中创建自定义元素?

c - 链表缺失元素

java - 如何获取要包含在 Okta java-api 调用的类路径中的 jar 文件列表?

java - 使用 equals() 从多个 Maven 模块中具有相对 schemaLocation 的模式生成 JAXB 类