【问题标题】:GUI Freezes and Output to JTextField from user inputGUI 冻结并从用户输入输出到 JTextField
【发布时间】:2013-11-22 14:54:45
【问题描述】:

我希望目前只有两个问题。我在之前问过的一个问题上得到了帮助,但现在我遇到了不同的问题。我现在的问题是我需要将一个排序数组打印到 JTextField 中。我没有关于如何对数组进行排序的问题,我只是想在按下 Bubble Sort 按钮时帮助如何让数组打印到 JTextField。目前,当我按下按钮时,它会冻结。它冻结在这一行。

list.add(Integer.valueOf(input.nextInt()));

请帮忙谢谢。

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

public class Sorting {

private JFrame frame;
private JTextArea inputArea;
private JTextField outputArea;
ArrayList<Integer> list = new ArrayList<Integer>();
Scanner input = new Scanner(System.in);

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Sorting window = new Sorting();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public Sorting() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 450, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setTitle("Sorting");
    frame.getContentPane().setLayout(null);

    JButton bubbleButton = new JButton("Bubble Sort");
    bubbleButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            list.add(Integer.valueOf(input.nextInt()));
//              for(int i = 0; i < list.size(); i++){
//                  
//              }

        }

    });

    bubbleButton.setBounds(10, 211, 114, 23);
    frame.getContentPane().add(bubbleButton);

    JButton mergeButton = new JButton("Merge Sort");
    mergeButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

        }
    });
    mergeButton.setBounds(305, 211, 114, 23);
    frame.getContentPane().add(mergeButton);

    JButton quickButton = new JButton("Quick Sort");
    quickButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

        }
    });
    quickButton.setBounds(163, 211, 114, 23);
    frame.getContentPane().add(quickButton);

    inputArea = new JTextArea();
    inputArea.setBounds(10, 36, 414, 51);
    frame.getContentPane().add(inputArea);

    outputArea = new JTextField();
    outputArea.setEditable(false);
    outputArea.setBounds(10, 98, 414, 59);
    frame.getContentPane().add(outputArea);
    outputArea.setColumns(10);

    JLabel label = new JLabel("Please Enter 5 Numbers");
    label.setHorizontalAlignment(SwingConstants.CENTER);
    label.setBounds(10, 11, 414, 14);
    frame.getContentPane().add(label);

          }
}

需要什么:

  • GUI 将包含三个按钮,分别代表排序方法 o Bubble o Quick o Merge
  • GUI 将有一个区域供用户输入 5 个数字进行排序。将它们存储在数组或数组列表中
  • GUI 将有一个区域显示排序的每个步骤。这可以是一个区域,每次完成一个步骤时,它会替换显示每个步骤的行或几行。

冒泡排序按钮中的当前更新:

 public void actionPerformed(ActionEvent arg0) {
            userInput = inputArea.getText();
            Scanner input = new Scanner(userInput);
            list.add(Integer.valueOf(input.nextInt()));
            for(int i = 0; i < list.size(); i++){
                outputArea.setText(userInput);
            }

【问题讨论】:

  • 不要阻塞 EDT(事件调度线程)——当这种情况发生时,GUI 将“冻结”。而不是调用 Thread.sleep(n) 实现 Swing Timer 用于重复任务或 SwingWorker 用于长时间运行的任务。有关详细信息,请参阅Concurrency in Swing

标签: java user-interface arraylist jtextfield


【解决方案1】:

不要尝试将扫描仪输入与 Swing GUI 混合使用。您的问题是通过这样做,您正在捆绑 Swing 事件线程,在您的程序等待扫描仪输入时冻结您的 GUI。

最好通过 GUI 获取输入,最好是通过 JTextComponents(如 JTextFields),或者如果必须通过 JOptionPane,只要它以与 Swing 事件线程配合得很好的方式完成。


编辑
您的评论:

  • GUI 将包含三个按钮,分别代表排序方法 o Bubble o Quick o Merge
  • GUI 将有一个区域供用户输入 5 个数字进行排序。将它们存储在数组或数组列表中
  • GUI 将有一个区域显示排序的每个步骤。这可以是一个区域,每次完成一个步骤时,它会替换显示每个步骤的行或几行。

您知道您可以为您的 GUI 提供 5 个 JTextAreas,每个要输入的数字一个。


编辑 2
你说:

所以我也在尝试一些新的东西。不确定是否正确。因此,当按下按钮时,我将其放入动作侦听器中: userInput = inputArea.getText();扫描仪输入 = 新扫描仪(用户输入);你说的是这个吗?

这可以工作,但如果你这样做,你将需要一个 JTextArea,并且用户必须知道他们的数字应该由一个空格分隔。扫描仪再次在这里可以很好地工作,因为您可以在其上调用nextInt() 并获取您的数据(只要数据是数字,并且输入的数字数量正确)。但同样,除非在某些特殊情况下,否则不要使用带有 GUI 的 System.in 扫描仪。完成后请记得关闭您的扫描仪。

【讨论】:

  • 好的,那么这是否必须更改行 list.add(Integer.valueOf(input.nextInt()));拿走扫描仪时,我是否只使用 inputArea,然后必须使用 inputArea 确定 ArrayList 的大小?
  • @user2929005:当然,您可以使用 inputArea。考虑让用户输入的数字用一个空格分隔,然后一旦你得到那个字符串,你可以拆分它,或者你可以在字符串上使用扫描仪(只要你避免使用带有 System.in 的扫描仪)。
  • 我希望我能理解你刚才所说的一切。我想我想太多了。
  • @user2929005:将该信息作为编辑放入您的问题中。请参阅我的答案的编辑。
  • @user2929005:见 编辑 2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 2020-10-11
  • 2021-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-25
相关资源
最近更新 更多