关于实时动态界面无法刷新,出现白屏的问题
实质是在做堆排序的但不动态演示。用多线程做过,单线程延时做过,但就是刷新不出来!最小化最大化后Panel里面就会白屏。附项目,动态数据处理主要是在MyPanel类实现!动态效果是从一个坐标先延X在延Y到达另一个坐标进行对排序的动态调整!
test.zip
(6.04 KB)
!望解决 急!
package test; /* *无休眠 ,单步执行deleteMax操作; * */ public class HeapSort { public static void main(String[] args) { MyFrame f = new MyFrame(); MyPanel p = new MyPanel(); InputPanel i = new InputPanel(); ShowPanel sen = new ShowPanel(); f.add(sen); f.add(i); f.add(p); } } //***************************************** package test; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.LinkedList; public class InputPanel extends Panel { private static final long serialVersionUID = 1L; static int iLen; static int[] tempp = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; static String[] temp = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }; ArrayList<Integer> a = new ArrayList<Integer>();// 修改为一个数组 写的 ; TextField inputText = new TextField("请输入演示数据:"); TextArea showText = new TextArea(); TextArea showAns = new TextArea(); Button s = new Button("构造最大堆"); public InputPanel() { this.setBounds(800, 30, 200, 600); this.setLayout(null); this.setBackground(new Color(228, 228, 228)); inputText.setBounds(0, 0, 200, 20); showText.setBounds(0, 30, 200, 40); showAns.setBounds(0, 100, 200, 40); this.add(inputText); this.add(showText); this.add(showAns); inputText.setSize(200, 20); inputText.addActionListener(new inputActionListener()); inputText.addMouseListener(new inputActionListener()); } class inputActionListener extends MouseAdapter implements ActionListener { public void actionPerformed(ActionEvent e) { try { inputText = (TextField) e.getSource(); } catch (NumberFormatException E) { E.printStackTrace(); } String s = inputText.getText(); inputText.removeActionListener(null); if (s.endsWith(",")) { s = s.substring(0, s.length() - 1); } String ss = "0," + inputText.getText(); temp = ss.split(","); iLen = temp.length; int[] aa = new int[iLen];// 显示最终排序结果 tempp = new int[iLen];// 直接进行数组 简单 ! repaint(); if (iLen > 16) { showText.setText("多于16个数 请重新输入:"); return; } for (int i = 0; i < iLen; i++) { a.add((Integer.parseInt(temp[i]))); aa[i] = (Integer.parseInt(temp[i])); } for (int i = 1; i < iLen; i++) { tempp[i] = (Integer.parseInt(temp[i])); } // System.out.println(iLen); showText.setText("要排序的数组为:" + s); showAns.setText(Sort(aa)); } public void mousePressed(MouseEvent e) { inputText.setText(""); } public String Sort(int aa[]) { String s = ""; int len = aa.length; for (int i = 0; i < len; i++) { for (int k = 0; k < len; k++) { if (aa[i] <= aa[k]) { int tem = aa[i]; aa[i] = aa[k]; aa[k] = tem; } } } for (int i = 1; i < len; i++) { s = s + aa[i] + " "; } return "最终排序结果是:" + s; } } } //********************************** package test; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class MyFrame extends Frame{ /** * */ private static final long serialVersionUID = -5908534022988507382L; public MyFrame(){ //this.setBackground(Color.blue); this.setBounds(100, 100, 1009, 639); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { setVisible(false); System.exit(0); } }); this.setResizable(false); this.setLayout(null); this.setVisible(true); } } //*********************************** package test; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JOptionPane; public class MyPanel extends Panel { /** * */ private static final long serialVersionUID = -5618379063057043498L; static int r1 = 40; static int r = 20; static int[] o_x = { 78, 391, 260, 521, 195, 325, 456, 586, 156, 227, 297, 357, 416, 487, 552, 617 }; static int[] o_y = { 56, 56, 112, 112, 233, 233, 233, 233, 373, 373, 373, 373, 373, 373, 373, 373 }; static int[] li_x = { 391, 300, 431, 521, 266, 215, 286, 345, 526, 475, 546, 605, 215, 176, 215, 247, 351, 312, 351, 377, 475, 436, 475, 507, 611, 572, 611, 637 }; static int[] li_y = { 76, 132, 76, 125, 152, 237, 152, 237, 152, 237, 152, 237, 273, 373, 273, 373, 273, 373, 273, 373, 273, 373, 273, 373, 273, 373, 273, 373 }; static int heap[]; static int CurrentSize, f = 0, x1, y1, x2, y2, x, y, i = 16; public MyPanel() { Button start = new Button("开始"); Button makeMH = new Button("构造最大堆"); Button heapSort = new Button("Sort"); start.setBounds(700, 40, 50, 20); makeMH.setBounds(700, 70, 70, 20); heapSort.setBounds(700, 100, 50, 20); makeMH.addActionListener(new makeMHAction()); start.addActionListener(new startAction()); heapSort.addActionListener(new heapSortAction()); this.setLayout(null); this.add(start); this.add(makeMH); this.add(heapSort); this.setBounds(9, 70, 782, 560); this.setBackground(Color.WHITE); this.setForeground(Color.RED); } public void paint(Graphics g) { int len = (2 * (InputPanel.temp.length - 1)); g.setColor(Color.blue); int w = this.getWidth(); int h = this.getHeight(); g.setColor(Color.BLUE); g.drawString("temp", w / 10, h / 10); for (int i = 0; i < InputPanel.temp.length; i++) { g.setColor(Color.black); g.drawOval(o_x[i], o_y[i], r1, r1); } for (int i = 0; i < len - 2; i += 2) { g.drawLine(li_x[i], li_y[i], li_x[i + 1], li_y[i + 1]); } for (int i = 1; i < InputPanel.temp.length; i++) { g.setColor(Color.BLUE); g.drawString(InputPanel.tempp[i] + "", o_x[i] + r, o_y[i] + r); } // 移动所需要的动态图 g.setColor(Color.RED); if (i != 16) { g.fillOval(o_x[i], o_y[i], r1, r1); g.drawString(InputPanel.tempp[i] + "", o_x[i], o_y[i]); } g.setColor(Color.BLACK); g.drawString(InputPanel.tempp[x1 + 1] + "", o_x[x1] + r, o_y[x1] + r); // g.drawString(InputPanel.tempp[x1+1] + "", o_x[x1+1] + r + x, // o_y[y1+1] + r // + y); // g.drawOval(o_x[x1], o_y[x1], r1, r1);// /原结点,可以注释掉 上面已经画了 // g.drawOval(o_x[x1] + x, o_y[x1] + y, r1, r1);// x1,y1 // g.drawOval(o_x[x2], o_y[x2], r1, r1);// x2,y2// 目标结点 可以注释掉 } class startAction implements ActionListener { public void actionPerformed(ActionEvent arg0) { repaint(); } } // class CThread extends Thread { // // public void run() { // // while (f == 0) { // while (true) { // repaint(); // try { // Thread.sleep(1000); // } catch (InterruptedException e) { // e.printStackTrace(); // } // } // // } // } // } class makeMHAction implements ActionListener { public void actionPerformed(ActionEvent ar) { Initialize(InputPanel.tempp, InputPanel.tempp.length - 1); repaint(); System.out.println("CurrentSize:" + CurrentSize + " i:" + i); } } class heapSortAction implements ActionListener { public void actionPerformed(ActionEvent arg) { if (CurrentSize == 1) { JOptionPane.showMessageDialog(null, "排序已经结束", "排序结束", JOptionPane.PLAIN_MESSAGE); } else { // int len = InputPanel.tempp.length; i = CurrentSize; // for (int i = 1; i < len; i++) { System.out.println("CurrentSize:" + CurrentSize + " i:" + i); InputPanel.tempp[CurrentSize] = DeleteMax(); // try { // Thread.sleep(2000); // System.out.println("wwwww"); // } catch (InterruptedException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // InputPanel.tempp[len-i] = t; } // int size = InputPanel.tempp.length - 1; // int Max = DeleteMax(); // InputPanel.tempp[InputPanel.tempp[--size]] = Max; } } // } public void preRun(int x1, int y1) {// 传进要移动的位置参数; x1--->x2 // System.out.println("kaishi prerun()" + o_x[x1] + " " + o_y[x1] // + " " + o_x[x2] + " " + o_y[x2] + " " + x1 + " " + x2); MyPanel.x1 = x1; MyPanel.x2 = y1; runn(); } public void runn() {// 变换x,y位置动态移动 MyPanel.x = 0; MyPanel.y = 0; System.out.println("kaishi run ()"); boolean flag = true; while (flag) { System.out.println("run ()"); repaint(); System.out.println("repaint"+" x:"+x+" ----y"+y); if (x != (o_x[x2] - o_x[x1])) { if (o_x[x2] > o_x[x1]) { x += 1; } else x -= 1; } else if (o_y[x2] - o_y[x1] > 0) { y += 1; } else { if (y == (o_y[x2] - o_y[x1])) flag = false; else { if (y > (o_y[x2] - o_y[x1])) y--; else y++; } } if (y == (o_y[x2] - o_y[x1])) return; try { Thread.sleep(50); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void Initialize(int a[], int size) { heap = a; CurrentSize = size; for (int i = CurrentSize / 2; i >= 1; i--) { int y = heap[i]; // root of subtree int c = 2 * i; while (c <= CurrentSize) { if (c < CurrentSize && heap[c] < heap[c + 1]) c++; if (y >= heap[c]) break; heap[c / 2] = heap[c]; c *= 2; } heap[c / 2] = y; } } public int DeleteMax() { // movingThread t = new movingThread(); if (CurrentSize == 0) { System.out.println("error"); } System.out.println(CurrentSize + "size"); int x = InputPanel.tempp[1]; int i = 1, ci = 2; int y = InputPanel.tempp[CurrentSize--];// 最后一个元素先去temp位置------需要动态移动 // "一步" preRun(CurrentSize, 0);// 移动 同上 while (ci <= CurrentSize) { if (ci < CurrentSize && InputPanel.tempp[ci] < InputPanel.tempp[ci + 1]) ci++;// ci应是i的较大孩子; if (y >= InputPanel.tempp[ci])// 如果最后一个数>=ci,则推出,自然将其放至i的位置; break; // 如果最后一个数小于heap[ci]; InputPanel.tempp[i] = InputPanel.tempp[ci];// 将较大的孩子移至上一个根-------需要动态移动 // "一步" preRun(ci, i);// i移动至ci同上 i = ci;// 则将根移至ci ci *= 2;// 根的孩子移至2*ci; } InputPanel.tempp[i] = y;// 最后一个元素移至i的位置---------------------------需要动态移动 // "一步" preRun(0, i); // 最后一个元素从temp位置移至位置i; return x; } }///********************* package test; import java.awt.Color; import java.awt.Font; import java.awt.Label; import java.awt.Panel; public class ShowPanel extends Panel { public ShowPanel() { Label l = new Label("堆排序算法演示"); Font font = new Font("Times-Roman", Font.BOLD, 20); l.setBackground(Color.BLUE); l.setForeground(Color.LIGHT_GRAY); l.setFont(font); this.setBounds(8, 30, 200, 40); this.add(l); this.setVisible(true); } } 上面附件是包!