为了账号安全,请及时绑定邮箱和手机立即绑定

为什么输出错误

为什么输出错误

心有法竹 2022-10-07 17:51:33
我应该得到一棵树。但我没有得到一棵树。我得到了一个很长的东西,而不是一棵树。这是我的代码:主.javaimport 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 系统算法是正确的,因为它运行良好。但是我认为当我尝试保存和恢复转换状态时,出现了问题。保存转换状态是括号([和]。'['保存,']'从该保存恢复)。但我不知道出了什么问题。我需要帮助找出问题所在。谢谢你。
查看完整描述

1 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

观察...

  1. 如果您没有创建 的实例Graphics,则不应将对其的引用保持超过您需要使用它的时间。相反,您应该将它作为参数传递给需要使用它的方法。这将使您免于一些严重的怪异文物和可能NullPointerException

  2. 如果要转换Graphics上下文,最好先创建一个副本,因为它是所有绘制组件之间的共享资源。

  3. 在这种情况下,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 {


    private static final long serialVersionUID = 1L;


    private TreeDrawer treeDrawer;


    public Main() {


        setTitle("Tree");

        setDefaultCloseOperation(EXIT_ON_CLOSE);

        //setResizable(false);


        treeDrawer = new TreeDrawer();

        add(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();

        });


    }


    public class TreeDrawer extends JComponent {


        private static final long serialVersionUID = 1L;


        public static final int ROOM_WIDTH = 1080;

        public static final int ROOM_HEIGHT = 720 - 47;// 47 is the height of menu bar on top of jframe or some shit

        double len = 100;


        public TreeDrawer() {

            setPreferredSize(new Dimension(ROOM_WIDTH, ROOM_HEIGHT));

        }


        private String axiom = "F";

        private String sentence = axiom;


        private String rules(char a) {

            if (a == 'F')//a rule

            {

                return "FF+[+F-F-F]-[-F+F+F]";

            }

            return "";//if nothing else works, shit

        }


        //probably correct

        public void generate() {

            len *= 0.5;//shrink the shit

            String nextSentence = "";

            for (int i = 0; i < sentence.length(); i++) {

                char current = sentence.charAt(i);

                nextSentence += rules(current);

            }

            sentence = nextSentence;

            System.out.println(sentence);

//            turtle();

        }


        public void turtle(Graphics2D graphics) {


            AffineTransform transform = null;//so you can save shit


            for (int i = 0; i < sentence.length(); i++) {

                char current = sentence.charAt(i);


                if (current == 'F') {//draw up

                    graphics.drawLine(0, 0, 0, (int) -len);

                    graphics.translate(0, -len);

                } else if (current == '+') {//right turn

                    graphics.rotate(Math.PI / 6);

                } else if (current == '-') {//left turn

                    graphics.rotate(-Math.PI / 6);

                } //probably wrong shit

                else if (current == '[') {//save transformations


                    transform = graphics.getTransform();

                } //also probably wrong shit

                else if (current == ']') {//restore from last save

                    graphics.setTransform(transform);

                }

            }

        }


        @Override

        public void paintComponent(Graphics g) {//so that shit is drawn

            Graphics2D g2d = (Graphics2D) g.create();

            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

            super.paintComponent(g2d);

            g2d.translate(ROOM_WIDTH / 2, ROOM_HEIGHT - 10);

            g2d.setPaint(Color.WHITE);


            turtle(g2d);

            g2d.dispose();

        }

    }


}


查看完整回答
反对 回复 2022-10-07
  • 1 回答
  • 0 关注
  • 122 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号