Displaying iteration in each JTextArea

柔情痞子 提交于 2020-01-04 11:39:33

问题


I got 5 JTextareas that stand for output for the sorting I need help regarding displaying or appending iteration in each JTextArea to show the algorithm of sorting.

I have got values of { 5,3,9,7,1,8 }

JTextArea1 |3, 5, 7, 1, 8, 9|
JTextArea2 |3, 5, 1, 7, 8, 9|
JTextArea3 |3, 5, 1, 7, 8, 9|
JTextArea4 |1, 3, 5, 7, 8, 9|
JTextArea5 |1, 3, 5, 7, 8, 9|

My problem is how can I append those values in each textarea.

My code is too long, I'm sorry for that.

My code is not finished yet. I just ended on the button of ascbubble but it can run.

//importing needed packages
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;



public class Sorting extends JPanel
{

    // String needed to contain the values then convert into int
     int int1,int2,int3,int4,int5,temp;

     String str1,str2,str3,str4,str5;

    //Buttons needed 
    JButton ascbubble,descbubble,
            ascballoon,descballoon,
            clear;

    //Output Area of the result sorting
    JTextArea   output1,output2,
                output3,output4,
                output5;

    //Text Field for user to input numbers
    JTextField  input1,input2,
                input3,input4,
                input5;



    Sorting()
    {
        //set color of the background
        setBackground(Color.black);

        //initialize JButton,JTextArea and JTextField       
        //JButton
        ascbubble = new JButton("Ascending Bubble");
        descbubble = new JButton("Descending Bubble");
        ascballoon = new JButton("Ascending Balloon");
        descballoon = new JButton("Descending Balloon");
        clear = new JButton("Clear");

        //JTextArea
        output1 = new JTextArea(" ");
        output2 = new JTextArea(" ");
        output3 = new JTextArea(" ");
        output4 = new JTextArea(" ");
        output5 = new JTextArea(" ");

        //JTextField
        input1 = new JTextField("00");
        input2 = new JTextField("00");
        input3 = new JTextField("00");
        input4 = new JTextField("00");
        input5 = new JTextField("00");

        //SetBounds
        setLayout(null);
        input1.setBounds(120, 50, 30, 20);
        input2.setBounds(170, 50, 30, 20);
        input3.setBounds(220, 50, 30, 20);
        input4.setBounds(270, 50, 30, 20);
        input5.setBounds(320, 50, 30, 20);

        ascbubble.setBounds(50, 120, 150, 40);
        descbubble.setBounds(50, 180, 150, 40);
        clear.setBounds(210, 140, 100, 50);
        ascballoon.setBounds(320, 120, 150, 40);
        descballoon.setBounds(320, 180, 150, 40);

        output1.setBounds(20, 300, 80, 100);
        output2.setBounds(120, 300, 80, 100);
        output3.setBounds(220, 300, 80, 100);
        output4.setBounds(320, 300, 80, 100);
        output5.setBounds(420, 300, 80, 100);   


        //add function to the buttons
        thehandler handler = new thehandler();
        ascbubble.addActionListener(handler);
        descbubble.addActionListener(handler);
        ascballoon.addActionListener(handler);
        descballoon.addActionListener(handler);

        //add to the frame
        add(input1);
        add(input2);
        add(input3);
        add(input4);
        add(input5);

        add(output1);
        add(output2);
        add(output3);
        add(output4);
        add(output5);

        add(ascbubble);
        add(descbubble);
        add(ascballoon);
        add(descballoon);
        add(clear);

    }


        private class thehandler implements ActionListener
        {

            public void actionPerformed(ActionEvent e)
            {


                if(e.getSource()==ascbubble)
                {

                    //input1
                    str1=input1.getText();
                    int1=Integer.parseInt(str1);

                    //input2
                    str2=input2.getText();
                    int2=Integer.parseInt(str2);

                    //input3
                    str3=input3.getText();
                    int3=Integer.parseInt(str3);

                    //input4
                    str4=input4.getText();
                    int4=Integer.parseInt(str4);

                    //input5
                    str5=input5.getText();
                    int5=Integer.parseInt(str5);

                    int contain[]={int1,int2,int3,int4,int5};

                     //formula for Buble Sort Ascending Order                                            
                         for ( int pass = 1; pass < contain.length; pass++ )
                         {
                            for ( int i = 0; i < contain.length - pass; i++ )
                            {
                                    if ( contain[ i ] > contain[ i + 1 ] ) 
                                    {
                                            temp = contain[ i ];
                                            contain[ i ] = contain[ i + 1 ];
                                            contain[ i + 1 ] = temp;
                                    }


                            }


                         }





                }

            }

        }






    public static void main(String[]args)
    {
        JFrame frame = new JFrame("Sorting");
        frame.add(new Sorting());
        frame.setSize(550, 500);
        frame.setVisible(true);


    }

}

回答1:


First of all, JTextArea has a simple append method, so you only need one. On each pass, you simply need to generate a new String which represents the current state of the array

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.StringJoiner;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Sort {

    public static void main(String[] args) {
        new Sort();
    }

    public Sort() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JTextField fieldValues;
        private JTextArea fieldResults;

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            gbc.insets = new Insets(2, 2, 2, 2);

            fieldValues = new JTextField(20);
            fieldResults = new JTextArea(10, 20);

            add(fieldValues, gbc);

            JButton btn = new JButton("Sort");
            add(btn, gbc);

            add(new JScrollPane(fieldResults), gbc);

            btn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    String[] values = fieldValues.getText().split(",");
                    int[] contain = new int[values.length];
                    for (int index = 0; index < values.length; index++) {
                        contain[index] = Integer.parseInt(values[index].trim());
                    }
                    for (int pass = 1; pass < contain.length; pass++) {
                        for (int i = 0; i < contain.length - pass; i++) {
                            if (contain[i] > contain[i + 1]) {
                                int temp = contain[i];
                                contain[i] = contain[i + 1];
                                contain[i + 1] = temp;
                                StringJoiner sj = new StringJoiner(", ", "", "\n");
                                for (int value : contain) {
                                    sj.add(Integer.toString(value));
                                }
                                fieldResults.append(sj.toString());
                            }

                        }

                    }
                }
            });
        }

    }

}

Now, the problem with this is, the larger the dataset, the more time it will take to sort, this will mean the UI will pause until the sort is completed

One solution would be to use a SwingWorker, for example...

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import java.util.StringJoiner;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Sort {

    public static void main(String[] args) {
        new Sort();
    }

    public Sort() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JTextField fieldValues;
        private JTextArea fieldResults;

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            gbc.insets = new Insets(2, 2, 2, 2);

            fieldValues = new JTextField(20);
            fieldResults = new JTextArea(10, 20);

            add(fieldValues, gbc);

            JButton btn = new JButton("Sort");
            add(btn, gbc);

            add(new JScrollPane(fieldResults), gbc);

            btn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    btn.setEnabled(false);
                    String text = fieldValues.getText();
                    SortWorker worker = new SortWorker(text);
                    worker.addPropertyChangeListener(new PropertyChangeListener() {
                        @Override
                        public void propertyChange(PropertyChangeEvent evt) {
                            String name = evt.getPropertyName();
                            if ("state".equals(name)) {
                                if (worker.getState() == SwingWorker.StateValue.DONE) {
                                    btn.setEnabled(true);
                                }
                            }
                        }
                    });
                    worker.execute();
                }
            });
        }

        public class SortWorker extends SwingWorker<int[], String> {

            private String text;

            public SortWorker(String text) {
                this.text = text;
            }

            @Override
            protected void process(List<String> chunks) {
                for (String value : chunks) {
                    fieldResults.append(value);
                }
            }

            @Override
            protected int[] doInBackground() throws Exception {
                String[] values = text.split(",");
                int[] contain = new int[values.length];
                for (int index = 0; index < values.length; index++) {
                    contain[index] = Integer.parseInt(values[index].trim());
                }
                for (int pass = 1; pass < contain.length; pass++) {
                    for (int i = 0; i < contain.length - pass; i++) {
                        if (contain[i] > contain[i + 1]) {
                            int temp = contain[i];
                            contain[i] = contain[i + 1];
                            contain[i + 1] = temp;
                            StringJoiner sj = new StringJoiner(", ", "", "\n");
                            for (int value : contain) {
                                sj.add(Integer.toString(value));
                            }
                            publish(sj.toString());
                        }

                    }

                }
                return contain;
            }

        }

    }

}


来源:https://stackoverflow.com/questions/34574920/displaying-iteration-in-each-jtextarea

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!