Java 试图在秋千工人内部绘制矩形
我有代码创建一组垂直矩形来可视化排序算法Java 试图在秋千工人内部绘制矩形,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,我有代码创建一组垂直矩形来可视化排序算法 class MyGUI extends JComponent { static int rectangleArray[][] = new int[50][2]; boolean populated = false; public void paint(Graphics g) { int margin = 5; if (!populated) { populate(); populated = true
class MyGUI extends JComponent {
static int rectangleArray[][] = new int[50][2];
boolean populated = false;
public void paint(Graphics g) {
int margin = 5;
if (!populated) {
populate();
populated = true;
}
for (int i = 0; i < rectangleArray.length; i++) {
if (rectangleArray[i][1] == 0) {
g.setColor(Color.BLACK);
} else if (rectangleArray[i][1] == 1) {
g.setColor(Color.RED);
} else if (rectangleArray[i][1] == 2) {
g.setColor(Color.BLUE);
}
g.fillRect (margin, 305 - rectangleArray[i][0], 10, rectangleArray[i][0]);
margin += 15;
g.setColor(Color.BLACK);
}
insertionSort(); //i want to visually show the swaps here
}
public static void main(String[] a) {
JFrame window = new JFrame();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setBounds(30, 30, 800, 600);
window.getContentPane().add(new MyGUI());
window.setVisible(true);
}
}
MyGUI类扩展了JComponent{
静态整数矩形数组[][]=新整数[50][2];
布尔值=假;
公共空间涂料(图g){
整数裕度=5;
如果(!已填充){
填充();
填充=真;
}
对于(int i=0;ipublic class GUIv3 extends JPanel
{
static int rectangleArray[][] = new int[50][2];
boolean populated = false;
private class UpdateTextFieldThread extends SwingWorker<Void, Integer>
{
static final int THREAD_DELAY = 50;
protected Void doInBackground()
{
//this is the insertion sort code
for (int i = 0; i < rectangleArray.length; i++) {
int value = rectangleArray[i][0];
int j = i - 1;
while (j >= 0 && rectangleArray[j][0] > value) {
rectangleArray[j + 1][0] = rectangleArray[j][0];
j = j - 1;
}
rectangleArray[j + 1][0] = value;
//printNumbers(rectangleArray);
try {
repaint();
Thread.sleep(THREAD_DELAY);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
return null;
}
}
public GUIv3()
{
JFrame window = new JFrame();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setBounds(30, 30, 800, 600);
window.getContentPane().add(new GUIv3());
window.setVisible(true);
int margin = 5;
if (!populated) {
populate();
populated = true;
}
for (int i = 0; i < rectangleArray.length; i++) {
//i cant exactly do anything to g since it doesn't exist here...
if (rectangleArray[i][1] == 0) {
g.setColor(Color.BLACK);
} else if (rectangleArray[i][1] == 1) {
g.setColor(Color.RED);
} else if (rectangleArray[i][1] == 2) {
g.setColor(Color.BLUE);
}
g.fillRect (margin, 305 - rectangleArray[i][0], 10, rectangleArray[i][0]);
margin += 15;
g.setColor(Color.BLACK);
}
}
public static void main(String[] args)
{
new GUIv3();
}
public void populate() {
for (int i = 0; i < rectangleArray.length; i++) {
rectangleArray[i][0] = (int)(Math.random() * 300) + 1;
}
}
}
public类GUIv3扩展了JPanel
{
静态整数矩形数组[][]=新整数[50][2];
布尔值=假;
私有类UpdateTextFieldThread扩展SwingWorker
{
静态最终int线程延迟=50;
受保护的Void doInBackground()
{
//这是插入排序代码
对于(int i=0;i=0&&rectangleArray[j][0]>值){
矩形阵列[j+1][0]=矩形阵列[j][0];
j=j-1;
}
矩形数组[j+1][0]=值;
//打印号码(矩形阵列);
试一试{
重新油漆();
休眠(线程延迟);
}捕获(中断异常例外){
Thread.currentThread().interrupt();
}
}
返回null;
}
}
公共GUIv3()
{
JFrame窗口=新JFrame();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
窗.立根(30,30800600);
getContentPane().add(新GUIv3());
window.setVisible(true);
整数裕度=5;
如果(!已填充){
填充();
填充=真;
}
对于(int i=0;i
我已经评论了我的问题所在。我不知道如何在没有使用Graphics g的paint方法的情况下创建对象
谢谢
我尝试在每次迭代后重新绘制画布。我知道我需要把它放进一个swing worker中,我的尝试是:
public class GUIv3 extends JPanel
{
static int rectangleArray[][] = new int[50][2];
boolean populated = false;
private class UpdateTextFieldThread extends SwingWorker<Void, Integer>
{
static final int THREAD_DELAY = 50;
protected Void doInBackground()
{
//this is the insertion sort code
for (int i = 0; i < rectangleArray.length; i++) {
int value = rectangleArray[i][0];
int j = i - 1;
while (j >= 0 && rectangleArray[j][0] > value) {
rectangleArray[j + 1][0] = rectangleArray[j][0];
j = j - 1;
}
rectangleArray[j + 1][0] = value;
//printNumbers(rectangleArray);
try {
repaint();
Thread.sleep(THREAD_DELAY);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
return null;
}
}
public GUIv3()
{
JFrame window = new JFrame();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setBounds(30, 30, 800, 600);
window.getContentPane().add(new GUIv3());
window.setVisible(true);
int margin = 5;
if (!populated) {
populate();
populated = true;
}
for (int i = 0; i < rectangleArray.length; i++) {
//i cant exactly do anything to g since it doesn't exist here...
if (rectangleArray[i][1] == 0) {
g.setColor(Color.BLACK);
} else if (rectangleArray[i][1] == 1) {
g.setColor(Color.RED);
} else if (rectangleArray[i][1] == 2) {
g.setColor(Color.BLUE);
}
g.fillRect (margin, 305 - rectangleArray[i][0], 10, rectangleArray[i][0]);
margin += 15;
g.setColor(Color.BLACK);
}
}
public static void main(String[] args)
{
new GUIv3();
}
public void populate() {
for (int i = 0; i < rectangleArray.length; i++) {
rectangleArray[i][0] = (int)(Math.random() * 300) + 1;
}
}
}
不,最简单的方法就是使用一个摆动计时器。由于您一步一步地迭代排序,因此实际的单个排序步骤几乎不需要任何处理时间,因此计时器应该为您提供足够的延迟,而不必处理创建SwingWorker或任何其他直接后台线程的麻烦
我不知道如何在没有使用Graphics g的paint方法的情况下创建对象
简单,只需将注意力集中在对集合(如数组或ArrayList)中的数字进行排序,然后在JPanel的paintComponent(Graphics g)
方法中,迭代数组或集合,并根据集合中找到的数字绘制矩形,并使用JVM提供给paintComponent
覆盖的图形对象。不过,别忘了先调用super的方法,以便删除上一个图形
编辑
你问:
如何在组件上实现摆动计时器?我可以得到一些关于如何启用swing定时器和执行这些覆盖的指导吗 一方不直接与另一方互动
- 每次调用Swing Timer的ActionListener方法时,它将在排序迭代中执行一个新步骤李>
- 然后,它将用新值填充类实例字段int-array或
ArrayList
- 然后在绘图矩形上调用
repaint()
- 调用
将刺激绘制级联,通常会导致JVM调用绘图JPanel的repaint()
方法paintComponent
- 然后,此方法将使用数字遍历实例字段,并使用数字绘制矩形
- 同样,paintComponent方法不直接与计时器交互,甚至不知道它的存在。它所知道要做的就是遍历集合并绘制集合的可视化表示
- 并且计时器与paintComponent方法或图形对象没有直接交互。它所做的只是一个排序步骤,将数据填充到绘图代码可用的某个位置,然后通过调用
repaint触发绘图(