1

我有我希望目前只有两个问题。我在之前问过的一个问题上得到了帮助,但现在我遇到了不同的问题。我现在的问题是我需要将排序数组打印到 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);
            }
4

1 回答 1

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 扫描仪。还记得在完成后关闭您的扫描仪。

于 2013-11-10T21:49:28.383 回答