Java 一个程序,它从一个随机数组中画出条,然后用定时器对其进行实时排序

Java 一个程序,它从一个随机数组中画出条,然后用定时器对其进行实时排序,java,arrays,user-interface,timer,selection-sort,Java,Arrays,User Interface,Timer,Selection Sort,我正在尝试编写一个程序,以图形方式显示选择排序。它需要对不同高度的条形进行排序,条形高度由随机整数数组生成。该程序需要显示的酒吧交换,因为他们正在被排序,我有麻烦让酒吧绘制,它需要看起来像一个条形图。 这是我到目前为止的代码(不包括我的锅炉板): import java.util.*; 导入java.awt.event.*; 导入javax.swing.*; 导入javax.swing.Timer; 导入java.awt.*; 导入java.util.Random; 公共类选择或面板扩展JPan

我正在尝试编写一个程序,以图形方式显示选择排序。它需要对不同高度的条形进行排序,条形高度由随机整数数组生成。该程序需要显示的酒吧交换,因为他们正在被排序,我有麻烦让酒吧绘制,它需要看起来像一个条形图。 这是我到目前为止的代码(不包括我的锅炉板):

import java.util.*;
导入java.awt.event.*;
导入javax.swing.*;
导入javax.swing.Timer;
导入java.awt.*;
导入java.util.Random;
公共类选择或面板扩展JPanel
{
专用静态最终整数延迟=20;
私有int[]随机数组=新int[20];
Timer Timer=新定时器(延迟,new BarListener());
公共选择或面板()
{
Random gen=新的Random();
//int[]随机数组=新int[20];
对于(int index=0;indexrandary[scan])
最小值=扫描;
//交换值
温度=随机阵列[min];
随机数组[min]=随机数组[index];
随机数组[索引]=温度;
重新油漆();
}
}
}
}
它将编译,但在运行时不会发生任何事情。
非常感谢您的帮助。

您需要一个主方法来运行它。。。把它插进去,它会把一些条整理好

public static void main(String args[])
{
    SelectionSortPanel panel = new SelectionSortPanel();
    JFrame frame = new JFrame();
    frame.add(panel);
    frame.pack();
    frame.setVisible(true);
}
从paintComponent方法中获取计时器.start(),而该方法与此无关。您应该调用这个方法一次,而不是像您当前拥有的那样在循环内部(抱歉,但这有点奇怪),也不是在您几乎无法控制的方法内部

事实上,paintComponent方法中不应该有与绘制无关的内容。另外,您不应该从中调用
setBackground(…)
setPreferredSize()
,而是应该在其他地方调用所有这些家伙,例如在类的构造函数内部。
paintComponent
方法也应该受到
保护
,而不是
公共
,并且应该在其上方有一个
@Override
注释


编辑
此外,您可能希望去掉其中一个for循环,因为计时器实际上将替换它。您需要考虑计时器的ActuistListActer的ActualExpReaction方法部分,就好像它是for循环的内部一样。但在这个问题上,我需要进一步研究您的代码


编辑2
另外,在您当前的编程阶段,我强烈建议您确保所有的代码块,包括if块、while循环等,都应该用大括号括起来。您有一个if块可能无法按预期工作,因为您缺少这些大括号。此外,您还需要非常小心和准确地进行代码缩进,出于同样的原因——良好的正确代码缩进将帮助您一目了然地看到代码块所属的位置,并帮助您进行调试和代码理解工作


编辑3
您的
Graphics#fillRect(…)
height参数不应为负值。还要避免使用神奇的数字。这样做将帮助您更轻松、更符合逻辑地改进代码——比如paintComponent drawRect方法中的神奇数字


编辑4

  • 我对for-loop业务的看法是错误的——将for-loop放在它们所在的位置
  • 我会让我的计时器延迟慢一点,比如500毫秒,而不是20毫秒
  • 当所有东西都排序好后,您将想要停止计时器的运行——所以请对此进行测试

编辑5
例如,我的paintComponent和getPreferredSize(而不是setPreferredSize)方法重写看起来类似于:

@Override
public Dimension getPreferredSize() {
  int prefW = BAR_GAP + RAND_ARRAY_LENGTH * (BAR_GAP + BAR_WIDTH);
  int prefH = MAX_BAR * SCALE + 2 * BAR_GAP;
  return new Dimension(prefW, prefH);
}

@Override
protected void paintComponent(Graphics page) {
  super.paintComponent(page);
  for (int i = 0; i < randArray.length; i++) {
     page.setColor(Color.red);
     int x = BAR_GAP + i * (BAR_WIDTH + BAR_GAP);
     int height = SCALE * randArray[i];
     int y = MAX_BAR * SCALE - height;
     page.fillRect(x, y, BAR_WIDTH, height);
  }
}
@覆盖
公共维度getPreferredSize(){
int prefW=条形间距+随机数组长度*(条形间距+条形宽度);
int prefH=最大钢筋*比例+2*钢筋间距;
返回新维度(prefW、prefH);
}
@凌驾
受保护的组件(图形页){
super.paintComponent(第页);
对于(int i=0;i
当我在我的锅炉板上安装框架时,我把它放进去了,但现在我把它放进去了,它仍然是一个无杆框架。它也在做排序吗?你是怎么得到我的一个空白屏幕的?是的,它排序(非常快,所以你几乎看不到它)。我真的不确定你的错在哪里。打开任务管理器,查看运行它时是否创建了新的Java进程?您所说的空白屏幕是什么意思?有黑色的长方形吗?或者根本就没有黑色背景?是否会出现一个新窗口?它设置了框架,但没有矩形。我试图帮助您建立问题的索引和格式。。。我想您缺少括号。谢谢,但它仍然不会显示条形图,我在底部运行了一个打印测试,它为我的数组值找到了0,所以我的问题在于数组没有保留这些值?@user3530192:是时候使用调试器或println statemetns进行一些调试了。另请参见编辑答案。你需要去掉ActionListener中的for循环。我把循环放在其他任何地方,它都无法识别页面?当你运行代码时,它是如何为你发生的?我必须去工作了,我会在以后重新讨论这个问题,感谢你迄今为止的帮助。
@Override
public Dimension getPreferredSize() {
  int prefW = BAR_GAP + RAND_ARRAY_LENGTH * (BAR_GAP + BAR_WIDTH);
  int prefH = MAX_BAR * SCALE + 2 * BAR_GAP;
  return new Dimension(prefW, prefH);
}

@Override
protected void paintComponent(Graphics page) {
  super.paintComponent(page);
  for (int i = 0; i < randArray.length; i++) {
     page.setColor(Color.red);
     int x = BAR_GAP + i * (BAR_WIDTH + BAR_GAP);
     int height = SCALE * randArray[i];
     int y = MAX_BAR * SCALE - height;
     page.fillRect(x, y, BAR_WIDTH, height);
  }
}