Java语言程序设计基础篇_编程练习题**18.38 (递归树)

目录

题目:**18.38 (递归树)

代码示例

代码逻辑解释

类定义和变量初始化

main 方法

start 方法

drawRecursiveTree 方法

输出结果 


题目:**18.38 (递归树)

编写一个程序来显示一个递归树,如图18-20所示

  • 代码示例

编程练习题18_38RecursionTree.java

package chapter_18;import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Line;
import javafx.stage.Stage;public class 编程练习题18_38RecursionTree extends Application{private int order;private int size;private int canvasWidth;private int canvasHeight;public static void main(String[] args) {Application.launch(args);}@Overridepublic void start(Stage primaryStage) throws Exception {size = 300;canvasWidth = size;canvasHeight = size - 50;Group root = new Group();Scene scene = new Scene(root,size,size);TextField tfOrder = new TextField();Label lbOrder = new Label("Enter a umber",tfOrder);lbOrder.setContentDisplay(ContentDisplay.RIGHT);lbOrder.setAlignment(Pos.CENTER);BorderPane borderPane = new BorderPane();borderPane.setCenter(root);borderPane.setBottom(lbOrder);BorderPane.setAlignment(lbOrder, Pos.CENTER);tfOrder.setOnKeyPressed(e ->{if(e.getCode() == KeyCode.ENTER) {root.getChildren().clear();order = Integer.parseInt(tfOrder.getText());drawRecursiveTree(root,order,canvasWidth/8,canvasHeight/4,canvasHeight*0.24,Math.PI/2);}});scene.setRoot(borderPane);primaryStage.setTitle(getClass().getName());primaryStage.setScene(scene);primaryStage.show();}private void drawRecursiveTree(Group group,int order,double x,double y,double length,double angle) {if(order < 0)return;double x2 = x + length*Math.cos(angle);double y2 = y - length*Math.sin(angle);Line line = new Line(x,y,x2,y2);line.setStroke(Color.BLACK);group.getChildren().add(line);drawRecursiveTree(group, order-1, x2, y2, length*0.7, angle-Math.PI/6);drawRecursiveTree(group, order-1, x2, y2, length*0.7, angle+Math.PI/6);}
}
  • 代码逻辑解释

类定义和变量初始化
  • 类定义编程练习题18_38RecursionTree 类继承自 Application,是 JavaFX 应用程序的入口。
  • 变量初始化:类中定义了四个私有变量 order(树的阶数),size(窗口大小),canvasWidth(画布宽度),canvasHeight(画布高度)。注意,虽然 canvasWidth 和 canvasHeight 被初始化了,但在绘图过程中它们实际上并没有直接被用作限制条件,而是用于计算初始绘图的起始位置和长度。
main 方法
  • Application.launch(args);:这是 JavaFX 应用程序的标准启动方式,它接收命令行参数并启动应用程序。
start 方法
  • 初始化窗口大小size 设置为 300 像素,canvasWidth 和 size 相同,canvasHeight 设置为 size - 50,为底部留出空间放置控件。
  • 创建 Group 和 SceneGroup 对象 root 作为所有绘图元素的容器,Scene 对象 scene 设置了窗口的大小,并将 root 作为其内容。
  • 创建用户输入控件TextField 用于接收用户输入的阶数,Label 显示提示信息并与 TextField 关联。Label 的内容显示设置为右侧,文本对齐设置为居中(虽然这主要用于水平布局,但在这个垂直布局的 BorderPane 中可能看起来有些奇怪)。
  • 布局设置:使用 BorderPane 布局,将 root 设置为中心区域,Label(包含 TextField)设置为底部区域。TextField 在 BorderPane 中直接居中对齐的设置实际上是无效的,因为它被包含在 Label 中,而 Label 的对齐方式被设置为居中,但这主要影响的是文本的水平对齐。
  • 事件监听:为 TextField 设置按键事件监听器,当按下回车键时,清除 Group 中的所有子元素,解析用户输入的阶数,并调用 drawRecursiveTree 方法绘制树。
  • 设置并显示舞台:将 BorderPane 设置为场景的根节点,设置舞台的标题,将场景添加到舞台,并显示舞台。
drawRecursiveTree 方法
  • 递归逻辑:该方法通过递归调用自身来绘制树的每一级分支。
  • 参数:包括 Group 对象(用于添加线条)、阶数(order)、当前分支的起点坐标(xy)、分支的长度(length),以及当前分支的角度(angle)。
  • 递归终止条件:如果阶数小于 0,则递归结束。
  • 绘制线条:计算当前分支的终点坐标,创建 Line 对象,设置其颜色和起点终点坐标,并将其添加到 Group 中。
  • 递归调用:对当前分支的左右两侧进行递归调用,每次递归时减小分支长度并调整角度(左右分支分别减去和加上 Math.PI/6,即 30 度)。

  • 输出结果 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1544418.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

git push错误:Out of memory, malloc failed (tried toallocate 947912704 bytes)

目录 一、错误截图 二、解决办法 一、错误截图 因项目文件过大&#xff0c;http.postBuffer设置的内存不够&#xff0c;所以报错。 二、解决办法 打开cmd窗口&#xff0c;执行如下命令即可 git config --global http.postBuffer 1024000000 如图所示 执行完成以后&#…

ABAP 学习t-code DWDM

ABAP 学习t-code DWDM &#xff0c;里面有很多例子展示&#xff0c;且能看到源代码

netty编程之我就非得用你,我用Java nio咋就不行?

写在前面 netty啊&#xff0c;我就非得用你&#xff0c;我用Java nio咋就不行&#xff1f; 1&#xff1a;我们都要做什么&#xff1f; 比如我们想要实现一个http的服务器&#xff0c;如果是直接基于Java nio来做的话&#xff0c;就需要来解析http协议&#xff0c;不小的工作…

第十七节 鼠标的操作与相应

知识点 -event代表鼠标事件类型 -EVENT_LBUTTONDOWN鼠标左键按下 -EVENT_LBUTTONUP鼠标左键抬起 -EVENT_LBUTTONMOVE鼠标及移动 Point sp(-1, -1); Point ep(-1, -1); Mat temp; static void on_draw(int event, int x, int y, int flags, void* userdata) { Mat imag…

通过 OBD Demo 体验 OceanBase 4.3 社区版

本文作者&#xff1a;马顺华 引言 OceanBase 4.3 是一个专为实时分析 AP 业务设计的重大更新版本。它基于LSM-Tree架构&#xff0c;引入了列存引擎&#xff0c;实现了行存与列存数据存储的无缝整合。这一版本不仅显著提升了AP场景的查询性能&#xff0c;同时也确保了TP业务场景…

RT-DETR

SSE represents the single-scale Transformer encoder&#xff0c;CSF represents cross-scale fusion. AIFI and CCFF are the two modules designed into 作者的 hybrid encoder 截止到发文时间的issue数&#xff0c;多吓人呐&#xff0c;不建议复现

从Servlet+JSP+JDBC到MyBatis:重构用户CRUD操作的高效之旅

前言 原生的JDBC&#xff1a; 原生的JDBC操作数据库&#xff0c;书写较为繁琐&#xff0c;降低开发效率。JDBC的局限性&#xff08;如代码冗余、SQL语句与Java代码紧密耦合、难以维护等&#xff09;。 相比于JDBC&#xff0c;Mybatis的优势&#xff1a; SQL与Java代码的分离、强…

性能测试工具——JMeter

目录 一、JMeter介绍 1、下载安装JMeter 2、打开JMeter 方式一&#xff1a; 方式二&#xff1a; 3、JMeter基础设置 4、JMeter基本使用流程 &#xff08;1&#xff09;启动JMeter &#xff08;2&#xff09;在测试计划下添加线程组 &#xff08;3&#xff09;在 “线…

Linux权限修改及管理员权限获取

在网上看到的&#xff0c;自己当作字典记录下来 修改文件权限&#xff1a;chmod 使用 chmod 可以修改文件权限。 两种方式&#xff1a;字母法与数字法 一&#xff0c;字母法修改文件权限 例如&#xff1a;文件名为 test.x 给文件 test.x 添加所有用户都能执行的权限&#x…

CSS简明通俗教程

CSS简明通俗教程 1. CSS简介 CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式表&#xff09;是一种样式表语言。CSS用于描述HTML或XML&#xff08;包括SVG或XHTML等XML方言&#xff09;文档的呈现方式&#xff0c;它有自己的语法规则和逻辑&#xff0c;用于控制网…

年薪40W!转AI产品经理后,我明白了有人带的意义在哪!

如果你正想转岗/入行产品经理&#xff0c;我的故事或许能给你一些启示&#x1f447; 初识产品 目标有了&#xff0c;问题也有了 和很多人一样&#xff0c;毕业的时候比较迷茫&#xff0c;不知道自己喜欢什么行业、岗位… 就按照专业找了一个对口且擅长的算法工作&#xff0…

学习C#,视频、书籍、在线文档哪种是你喜欢的方式,80%的人竟然选择这个方式!

大家好&#xff0c;我是编程乐趣。 每一个人学习编程&#xff0c;选择的方式、习惯的方式可能都不一样&#xff0c;有些人喜欢买书、有些人喜欢看官方文档、有些人喜欢看视频。 哪一种方式&#xff0c;我个人认为都没问题&#xff0c;只要能获取知识就行。 下面一起看看Stac…

一带一路区块链样题解析(上)

一带一路区块链赛项样题解析 模块一 任务一:按要求完成 FISCO BCOS 区块链系统部署 (1)编写配置文档 1.根据题目设置各项要求,使用build_chain.sh离线搭建匹配的区块链,并通过命令配置各群组节点的MySQL数据库;(1分) cat >> ipconf <<EOF 127.0.0.1:3 …

基于C#+SQL Server2008实现(CS界面)学生宿舍管理系统

1 概述 本次课程设计是数据库课程设计&#xff0c;我选的是学生宿舍管理系统&#xff0c;功能块主要是宿舍管理、学生管理、出入登记和来访登记&#xff0c;目的在于将学生宿舍的管理实现信息化&#xff0c;监控学生宿舍的情况防止意外发生。 课程设计任务的需求分析 2.1设计…

中航资本:交易港股通,为什么刚买入就显示亏损?

经过港股通生意港股&#xff0c;刚买入就闪现亏本是因为买入港股时会有一个汇率差。 港股通生意选用的是港币报价、人民币结算的方式&#xff0c;港股通的参看本钱价是以港币核算的&#xff0c;触及买入时将港币换成人民币&#xff0c;卖出时将人民币换成港币的进程&#xff0…

Java语言程序设计基础篇_编程练习题18.36 (思瑞平斯基三角形)

目录 题目&#xff1a;18.36 (思瑞平斯基三角形) 代码示例 代码逻辑 1. 应用程序入口 2. GUI设置 3. 事件处理 4. 绘制逻辑 5. 递归绘制 输出结果 题目&#xff1a;18.36 (思瑞平斯基三角形) 编写一个程序&#xff0c;让用户输入一个阶数&#xff0c;然后显示填充的…

送书!一大波LLM大模型学习教程书籍

最近整理了日前市面上一大波大模型的书&#xff0c;已经打包成pdf了&#xff0c;大家有需要的&#xff0c;可以自行添加获取&#xff0c;纯福利&#xff0c;无套路&#xff0c;添加后说明是哪本书&#xff0c;会直接给大家&#xff01; &#x1f449;CSDN大礼包&#x1f381;&a…

国产SSL证书品牌怎么选择?

有人在歪曲大型央国企“信创化”与数字化转型建设思路&#xff0c;为了自身的利益开始造谣一些虚假传播信息国外SSL证书不安全问题&#xff0c;然而国外的SSL证书每个上网用户都在使用&#xff0c;然而发布虚假广告的一些人实际上是换了个马甲贴个名字就叫国产SSL证书了&#x…

等保测评误区与应对:企业常见问题解析

标题&#xff1a;等保测评误区与应对&#xff1a;企业常见问题解析 信息安全等级保护&#xff08;等保&#xff09;测评是企业信息安全建设的重要组成部分&#xff0c;但在实际操作中&#xff0c;企业常会陷入一些误区。本文将解析企业等保测评中常见的误区&#xff0c;并提出…

【Python报错已解决】IndexError: list index out of range

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…