【JAVA_GUI】单文件 JAVA_GUI 矩阵链动态规划算法

老师可萌可萌的~ 看下面的项目实验吐槽~

就是编界面挺恼火的……QtCreator的界面打死我都不想再碰第二次……以前的Bug制造出强大的心灵阴影

所以……废话不多说……START

项目要求


【重要部分代码说明】

for(int i = 1; i <= n; i++)  
            {  
                g.setFont(fontLetter);  
                g.drawString("A", matrixXStart, YStart + di);  
                matrixXStart = matrixXStart + 12;  
                g.setFont(fontNumber);  
                g.drawString(String.valueOf(i), matrixXStart, YStart + di);  
                matrixXStart = matrixXStart + 10;  
                g.setFont(fontLetter);  
                g.drawString(": " + p[i - 1] + "*" + p[i] + " ", matrixXStart, YStart + di);  
                matrixXStart = matrixXStart + di * 3/2;  
            }  
仔细看这里,所使用的是drawString(str,xpos,ypos),三个参数分别为字符串,x坐标和y坐标。

有了这个是不是就跟在PPT里写字符串一样了呢~

for(int i = 1; i <= n; i++)  
        {  
            m[i][i] = 0;  
            int x = polygonArrayM[i][i].xpoints[0];  
            int y = polygonArrayM[i][i].ypoints[0];  
              
            setColorAndFill(g, Color.GREEN, polygonArrayM[i][i]);  
            setColorAndDrawStr(g, Color.BLACK, m[i][i], x, y, 10, 5);  
            sleepAndPossiblePause(interval);  
        }  
setColorAndFill,如同字面意思,把【Graphics g】,填充为某种颜色,第三个参数是polygon,就是我要画的是哪一个方块。

setColorAndDrawStr则为填充颜色后把字符串(这里的m[i][i]是longlong型的)也扔上去。

以上两个为自写函数,但只是合并调用减少代码长度罢了,如下:

 private void setColorAndFill(Graphics g, Color c, Polygon p)    
    {    
        g.setColor(c);    
        g.fillPolygon(p);    
        g.setColor(Color.BLACK);    
        g.drawPolygon(p);    
    }    
        
    private void setColorAndDrawStr(Graphics g, Color c, Object value, int x, int y, int xDeviation, int yDeviation)    
    {    
        g.setColor(c);    
        g.drawString(String.valueOf(value), x + xDeviation, y + yDeviation);    
    }    




    //睡眠并可能暂停  
    private void sleepAndPossiblePause(int interval)  
    {  
        try  
        {  
            Thread.sleep(interval);  
            synchronized(so)  
            {  
                while(so.status.equals("1"))  
                {  
                    so.wait();  
                }  
            }  
        }  
        catch (InterruptedException e)  
        {  
            e.printStackTrace();  
        }  
    }  
这个很方便的暂停函数是借鉴来的,十分的方便,代码倒是相当短啦~

不过用在小游戏什么的里面作为pause使用应该也相当不错的。


【源码】

package pack;

import java.awt.Color;  
import java.awt.Container;  
import java.awt.EventQueue;  
import java.awt.Font;  
import java.awt.Frame;  
import java.awt.Graphics;  
import java.awt.Polygon;  
import java.awt.event.ActionEvent;  
import java.awt.event.ActionListener;  
  
import java.util.Scanner;

import javax.swing.JButton;  
import javax.swing.JComboBox;  
import javax.swing.JFrame;  
import javax.swing.JLabel;  
import javax.swing.JOptionPane;  
import javax.swing.JPanel;  
import javax.swing.SwingUtilities;  
import javax.swing.WindowConstants;  
      
@SuppressWarnings("serial")
public class MatrixChainGUI extends JFrame  
{  
    int n;// Num of Rec  
    int di;//Length of dia_ratio  
    int XMStart;//M_Matrix left.xpos  
    int YStart;//Matrix left.pos
    int xSStart;//S_Matrix left.xpos  
    int rstStrXStart;//Answer_xpos
    Polygon[][] polygonArrayM;//m_Array  
    Polygon[][] polygonArrayS;//S_Array  
    int[] p;
    JPanel charPanel;  
    @SuppressWarnings("rawtypes")
	JComboBox change;  
    JButton calculate = new JButton("开始/暂停");  
    Container pane;  
    DrawPolygon d;//drawP
  //Rst_ WriteAnswer
    DrawCalculateRst dr;  
    Thread algThread;
  //Resume and Pause
    PauseOrResume pOR;  
    Thread pORThread;  
    SynObj so = new SynObj();//用以同步  
    int interval; //speed
    boolean awake = false;//init 
    Font fontLetter = new Font("letter", 0, 18);
    Font fontNumber = new Font("number", 0, 10);  
    Font fontBracket = new Font("number", 0, 17);  
    @SuppressWarnings({ "unchecked", "rawtypes" })
	public MatrixChainGUI(int[] p, int di)  
    {  
        super();  
        n = p.length - 1;  
        if(n <= 2)  
        {  
            JOptionPane.showMessageDialog(MatrixChainGUI.this,   
                  "矩阵数目最少为3", "", JOptionPane.ERROR_MESSAGE);  
            System.exit(0);  
        }  
        this.p = p;  
        this.di = di;  
        XMStart = di/2;  
        YStart = di * (n+2)/2;  
        xSStart = XMStart + n*di;  
        rstStrXStart = XMStart;  
        polygonArrayM = new Polygon[n+1][n+1];  
        polygonArrayS = new Polygon[n+1][n+1];  
          
        pane = this.getContentPane();  
        d = new DrawPolygon();  
        d.setIgnoreRepaint(true);  
        charPanel = new JPanel();  
        String str[] = { "1", "2", "3" };  
        change = new JComboBox(str);  
        charPanel.add(new JLabel("速度:"));  
        charPanel.add(change);  
        charPanel.add(calculate);  
        pane.add("South", charPanel);  
        pane.add("Center", d);  
          
        calculate.addActionListener(new ActionListener()  
        {  
            public void actionPerformed(ActionEvent arg0)   
            {  
                if(so.status.equals("0"))  
                {  
                    pOR = new PauseOrResume();  
                    pORThread = new Thread(pOR);  
                    pORThread.start();//pause of resume Thread
                      
                    if(change.getSelectedItem().toString().equals("1"))  
                    {  
                        interval = 1000;  
                    }  
                    else if(change.getSelectedItem().toString().equals("2"))  
                    {  
                        interval = 600;  
                    }  
                    else  
                    {  
                        interval = 200;  
                    }  
                    dr = new DrawCalculateRst();  
                    pane.add(dr);  
                    algThread = new Thread(dr);  
                    algThread.start();//Calculate Thread
                }  
                //judge status
                else if(so.status.equals("2") || so.status.equals("1"))  
                {  
                    awake = true;  
                }  
            }  
        });  
    }  
      
    public class DrawPolygon extends JPanel  
    {  
        public void paintComponent(Graphics g)  
        {  
            super.paintComponents(g);  
            //PAINT Matrix_M
            int outCount = 1;  
            int q = 0;//纵坐标偏移单位  
            while(outCount < n + 1)  
            {  
                int inCount = 1;  
                int p = 0;//横坐标偏移单位  
                int j = outCount, i = 1;  
                while(inCount < n + 2 - outCount)  
                {  
                    int X[] = {XMStart+di*p+di/2*q,XMStart+di/2+di*p+di/2*q,XMStart+di+di*p+di/2*q,XMStart+di/2+di*p+di/2*q};  
                    int Y[] = {YStart-di/2*q,YStart+di/2-di/2*q,YStart-di/2*q,YStart-di/2-di/2*q};  
                    polygonArrayM[i][j] = new Polygon(X,Y,4);  
                    g.drawPolygon(polygonArrayM[i][j]);  
                    p++; i++; j++; inCount++;  
                }  
                q++; outCount++;  
            }  
              
            g.drawString("Matrix M_ij\n(m)", XMStart + di * n/2 - 25 , YStart - di * (n + 1)/2);  
              
            //Paint No.
            for(int i = 1; i <= n; i++)  
            {  
                int xl = polygonArrayM[1][i].xpoints[0];  
                int yl = polygonArrayM[1][i].ypoints[0];  
                int xr = polygonArrayM[i][n].xpoints[0];  
                int yr = polygonArrayM[i][n].ypoints[0];  
                  
                setColorAndDrawStr(g, Color.BLACK, i, xl, yl, 0, -9*di/25);  
                setColorAndDrawStr(g, Color.BLACK, i, xr, yr, 4*di/5, -9*di/25);  
            }  
              
            //Paint Axis
            int midv=n/2;
            int xj = polygonArrayM[1][midv].xpoints[0] -75;  
            int yj = polygonArrayM[1][midv].ypoints[0] +25;  
            int xi = polygonArrayM[midv+1][n].xpoints[0] ;  
            int yi = polygonArrayM[midv+1][n].ypoints[0] + 25;  
              
            setColorAndDrawStr(g, Color.BLACK, "Matrix M_ij\n(j)", xj, yj, 0, -di);  
            setColorAndDrawStr(g, Color.BLACK, "Matrix M_ij\n(i)", xi, yi, di, -di);  
              
            //Paint Matrix_S  
            int outCount1 = 2;  
            int q1 = 1;//纵坐标偏移单位  
            while(outCount1 < n + 1)  
            {  
                int inCount = 1;  
                int p = 1;//横坐标偏移单位  
                int j = outCount1, i = 1;  
                while(inCount < n + 2 - outCount1)  
                {  
                    int X[] = {xSStart+di*p+di/2*q1,xSStart+di/2+di*p+di/2*q1,xSStart+di+di*p+di/2*q1,xSStart+di/2+di*p+di/2*q1};  
                    int Y[] = {YStart-di/2*q1,YStart+di/2-di/2*q1,YStart-di/2*q1,YStart-di/2-di/2*q1};  
                    polygonArrayS[i][j] = new Polygon(X,Y,4);  
                    g.drawPolygon(polygonArrayS[i][j]);  
                    p++; i++; j++; inCount++;  
                }  
                q1++; outCount1++;  
            }  
              
            g.drawString("Value Matrix of S", xSStart + di * (n + 2)/2 - 50, YStart - di * (n + 1)/2);  
              
            //绘制s值编号  
            for(int i = 2; i <= n; i++)  
            {  
                int xl = polygonArrayS[1][i].xpoints[0];  
                int yl = polygonArrayS[1][i].ypoints[0];  
                  
                setColorAndDrawStr(g, Color.BLACK, i, xl, yl, 0, -9*di/25);  
            }  
            for(int i = 1; i <= n - 1; i++)  
            {  
  
                int xr = polygonArrayS[i][n].xpoints[0];  
                int yr = polygonArrayS[i][n].ypoints[0];  
                  
                setColorAndDrawStr(g, Color.BLACK, i, xr, yr, 4*di/5, -9*di/25);  
            }  
              
            int matrixXStart = XMStart;  
            g.setFont(fontLetter);  
        		g.drawString("[	CD's HINT	]: \t       [ Green ]	   Already Calculated ", matrixXStart, YStart + di*9/3);
        		g.drawString("[	IOTClass1	]: \t       [ Yellow]	   Now is Calculating ", matrixXStart, YStart + di*10/3);
        		g.drawString("[	20125209	]: \t        [ Pink ]	   Calculating Related", matrixXStart, YStart + di*11/3);
  
            for(int i = 1; i <= n; i++)  
            {  
                g.setFont(fontLetter);  
                g.drawString("A", matrixXStart, YStart + di);  
                matrixXStart = matrixXStart + 12;  
                g.setFont(fontNumber);  
                g.drawString(String.valueOf(i), matrixXStart, YStart + di);  
                matrixXStart = matrixXStart + 10;  
                g.setFont(fontLetter);  
                g.drawString(": " + p[i - 1] + "*" + p[i] + " ", matrixXStart, YStart + di);  
                matrixXStart = matrixXStart + di * 3/2;  
            }  
     
        }  
    }  
      
    public class SynObj  
    {  
        String status = "0";  
    }  
      
    public class DrawCalculateRst extends JPanel implements Runnable  
    {  
        public void run()   
        {  
            synchronized(so)  
            {  
                so.status = "2";  
            }  
            matrixChainMul(d.getGraphics());  
        }  
    }  
      
    public class PauseOrResume implements Runnable  
    {  
  
        public void run()   
        {  
            while(true)  
            {  
                while(!awake)  
                {  
                    try   
                    {  
                        Thread.sleep(50);  
                    }   
                    catch (InterruptedException e)   
                    {  
                        e.printStackTrace();  
                    }  
                }  
                // Runtime Set
                if(so.status.equals("1"))  
                {  
                    if(change.getSelectedItem().toString().equals("1"))  
                    {  
                        interval = 1000; 
                    }  
                    else if(change.getSelectedItem().toString().equals("2"))  
                    {  
                        interval = 600;  
                    }  
                    else  
                    {  
                        interval = 200;  
                    }  
                    synchronized(so)  
                    {  
                        so.status = "2";  
                        so.notifyAll();  
                    }  
                }  
                else if(so.status.equals("2"))  
                {  
                    so.status = "1";  
                }  
                awake = false;  
            }  
        }  
          
    }  
      
    //Main Algorithm Here 
    public void matrixChainMul(Graphics g)   
    {  
        long[][] m = new long[n + 1][n + 1];  
        int[][] s = new int[n][n + 1];  
          
        for(int i = 1; i <= n; i++)  
        {  
            m[i][i] = 0;  
            int x = polygonArrayM[i][i].xpoints[0];  
            int y = polygonArrayM[i][i].ypoints[0];  
              
            setColorAndFill(g, Color.GREEN, polygonArrayM[i][i]);  
            setColorAndDrawStr(g, Color.BLACK, m[i][i], x, y, 10, 5);  
            sleepAndPossiblePause(interval);  
        }  
          
        for(int l = 2; l <= n; l++)  
        {  
            for(int i = 1; i <= n - l + 1; i++)  
            {  
                int j = i + l - 1;  
                m[i][j] =  Integer.MAX_VALUE;  
                int x = polygonArrayM[i][j].xpoints[0];  
                int y = polygonArrayM[i][j].ypoints[0];  
                int xs = polygonArrayS[i][j].xpoints[0];  
                int ys = polygonArrayS[i][j].ypoints[0];  
                setColorAndFill(g, Color.YELLOW, polygonArrayM[i][j]);  
                setColorAndFill(g, Color.YELLOW, polygonArrayS[i][j]);  
                  
                sleepAndPossiblePause(interval);  
                  
                for(int k = i; k <= j - 1; k++)  
                {  
                    int x1 = polygonArrayM[i][k].xpoints[0];  
                    int y1 = polygonArrayM[i][k].ypoints[0];  
                    int x2 = polygonArrayM[k+1][j].xpoints[0];  
                    int y2 = polygonArrayM[k+1][j].ypoints[0];  
                    setColorAndFill(g, Color.PINK, polygonArrayM[i][k]);  
                    setColorAndDrawStr(g, Color.BLACK, m[i][k], x1, y1, 10, 5);  
                    setColorAndFill(g, Color.PINK, polygonArrayM[k+1][j]);  
                    setColorAndDrawStr(g, Color.BLACK, m[k+1][j], x2, y2, 10, 5);  
                    long q = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j];  
                    if(q < m[i][j])  
                    {  
                        m[i][j] = q;  
                        s[i][j] = k;  
                    }  
                      
                    sleepAndPossiblePause(interval);  
                      
                    setColorAndFill(g, Color.GREEN, polygonArrayM[i][k]);  
                    setColorAndDrawStr(g, Color.BLACK, m[i][k], x1, y1, 10, 5);  
                    setColorAndFill(g, Color.GREEN, polygonArrayM[k+1][j]);  
                    setColorAndDrawStr(g, Color.BLACK, m[k+1][j], x2, y2, 10, 5);  
                }  
                setColorAndFill(g, Color.GREEN, polygonArrayM[i][j]);  
                setColorAndDrawStr(g, Color.BLACK, m[i][j], x, y, 10, 5);  
                setColorAndFill(g, Color.GREEN, polygonArrayS[i][j]);  
                setColorAndDrawStr(g, Color.BLACK, s[i][j], xs, ys, 10, 5);  
                  
                sleepAndPossiblePause(interval);  
            }  
        }  
        
        g.drawString("最优的加括号的序列: ", rstStrXStart, YStart + di * 2);  
        rstStrXStart = rstStrXStart + 120;  
        printRstSequence(s, 1, n, g);  
    }  
      
    //Paint Answer
    public void printRstSequence(int[][] s, int i, int j, Graphics g)  
    {  

        if(i == j)   
        {  
            g.setFont(fontLetter);  
            g.drawString("A", rstStrXStart, YStart + di * 2);  
            rstStrXStart = rstStrXStart + di/4;  
            g.setFont(fontNumber);  
            g.drawString(String.valueOf(i), rstStrXStart, YStart + di * 2);  
            rstStrXStart = rstStrXStart + di/4;  
            System.out.print("A" + i + " ");  
        }  
        else  
        { 
            g.setFont(fontBracket);  
            g.drawString("(", rstStrXStart, YStart + di * 2);  
            rstStrXStart = rstStrXStart + di/4;  
            System.out.print("(");  
            printRstSequence(s, i, s[i][j], g);  
            printRstSequence(s, s[i][j] + 1, j, g);  
            g.setFont(fontBracket);  
            g.drawString(")", rstStrXStart, YStart + di * 2);  
            rstStrXStart = rstStrXStart + di/4;  
            System.out.print(")");  
        }  
    }  
      
    //Set Sleep(Pause) Status
    private void sleepAndPossiblePause(int interval)  
    {  
        try  
        {  
            Thread.sleep(interval);  
            synchronized(so)  
            {  
                while(so.status.equals("1"))  
                {  
                    so.wait();  
                }  
            }  
        }  
        catch (InterruptedException e)  
        {  
            e.printStackTrace();  
        }  
    }  
  
    private void setColorAndFill(Graphics g, Color c, Polygon p)  
    {  
        g.setColor(c);  
        g.fillPolygon(p);  
        g.setColor(Color.BLACK);  
        g.drawPolygon(p);  
    }  
      
    private void setColorAndDrawStr(Graphics g, Color c, Object value, int x, int y, int xDeviation, int yDeviation)  
    {  
        g.setColor(c);  
        g.drawString(String.valueOf(value), x + xDeviation, y + yDeviation);  
    }  
      
    private static class FrameShower implements Runnable   
    {  
            
        private final Frame frame;  
          
        FrameShower(Frame frame)   
        {  
          this.frame = frame;  
        }  
          
        public void run()   
        {  
         frame.setVisible(true);  
        }  
          
    }     
      
    public static void main(String[] args)  
    {  
        SwingUtilities.invokeLater(new Runnable()  
        {  
            public void run()   
            {  
            	Scanner in=new Scanner(System.in);
                //矩阵行列数组  
            	//int[] p = {27, 33, 20, 18, 15, 18, 25};  
            	System.out.println("Please tell me how many matrix are there?(Recommend 6~15)");
                int vnum=in.nextInt();
                int [] p=new int[vnum+1];
                System.out.println("Please input values of these Matrix Size:");
            	System.out.printf("(Hint: %d matrix need %d numbers)\n",vnum,vnum+1);
                for(int i=0;i<p.length;i++)
                {
                	int tmp=in.nextInt();
                	if(tmp<=0){System.out.println("Invalid Input!");break;}
                	p[i]=tmp;
                }
                int di = 50;  
                int n = p.length - 1;  
                MatrixChainGUI c = new MatrixChainGUI(p, di);  
                c.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);  
                c.pack();  
                c.setSize(di * (2 * n + 2), di * (n+2)/2 + 280);  
                c.setResizable(false);  
                c.setTitle("MatrixChain_DP By CD_20125209");  
                EventQueue.invokeLater(new FrameShower(c));  
                System.out.println("单文件JAVA_GUI矩阵链动态规划算法演示结束,友情提示:这个可以打高分^_^");
                System.out.println("作者:陈点 物联网1班 20125209");
            }  
        });  
    }  
}  

【运行演示】






【源码超·中文注释完全版】 

package pack;

import java.awt.Color;  
import java.awt.Container;  
import java.awt.EventQueue;  
import java.awt.Font;  
import java.awt.Frame;  
import java.awt.Graphics;  
import java.awt.Polygon;  
import java.awt.event.ActionEvent;  
import java.awt.event.ActionListener;  
  
import java.util.Scanner;

import javax.swing.JButton;  
import javax.swing.JComboBox;  
import javax.swing.JFrame;  
import javax.swing.JLabel;  
import javax.swing.JOptionPane;  
import javax.swing.JPanel;  
import javax.swing.SwingUtilities;  
import javax.swing.WindowConstants;  
      
@SuppressWarnings("serial")
public class MatrixChainGUI extends JFrame  
{  
    int n;//矩阵个数  
    int di;//正方形斜对角线长  
    int XMStart;//m值菱形数组最左边的x坐标  
    int YStart;//菱形数组最左边的y坐标  
    int xSStart;//s值菱形数组最左边的x坐标  
    int rstStrXStart;//最优加括号矩阵链起始横坐标  
    Polygon[][] polygonArrayM;//m值菱形数组  
    Polygon[][] polygonArrayS;//s值菱形数组  
    int[] p;  
    JPanel charPanel;  
    @SuppressWarnings("rawtypes")
	JComboBox change;  
    JButton calculate = new JButton("开始/暂停");  
    Container pane;  
    DrawPolygon d;//画表格  
    DrawCalculateRst dr;//计算并向屏幕写结果的任务  
    Thread algThread;//计算向屏幕写结果的线程  
    PauseOrResume pOR;//暂停、恢复的任务  
    Thread pORThread;//暂停、恢复的线程  
    SynObj so = new SynObj();//用以同步  
    int interval;//计算速度  
    boolean awake = false;//暂停、恢复计算线程初始化为睡眠状态  
    Font fontLetter = new Font("letter", 0, 18);//字母字体  
    Font fontNumber = new Font("number", 0, 10);//角标字体  
    Font fontBracket = new Font("number", 0, 17);//括号字体  
    @SuppressWarnings({ "unchecked", "rawtypes" })
	public MatrixChainGUI(int[] p, int di)  
    {  
        super();  
        n = p.length - 1;  
        if(n <= 2)  
        {  
            JOptionPane.showMessageDialog(MatrixChainGUI.this,   
                  "矩阵数目最少为3", "", JOptionPane.ERROR_MESSAGE);  
            System.exit(0);  
        }  
        this.p = p;  
        this.di = di;  
        XMStart = di/2;//m值菱形数组最左边的x坐标  
        YStart = di * (n+2)/2;//菱形数组最左边的y坐标  
        xSStart = XMStart + n*di;//s值菱形数组最左边的x坐标  
        rstStrXStart = XMStart;//最优加括号矩阵链起始横坐标  
        polygonArrayM = new Polygon[n+1][n+1];//m值菱形数组  
        polygonArrayS = new Polygon[n+1][n+1];//s值菱形数组  
          
        pane = this.getContentPane();  
        d = new DrawPolygon();  
        d.setIgnoreRepaint(true);  
        charPanel = new JPanel();  
        String str[] = { "1", "2", "3" };  
        change = new JComboBox(str);  
        charPanel.add(new JLabel("速度:"));  
        charPanel.add(change);  
        charPanel.add(calculate);  
        pane.add("South", charPanel);  
        pane.add("Center", d);  
          
        calculate.addActionListener(new ActionListener()  
        {  
            public void actionPerformed(ActionEvent arg0)   
            {  
                if(so.status.equals("0"))  
                {  
                    pOR = new PauseOrResume();  
                    pORThread = new Thread(pOR);  
                    pORThread.start();//启动暂停或恢复计算的线程  
                      
                    if(change.getSelectedItem().toString().equals("1"))  
                    {  
                        interval = 1000;  
                    }  
                    else if(change.getSelectedItem().toString().equals("2"))  
                    {  
                        interval = 600;  
                    }  
                    else  
                    {  
                        interval = 200;  
                    }  
                    dr = new DrawCalculateRst();  
                    pane.add(dr);  
                    algThread = new Thread(dr);  
                    algThread.start();//启动开始计算的线程  
                }  
                //若正在运行,则进入暂停状态;若已经暂停,则恢复  
                else if(so.status.equals("2") || so.status.equals("1"))  
                {  
                    awake = true;  
                }  
            }  
        });  
    }  
      
    public class DrawPolygon extends JPanel  
    {  
        public void paintComponent(Graphics g)  
        {  
            super.paintComponents(g);  
              
            //绘制m值表格  
            int outCount = 1;  
            int q = 0;//纵坐标偏移单位  
            while(outCount < n + 1)  
            {  
                int inCount = 1;  
                int p = 0;//横坐标偏移单位  
                int j = outCount, i = 1;  
                while(inCount < n + 2 - outCount)  
                {  
                    int X[] = {XMStart+di*p+di/2*q,XMStart+di/2+di*p+di/2*q,XMStart+di+di*p+di/2*q,XMStart+di/2+di*p+di/2*q};  
                    int Y[] = {YStart-di/2*q,YStart+di/2-di/2*q,YStart-di/2*q,YStart-di/2-di/2*q};  
                    polygonArrayM[i][j] = new Polygon(X,Y,4);  
                    g.drawPolygon(polygonArrayM[i][j]);  
                    p++;  
                    i++;  
                    j++;  
                    inCount++;  
                }  
                q++;  
                outCount++;  
            }  
              
            g.drawString("Matrix M_ij\n(m)", XMStart + di * n/2 - 25 , YStart - di * (n + 1)/2);  
              
            //绘制m值编号  
            for(int i = 1; i <= n; i++)  
            {  
                int xl = polygonArrayM[1][i].xpoints[0];  
                int yl = polygonArrayM[1][i].ypoints[0];  
                int xr = polygonArrayM[i][n].xpoints[0];  
                int yr = polygonArrayM[i][n].ypoints[0];  
                  
                setColorAndDrawStr(g, Color.BLACK, i, xl, yl, 0, -9*di/25);  
                setColorAndDrawStr(g, Color.BLACK, i, xr, yr, 4*di/5, -9*di/25);  
            }  
              
            //绘制i,j字母  
            int midv=n/2;
            int xj = polygonArrayM[1][midv].xpoints[0] -75;  
            int yj = polygonArrayM[1][midv].ypoints[0] +25;  
            int xi = polygonArrayM[midv+1][n].xpoints[0] ;  
            int yi = polygonArrayM[midv+1][n].ypoints[0] + 25;  
              
            setColorAndDrawStr(g, Color.BLACK, "Matrix M_ij\n(j)", xj, yj, 0, -di);  
            setColorAndDrawStr(g, Color.BLACK, "Matrix M_ij\n(i)", xi, yi, di, -di);  
              
            //绘制s值表格  
            int outCount1 = 2;  
            int q1 = 1;//纵坐标偏移单位  
            while(outCount1 < n + 1)  
            {  
                int inCount = 1;  
                int p = 1;//横坐标偏移单位  
                int j = outCount1, i = 1;  
                while(inCount < n + 2 - outCount1)  
                {  
                    int X[] = {xSStart+di*p+di/2*q1,xSStart+di/2+di*p+di/2*q1,xSStart+di+di*p+di/2*q1,xSStart+di/2+di*p+di/2*q1};  
                    int Y[] = {YStart-di/2*q1,YStart+di/2-di/2*q1,YStart-di/2*q1,YStart-di/2-di/2*q1};  
                    polygonArrayS[i][j] = new Polygon(X,Y,4);  
                    g.drawPolygon(polygonArrayS[i][j]);  
                    p++;  
                    i++;  
                    j++;  
                    inCount++;  
                }  
                q1++;  
                outCount1++;  
            }  
              
            g.drawString("Value Matrix of S", xSStart + di * (n + 2)/2 - 50, YStart - di * (n + 1)/2);  
              
            //绘制s值编号  
            for(int i = 2; i <= n; i++)  
            {  
                int xl = polygonArrayS[1][i].xpoints[0];  
                int yl = polygonArrayS[1][i].ypoints[0];  
                  
                setColorAndDrawStr(g, Color.BLACK, i, xl, yl, 0, -9*di/25);  
            }  
            for(int i = 1; i <= n - 1; i++)  
            {  
  
                int xr = polygonArrayS[i][n].xpoints[0];  
                int yr = polygonArrayS[i][n].ypoints[0];  
                  
                setColorAndDrawStr(g, Color.BLACK, i, xr, yr, 4*di/5, -9*di/25);  
            }  
              
            int matrixXStart = XMStart;  
            g.setFont(fontLetter);  
        		g.drawString("[	CD's HINT	]: \t       [ Green ]	   Already Calculated ", matrixXStart, YStart + di*9/3);
        		g.drawString("[	IOTClass1	]: \t       [ Yellow]	   Now is Calculating ", matrixXStart, YStart + di*10/3);
        		g.drawString("[	20125209	]: \t        [ Blue ]	   Calculating Related", matrixXStart, YStart + di*11/3);
  
            for(int i = 1; i <= n; i++)  
            {  
                g.setFont(fontLetter);  
                g.drawString("A", matrixXStart, YStart + di);  
                matrixXStart = matrixXStart + 12;  
                g.setFont(fontNumber);  
                g.drawString(String.valueOf(i), matrixXStart, YStart + di);  
                matrixXStart = matrixXStart + 10;  
                g.setFont(fontLetter);  
                g.drawString(": " + p[i - 1] + "*" + p[i] + " ", matrixXStart, YStart + di);  
                matrixXStart = matrixXStart + di * 3/2;  
            }  
     
        }  
    }  
      
    public class SynObj  
    {  
        String status = "0";  
    }  
      
    public class DrawCalculateRst extends JPanel implements Runnable  
    {  
        public void run()   
        {  
            synchronized(so)  
            {  
                so.status = "2";  
            }  
            matrixChainMul(d.getGraphics());  
        }  
    }  
      
    public class PauseOrResume implements Runnable  
    {  
  
        public void run()   
        {  
            while(true)  
            {  
                while(!awake)  
                {  
                    try   
                    {  
                        Thread.sleep(50);  
                    }   
                    catch (InterruptedException e)   
                    {  
                        e.printStackTrace();  
                    }  
                }  
                if(so.status.equals("1"))  
                {  
                    if(change.getSelectedItem().toString().equals("1"))  
                    {  
                        interval = 1000;  
                    }  
                    else if(change.getSelectedItem().toString().equals("2"))  
                    {  
                        interval = 600;  
                    }  
                    else  
                    {  
                        interval = 200;  
                    }  
                    synchronized(so)  
                    {  
                        so.status = "2";  
                        so.notifyAll();  
                    }  
                }  
                else if(so.status.equals("2"))  
                {  
                    so.status = "1";  
                }  
                awake = false;  
            }  
        }  
          
    }  
      
    //矩阵链乘法最优算序寻找算法  
    public void matrixChainMul(Graphics g)   
    {  
        long[][] m = new long[n + 1][n + 1];  
        int[][] s = new int[n][n + 1];  
          
        for(int i = 1; i <= n; i++)  
        {  
            m[i][i] = 0;  
            int x = polygonArrayM[i][i].xpoints[0];  
            int y = polygonArrayM[i][i].ypoints[0];  
              
            setColorAndFill(g, Color.GREEN, polygonArrayM[i][i]);  
            setColorAndDrawStr(g, Color.BLACK, m[i][i], x, y, 10, 5);  
            sleepAndPossiblePause(interval);  
        }  
          
        for(int l = 2; l <= n; l++)  
        {  
            for(int i = 1; i <= n - l + 1; i++)  
            {  
                int j = i + l - 1;  
                m[i][j] =  Integer.MAX_VALUE;  
                int x = polygonArrayM[i][j].xpoints[0];  
                int y = polygonArrayM[i][j].ypoints[0];  
                int xs = polygonArrayS[i][j].xpoints[0];  
                int ys = polygonArrayS[i][j].ypoints[0];  
                setColorAndFill(g, Color.YELLOW, polygonArrayM[i][j]);  
                setColorAndFill(g, Color.YELLOW, polygonArrayS[i][j]);  
                  
                sleepAndPossiblePause(interval);  
                  
                for(int k = i; k <= j - 1; k++)  
                {  
                    int x1 = polygonArrayM[i][k].xpoints[0];  
                    int y1 = polygonArrayM[i][k].ypoints[0];  
                    int x2 = polygonArrayM[k+1][j].xpoints[0];  
                    int y2 = polygonArrayM[k+1][j].ypoints[0];  
                    setColorAndFill(g, Color.BLUE, polygonArrayM[i][k]);  
                    setColorAndDrawStr(g, Color.BLACK, m[i][k], x1, y1, 10, 5);  
                    setColorAndFill(g, Color.BLUE, polygonArrayM[k+1][j]);  
                    setColorAndDrawStr(g, Color.BLACK, m[k+1][j], x2, y2, 10, 5);  
                    long q = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j];  
                    if(q < m[i][j])  
                    {  
                        m[i][j] = q;  
                        s[i][j] = k;  
                    }  
                      
                    sleepAndPossiblePause(interval);  
                      
                    setColorAndFill(g, Color.GREEN, polygonArrayM[i][k]);  
                    setColorAndDrawStr(g, Color.BLACK, m[i][k], x1, y1, 10, 5);  
                    setColorAndFill(g, Color.GREEN, polygonArrayM[k+1][j]);  
                    setColorAndDrawStr(g, Color.BLACK, m[k+1][j], x2, y2, 10, 5);  
                }  
                setColorAndFill(g, Color.GREEN, polygonArrayM[i][j]);  
                setColorAndDrawStr(g, Color.BLACK, m[i][j], x, y, 10, 5);  
                setColorAndFill(g, Color.GREEN, polygonArrayS[i][j]);  
                setColorAndDrawStr(g, Color.BLACK, s[i][j], xs, ys, 10, 5);  
                  
                sleepAndPossiblePause(interval);  
            }  
        }  
          
          
        g.drawString("最优的加括号的序列: ", rstStrXStart, YStart + di * 2);  
        rstStrXStart = rstStrXStart + 120;  
        printRstSequence(s, 1, n, g);  
    }  
      
    //打印加括号顺序  
    public void printRstSequence(int[][] s, int i, int j, Graphics g)  
    {  

        if(i == j)   
        {  
            g.setFont(fontLetter);  
            g.drawString("A", rstStrXStart, YStart + di * 2);  
            rstStrXStart = rstStrXStart + di/4;  
            g.setFont(fontNumber);  
            g.drawString(String.valueOf(i), rstStrXStart, YStart + di * 2);  
            rstStrXStart = rstStrXStart + di/4;  
            System.out.print("A" + i + " ");  
        }  
        else  
        { 
            g.setFont(fontBracket);  
            g.drawString("(", rstStrXStart, YStart + di * 2);  
            rstStrXStart = rstStrXStart + di/4;  
            System.out.print("(");  
            printRstSequence(s, i, s[i][j], g);  
            printRstSequence(s, s[i][j] + 1, j, g);  
            g.setFont(fontBracket);  
            g.drawString(")", rstStrXStart, YStart + di * 2);  
            rstStrXStart = rstStrXStart + di/4;  
            System.out.print(")");  
        }  
    }  
      
    //睡眠并可能暂停  
    private void sleepAndPossiblePause(int interval)  
    {  
        try  
        {  
            Thread.sleep(interval);  
            synchronized(so)  
            {  
                while(so.status.equals("1"))  
                {  
                    so.wait();  
                }  
            }  
        }  
        catch (InterruptedException e)  
        {  
            e.printStackTrace();  
        }  
    }  
  
    private void setColorAndFill(Graphics g, Color c, Polygon p)  
    {  
        g.setColor(c);  
        g.fillPolygon(p);  
        g.setColor(Color.BLACK);  
        g.drawPolygon(p);  
    }  
      
    private void setColorAndDrawStr(Graphics g, Color c, Object value, int x, int y, int xDeviation, int yDeviation)  
    {  
        g.setColor(c);  
        g.drawString(String.valueOf(value), x + xDeviation, y + yDeviation);  
    }  
      
    private static class FrameShower implements Runnable   
    {  
            
        private final Frame frame;  
          
        FrameShower(Frame frame)   
        {  
          this.frame = frame;  
        }  
          
        public void run()   
        {  
         frame.setVisible(true);  
        }  
          
    }     
      
    public static void main(String[] args)  
    {  
        SwingUtilities.invokeLater(new Runnable()  
        {  
            public void run()   
            {  
            	Scanner in=new Scanner(System.in);
                //矩阵行列数组  
            	//int[] p = {27, 33, 20, 18, 15, 18, 25};  
            	System.out.println("Please tell me how many matrix are there?(Recommend 6~15)");
                int vnum=in.nextInt();
                int [] p=new int[vnum+1];
                System.out.println("Please input values of these Matrix Size:");
            	System.out.printf("(Hint: %d matrix need %d numbers)\n",vnum,vnum+1);
                for(int i=0;i<p.length;i++)
                {
                	int tmp=in.nextInt();
                	if(tmp<=0){System.out.println("Invalid Input!");break;}
                	p[i]=tmp;
                }
                int di = 50;  
                int n = p.length - 1;  
                MatrixChainGUI c = new MatrixChainGUI(p, di);  
                c.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);  
                c.pack();  
                c.setSize(di * (2 * n + 2), di * (n+2)/2 + 280);  
                c.setResizable(false);  
                c.setTitle("MatrixChain_DP By CD_20125209");  
                EventQueue.invokeLater(new FrameShower(c));  
                System.out.println("单文件JAVA_GUI矩阵链动态规划算法演示结束,友情提示:这个可以打高分^_^");
                System.out.println("作者:陈点 物联网1班 20125209");
            }  
        });  
    }  
}  



==== 部分非原创说明 ====

(以下提及的辅助函数中注释大多为xglv2013的函数自带注释

此版本依照 software8_co的 Swing动态演示中的

· “线程”概念 (线程函数摘自网络教程)

· 三速切换控制 (此函数摘自xglv)





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java GUI的布局和设置背景可以通过以下方式实现: 1. 布局:Java GUI提供了多种布局方式,包括FlowLayout、GridLayout、BorderLayout、CardLayout等,你可以根据实际需求选择合适的布局方式来实现自己的界面布局。 2. 设置背景:Java GUI中可以通过设置JFrame、JPanel等组件的背景色或者背景图片来实现设置背景的效果。具体实现方法如下: - 设置背景色:可以通过setBackgroundColor(Color c)来设置组件的背景色。 - 设置背景图片:可以通过setBackgroungImage(Image img)来设置组件的背景图片,也可以通过继承JComponent类并重写paintComponent()方法来实现自定义的背景图片。 注意:在使用背景图片时,需要确保背景图片的大小与组件的大小相同,否则会出现拉伸或者重复的情况。 示例代码如下: ``` import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; public class MyFrame extends JFrame { private JPanel panel; public MyFrame() { // 设置窗口标题 setTitle("My Frame"); // 设置窗口大小 setSize(400, 300); // 设置窗口关闭时的操作 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 创建面板 panel = new JPanel() { // 重写paintComponent()方法,绘制背景图片 @Override protected void paintComponent(Graphics g) { ImageIcon icon = new ImageIcon("bg.jpg"); // 加载背景图片 Image img = icon.getImage(); g.drawImage(img, 0, 0, getWidth(), getHeight(), this); // 绘制背景图片 } }; // 设置面板背景色 panel.setBackground(Color.WHITE); // 将面板添加到窗口中 add(panel); // 显示窗口 setVisible(true); } public static void main(String[] args) { new MyFrame(); } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

糖果天王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值