gpt4 book ai didi

java - 初学者 Swing 递归

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:07:14 25 4
gpt4 key购买 nike

这个编程作业让我难住了;代码如下:

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

public class HTree extends JPanel {

private Color color = new Color((int)(Math.random() * 256), (int)(Math.random() * 256), (int)(Math.random() * 256));

public void draw(Graphics g, int n, double sz, double x, double y) {
if (n == 0) return;
double x0 = x - sz/2, x1 = x + sz/2;
double y0 = y - sz/2, y1 = y + sz/2;
// draw the 3 line segments of the H
g.setColor(color);
g.drawLine((int)x0, (int)y, (int)x1, (int)y);
g.drawLine((int)x0, (int)y0, (int)x0, (int)y1);
g.drawLine((int)x1, (int)y0, (int)x1, (int)y1);
// recursively draw 4 half-size
// H-trees of order n-1
g.setColor(color);
draw(g, n-1, sz/2, x0, y0);
draw(g, n-1, sz/2, x0, y1);
draw(g, n-1, sz/2, x1, y0);
draw(g, n-1, sz/2, x1, y1);
repaint();
}

public void paintComponent(Graphics g) {
super.paintComponent(g);
draw(g, 3, .5, .5, .5);
}

public static void main(String[] args) {
HTree h = new HTree();
JFrame application = new JFrame("HTree");
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
application.add(h);
application.setSize(1000, 1000);
application.setVisible(true);
}
}

它编译正确,但在运行程序时,我得到的只是一个空的 JFrame。我对 Swing 不太熟悉,但我认为问题是 HTree 构造函数错误,或者我可能需要在 main 中调用 draw()——我'我不确定如何使用 Graphics 对象调用它。感谢任何帮助,谢谢!

最佳答案

一些观察:

  • 使用相对于面板当前大小的整数坐标。

  • 覆盖 getPreferredSize()建立初始几何。

  • 使用 Color.getHSBColor() 获得明亮、饱和的颜色;考虑创建一系列色调,在每个级别选择不同的色调,example .

  • event dispatch thread.构造和操作 Swing GUI 对象

  • 按照建议,考虑使用 JSpinnerJSlider 以交互方式控制递归深度 herehere .

  • 不要递归调用repaint();使用它来安排对 paintComponent() 实现的调用,就像递归深度响应某些输入时一样。

  • 考虑使用 setStroke() 和渲染提示,如图所示 here .

  • 考虑使用 javax.swing.Timer ,每次调用 ActionListener 时递归深度增加一级。

image

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
* @see https://stackoverflow.com/a/37450393/230513
*/
public class HTree {

private void display() {
JFrame f = new JFrame("HTree");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new Tree());
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}

private static class Tree extends JPanel {

private final Color color = Color.getHSBColor((float) Math.random(), 1, 1);

public void draw(Graphics g, int n, double sz, double x, double y) {
if (n == 0) {
return;
}
double x0 = x - sz / 2, x1 = x + sz / 2;
double y0 = y - sz / 2, y1 = y + sz / 2;
// draw the 3 line segments of the H
g.setColor(color);
g.drawLine((int) x0, (int) y, (int) x1, (int) y);
g.drawLine((int) x0, (int) y0, (int) x0, (int) y1);
g.drawLine((int) x1, (int) y0, (int) x1, (int) y1);
// recursively draw 4 half-size
// H-trees of order n-1
g.setColor(color);
draw(g, n - 1, sz / 2, x0, y0);
draw(g, n - 1, sz / 2, x0, y1);
draw(g, n - 1, sz / 2, x1, y0);
draw(g, n - 1, sz / 2, x1, y1);
}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
draw(g, 3, getWidth() / 2, getWidth() / 2, getHeight() / 2);
}

@Override
public Dimension getPreferredSize() {
return new Dimension(500, 500);
}
}

public static void main(String[] args) {
EventQueue.invokeLater(new HTree()::display);
}
}

关于java - 初学者 Swing 递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37449686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com