为什么输出错误

我应该得到一棵树。但我没有得到一棵树。我得到了一个很长的东西,而不是一棵树。


这是我的代码:


主.java


import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;


import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.SwingUtilities;


public class Main extends JFrame {


private static final long serialVersionUID = 1L;


public Main() {


    setTitle("Tree");

    setDefaultCloseOperation(EXIT_ON_CLOSE);

    //setResizable(false);


    add(new TreeDrawer(), BorderLayout.CENTER);

    getContentPane().setBackground(Color.BLACK);


    //button shit

    JButton generate = new JButton("Generate");

    generate.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent arg0) {


            TreeDrawer.generate();

            repaint();

        }

    });


    add(generate, BorderLayout.SOUTH);

    pack();

    setVisible(true);


}


public static void main(String[] args) {


    SwingUtilities.invokeLater(() -> {

        new Main();

    });


    }


}

我做错了什么。我不知道如何发布我得到的输出的屏幕截图,但它看起来完全不正确。我知道我的 L 系统算法是正确的,因为它运行良好。但是我认为当我尝试保存和恢复转换状态时,出现了问题。保存转换状态是括号([和]。'['保存,']'从该保存恢复)。但我不知道出了什么问题。我需要帮助找出问题所在。谢谢你。



心有法竹
浏览 123回答 1
1回答

互换的青春

观察...如果您没有创建 的实例Graphics,则不应将对其的引用保持超过您需要使用它的时间。相反,您应该将它作为参数传递给需要使用它的方法。这将使您免于一些严重的怪异文物和可能NullPointerException的如果要转换Graphics上下文,最好先创建一个副本,因为它是所有绘制组件之间的共享资源。在这种情况下,static不是你的朋友,而且是糟糕的设计。考虑到所有这些,类似以下的工作......在基本层面上import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.RenderingHints;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.geom.AffineTransform;import javax.swing.JButton;import javax.swing.JComponent;import javax.swing.JFrame;import javax.swing.SwingUtilities;public class Main extends JFrame {&nbsp; &nbsp; private static final long serialVersionUID = 1L;&nbsp; &nbsp; private TreeDrawer treeDrawer;&nbsp; &nbsp; public Main() {&nbsp; &nbsp; &nbsp; &nbsp; setTitle("Tree");&nbsp; &nbsp; &nbsp; &nbsp; setDefaultCloseOperation(EXIT_ON_CLOSE);&nbsp; &nbsp; &nbsp; &nbsp; //setResizable(false);&nbsp; &nbsp; &nbsp; &nbsp; treeDrawer = new TreeDrawer();&nbsp; &nbsp; &nbsp; &nbsp; add(treeDrawer, BorderLayout.CENTER);&nbsp; &nbsp; &nbsp; &nbsp; getContentPane().setBackground(Color.BLACK);&nbsp; &nbsp; &nbsp; &nbsp; //button shit&nbsp; &nbsp; &nbsp; &nbsp; JButton generate = new JButton("Generate");&nbsp; &nbsp; &nbsp; &nbsp; generate.addActionListener(new ActionListener() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void actionPerformed(ActionEvent arg0) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; treeDrawer.generate();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; repaint();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; add(generate, BorderLayout.SOUTH);&nbsp; &nbsp; &nbsp; &nbsp; pack();&nbsp; &nbsp; &nbsp; &nbsp; setVisible(true);&nbsp; &nbsp; }&nbsp; &nbsp; public static void main(String[] args) {&nbsp; &nbsp; &nbsp; &nbsp; SwingUtilities.invokeLater(() -> {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new Main();&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; }&nbsp; &nbsp; public class TreeDrawer extends JComponent {&nbsp; &nbsp; &nbsp; &nbsp; private static final long serialVersionUID = 1L;&nbsp; &nbsp; &nbsp; &nbsp; public static final int ROOM_WIDTH = 1080;&nbsp; &nbsp; &nbsp; &nbsp; public static final int ROOM_HEIGHT = 720 - 47;// 47 is the height of menu bar on top of jframe or some shit&nbsp; &nbsp; &nbsp; &nbsp; double len = 100;&nbsp; &nbsp; &nbsp; &nbsp; public TreeDrawer() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setPreferredSize(new Dimension(ROOM_WIDTH, ROOM_HEIGHT));&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; private String axiom = "F";&nbsp; &nbsp; &nbsp; &nbsp; private String sentence = axiom;&nbsp; &nbsp; &nbsp; &nbsp; private String rules(char a) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (a == 'F')//a rule&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return "FF+[+F-F-F]-[-F+F+F]";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return "";//if nothing else works, shit&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; //probably correct&nbsp; &nbsp; &nbsp; &nbsp; public void generate() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; len *= 0.5;//shrink the shit&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String nextSentence = "";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i < sentence.length(); i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; char current = sentence.charAt(i);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nextSentence += rules(current);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sentence = nextSentence;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(sentence);//&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; turtle();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; public void turtle(Graphics2D graphics) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AffineTransform transform = null;//so you can save shit&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i < sentence.length(); i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; char current = sentence.charAt(i);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (current == 'F') {//draw up&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; graphics.drawLine(0, 0, 0, (int) -len);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; graphics.translate(0, -len);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else if (current == '+') {//right turn&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; graphics.rotate(Math.PI / 6);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else if (current == '-') {//left turn&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; graphics.rotate(-Math.PI / 6);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } //probably wrong shit&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else if (current == '[') {//save transformations&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; transform = graphics.getTransform();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } //also probably wrong shit&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else if (current == ']') {//restore from last save&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; graphics.setTransform(transform);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public void paintComponent(Graphics g) {//so that shit is drawn&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Graphics2D g2d = (Graphics2D) g.create();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; super.paintComponent(g2d);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; g2d.translate(ROOM_WIDTH / 2, ROOM_HEIGHT - 10);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; g2d.setPaint(Color.WHITE);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; turtle(g2d);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; g2d.dispose();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java