- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题对我来说有点难以表达,但基本上这就是我想做的:我有一个家庭作业来绘制递归树,用户能够选择显示的节点数量。我有一个使用递归绘制树的绘制方法,我需要程序接受来自文本字段的用户输入。我对递归很陌生,但我和我的室友设法使用 Graphics2D 绘制了一些东西,但我们无法开始弄清楚如何允许用户选择节点的数量。输入字段的骨架就在那里,但它没有做任何事情,因为我没有 ActionListener 并且不确切知道要放入 ActionListener 中以允许用户输入值。任何帮助将不胜感激。谢谢!
import java.awt.*;
import javax.swing.*;
public class Tree extends JPanel {
private static final long serialVersionUID = 1L;
private JLabel num; //tells user to enter number of nodes
private JTextField in; //text field for user input
public Tree() {
num = new JLabel("Number of Branches: ");
add(num);
in = new JTextField(5);
add(in);
}
private void draw(Graphics2D g, int n, int x, int y) {
if (n == 0) {
return;
} else {
int angle = 45;
int length = 50;
g.drawLine(x, y, x, y - length); // trunk
g.setColor(Color.BLACK);
g.rotate(Math.toRadians(-angle), x, y - length); // left
// branch
draw(g, n - 1, x, y - length);
g.rotate(Math.toRadians(angle), x, y - length);
g.rotate(Math.toRadians(angle), x, y - length); // right
// branch
draw(g, n - 1, x, y - length);
g.rotate(Math.toRadians(-angle), x, y - length);
}
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D gg = (Graphics2D) g;
draw(gg, 3, getWidth() / 2, getHeight() / 2);
}
public static void main(String[] args) {
Tree tree = new Tree();
tree.setPreferredSize(new Dimension(500, 500));
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(tree);
frame.setSize(500, 500);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
最佳答案
我个人会使用 MVC(模型- View - Controller )模型来组织我的代码,使两者之间的显示、处理和通信保持独立。这样可以更轻松地跟踪正在发生的事情。在您的情况下,树对象是绘图、标签和按钮。但由于您已经编写了代码,因此调整它会更容易。
要添加操作监听器,您需要将用户输入注册为事件和“捕获它”的按钮。从这个意义上来说,事件就是用户按下按钮。因此,一旦用户输入节点数并按下按钮,操作监听器就会响应此事件并执行所需的代码(绘制树)。
这是我的做法:
导入java.awt.*;
导入javax.swing.*;
公共(public)类 Tree 扩展 JPanel {
private static final long serialVersionUID = 1L;
// I made all components static since you only need one copy of each
private static JLabel num; //tells user to enter number of nodes
private static JTextField in; //text field for user input
private static JButton enter = new JButton("Enter");// create a button to capture event
private static Tree tempTree;
private int nodeNumber; // makes a tree's node number changeable
public Tree() {
this.nodeNumber = 0;
num = new JLabel("Number of Branches: ");
add(num);
in = new JTextField(5);
add(in);
add(enter);
add(enter);
}
private void draw(Graphics2D g, int n, int x, int y) {
if (n == 0) {
return;
} else {
int angle = 45;
int length = 50;
g.drawLine(x, y, x, y - length); // trunk
g.setColor(Color.BLACK);
g.rotate(Math.toRadians(-angle), x, y - length); // left
// branch
draw(g, n - 1, x, y - length);
g.rotate(Math.toRadians(angle), x, y - length);
g.rotate(Math.toRadians(angle), x, y - length); // right
// branch
draw(g, n - 1, x, y - length);
g.rotate(Math.toRadians(-angle), x, y - length);
}
}
// I had to overload your draw method to one in which I can change the drawing multiple times later
private void draw(Graphics2D g, int x, int y)
{
int n = this.nodeNumber;
if (n == 0) {
return;
} else {
int angle = 45;
int length = 50;
g.drawLine(x, y, x, y - length); // trunk
g.setColor(Color.BLACK);
g.rotate(Math.toRadians(-angle), x, y - length); // left
// branch
draw(g, n - 1, x, y - length);
g.rotate(Math.toRadians(angle), x, y - length);
g.rotate(Math.toRadians(angle), x, y - length); // right
// branch
draw(g, n - 1, x, y - length);
g.rotate(Math.toRadians(-angle), x, y - length);
}
}
//makes a tree's node number editable
public void setNodeNumber(int number)
{
this.nodeNumber = number;
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D gg = (Graphics2D) g;
//this version can change node number
draw(gg,getWidth() / 2, getHeight() / 2);
}
public static void main(String[] args) {
Tree tree = new Tree();
tree.setPreferredSize(new Dimension(500, 500));
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(tree);
frame.setSize(500, 500);
// stores the currently displayed tree for later changes
Tree.tempTree = tree;
Listener enterListener = new Listener();
Tree.enter.setActionCommand("ENTER");
Tree.enter.addActionListener(enterListener);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
// refreshes tree
public static void refreshTree()
{
int inputNumber;
// checks if input is a number or not
try
{
//gets input node number
inputNumber = Integer.parseInt(Tree.in.getText());
//sets node number
Tree.tempTree.setNodeNumber(inputNumber);
// updates tree
Tree.tempTree.updateUI();
}
catch(NumberFormatException e)
{
System.out.println(" Invalid node Number " + e);
}
}
}
您还需要一个 Action 监听器类:
导入java.awt.event.ActionEvent;导入 java.awt.event.ActionListener;
公共(public)类Listener实现ActionListener{
@Override
public void actionPerformed(ActionEvent event) {
String action = event.getActionCommand();
if(action.equals("ENTER"))
{
Tree.refreshTree();
}
}
}
关于java - 使用 ActionListener 调用递归树方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23110270/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!