排序 用java的Swing awt实现

这是我的第一个blog
希望有错误的,有bug请一定提出,楼主大二了刚学java请多多指点

我们都知道有很多的排序算法,但是没有直观的显示是如何排序的,今天我给大家带来
Java Swing awt 实现的可视化的排序

下面是排序的效果
开始的界面有很多的选择

这里我做的是选择排序进行的测试

冒泡排序,为什么那么少,数量多了排序时间久
话不多说我直接附上代码;
首先进行排序我们需要一个数组的类;
类中包含set get方法,还有一些基本的方法
并且这个类将会作为父类,覆盖其中的排序方法就可以实现不同的排序

package com.Sort;

public class SetSort {
    protected int array[];
    protected int currentIndex=-1;
    protected int orderedIndex=-1;
    protected int minIndex=-1;

    public SetSort(int height,int lenght){
        array=new int[lenght];
        init(height);

    }

    protected void  init(int rand){
        for (int i=0;i<array.length;i++){
            array[i]=(int)(Math.random()*rand)+1;
        }
    }

    public int getSize(){
        return array.length;
    }

    public int getData(int index){
        if(index<0||index>array.length){
            throw new IllegalArgumentException("Errno");
        }
        return array[index];
    }

    public void setCurrentIndex(int index){
        this.currentIndex=index;
    }

    public void setOrderedIndex(int index){
        this.orderedIndex=index;
    }

    public void setMinIndex(int index){
        this.minIndex=index;
    }

    public int getCurrentIndex(){
        return currentIndex;
    }

    public int getOrderedIndex(){
        return orderedIndex;
    }

    public int getMinIndex(){
        return minIndex;
    }

    protected void swap(int index,int index1){
           int temp=array[index];
           array[index]= array[index1];
           array[index1]=temp;
    }


   //可以复写
    public void sort(SortFrame panel){
        // 更新绘制
        panel.setIndex(0,-1,-1);
        // 选择排序算法
        for(int i = 0;i < getSize();i++){
            int minIndex = i;
            panel.setIndex(i,-1,minIndex);
            for(int j = i+1;j <getSize();j++){
                panel.setIndex(i,j,minIndex);
                if(getData(j) < getData(minIndex))
                    minIndex = j;
                panel.setIndex(i,j,minIndex);
            }
            swap(i,minIndex);
            panel.setIndex(i+1,-1,-1);
        }
        panel.setIndex(getSize(),-1,-1);
    }

}

其次是对数组排序进行复制绘图的类
这个类对图像的绘图进行帮助

package com.Sort;

import java.awt.*;
import java.awt.geom.Rectangle2D;

public  class SortVisAid {
    private SortVisAid(){}

    public static void setColor(Graphics2D g,Color color){
        g.setColor(color);
    }


    public static void filledRectangle(Graphics2D g,int x,int y,int w,int h){
        Rectangle2D rectangle=new Rectangle2D.Double(x,y,w,h);
        g.fill(rectangle);
    }


    public static void setText(Graphics2D g,int value,int x,int y){
        g.drawString(String.valueOf(value),x,y);
    }

    public static void speed(int time){
        try{
            Thread.sleep(time);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

*然后是 画布的类,并且要覆盖其中的绘图方法才可以进行自定义的绘图*

package com.Sort;

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

public class SortPanel extends JPanel{
    private SetSort array;
    private int canvansWidth;
    private int canvansHeight;

   public SortPanel(SetSort array,int canvansWidth,int canvansHeight){
       super(true); //设置为双缓冲,Jpanel 现在默认是双缓冲
       this.array=array;
       this.canvansWidth=canvansWidth;
       this.canvansHeight=canvansHeight;

   }
   //实现重绘
   public void paintComponent(Graphics graphics){
       Graphics2D graphics2D=(Graphics2D)graphics;

      
       int w=canvansWidth/array.getSize();
       for (int i=0;i<array.getSize();i++){
           if (i<array.getOrderedIndex())
               SortVisAid.setColor(graphics2D,Color.GREEN);
           else SortVisAid.setColor(graphics2D,Color.BLACK);
            
           if (i==array.getCurrentIndex())SortVisAid.setColor(graphics2D,Color.BLUE);

           if (i==array.getMinIndex())SortVisAid.setColor(graphics2D,Color.WHITE);

           SortVisAid.filledRectangle(graphics2D,i*w,canvansHeight-array.getData(i),w-2,array.getData(i));
           SortVisAid.setText(graphics2D,array.getData(i),i*w+w/4,canvansHeight-array.getData(i));
       }
   }

   public Dimension getPreferredSize(){
       return new Dimension(canvansWidth,canvansHeight);
   }

}

*然后是窗口的显示,这里我们用JDialog作为显示排序的基层
如果用JFrame也行,但是要考虑很多情况,线程的问题*
package com.Sort;

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


public class SortFrame extends JDialog {

    private SortPanel panel;
    private SetSort array;


    public void run(){
        array.sort(this);
    }

    public void setIndex(int orderedIndex,int currentCompareIndex,int currentMinIndex){
        array.setCurrentIndex(currentCompareIndex);
        array.setOrderedIndex(orderedIndex);
        array.setMinIndex(currentMinIndex);
        repaint();
        SortVisAid.speed(300);
    }


    public SortFrame(String title,int w,int h,SetSort array){
        panel=new SortPanel(this.array=array,w,h);
        
        //开始线程
        //继承Thread或者Runnable  也可以实现,但是最好使用下列的
        EventQueue.invokeLater(()->{
            new Thread(()->{
                run();
            }).start();
        });
        getContentPane().add(panel);
        setSize(w,h);
        setResizable(false);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

}

***button 的多少可以自己定义,new 的数组类型可以继承SetArray实现***
package com.Sort;

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

public class Main extends JFrame implements ActionListener {
    private JButton button[]=new JButton[5];
    private JPanel panel;
    private String str[]=new String[]{"插入排序","冒泡排序","选择排序","快速排序","堆排序"};
    private int w;
    private int h;
    private SetSort array;

    private Main(String title ,int w,int h,SetSort array){
        super(title);
        init();
      this.w=w;
      this.h=h;
      this.array=array;
      setVisible(true);
      pack();
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void actionPerformed(ActionEvent event){

         if (event.getActionCommand().equals("选择排序")){
               SortFrame frame=new SortFrame("选择排序",w,h,array);

               setContentPane(frame);

         }else if(event.getActionCommand().equals("冒泡排序")){
             SortFrame frame=new SortFrame("冒泡排序",w,h,new BubbleSort(400,4));

             setContentPane(frame);

         }else if(event.getActionCommand().equals("插入排序")){

         }else if(event.getActionCommand().equals("快速排序")){

         }else {

         }
    }

    private void init(){
        panel=new JPanel(new FlowLayout());
        for (int i=0;i<button.length;i++){
            button[i]=new JButton(str[i]);
            button[i].addActionListener(this);
            panel.add(button[i]);
        }
        getContentPane().add(panel);
    }

    public static void main(String argv[]){
        new Main("插入排序",600,400,new SetSort(400,12));
    }

}

***继承SetArray 实现一个冒泡排序***
package com.Sort;

public class BubbleSort extends SetSort {
    public BubbleSort(int height, int lenght) {
        super(height, lenght);
    }

    @Override
    public void sort(SortFrame panel) {
       panel.setIndex(-1,-1,-1);
       for (int i=0;i<getSize()-1;i++){
            panel.setIndex(i,-1,-1);
            for (int j=i+1;j<getSize();j++){
                panel.setIndex(i,j,-1);
                if(array[i]>array[j]){
                    panel.setIndex(i,i,j);
                    swap(i,j);
                }

                panel.setIndex(i+1,-1,-1);
            }
            panel.setIndex(getSize(),-1,-1);
       }
    }
}



***最后我也是参考了别人的代码而重写
附上来源的地址***

[我觉得他讲的很好很仔细](https://blog.csdn.net/GO_D_OG/article/details/100016060?utm_source=app)

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值