当前位置: 首页 > 知识库问答 >
问题:

在jframe[closed]中创建java的正方形、矩形和三角形

商皓
2023-03-14

想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。

我有一个关于Java的问题,因为我了解不来用Java绘制几何图形,下面的代码你能帮我吗?

这是代码:

public class Gioco {


    public static void main (String args [])
    {
        PaintRect();

    }

    public static void PaintRect() {

        g.drawRect(100,100,300,300);
        g.drawLine(100,100,100,100);
        g.setBackground(Color.BLACK);
        System.out.println("Trasut");
        credits.setText("Kitebbiv");
        credits.setBackground(null);
        credits.setEditable(false);
        credits.setFocusable(false);
        credits.setBounds(0,0,100,100);
        credits.setForeground(Color.BLACK);
        panel.add(credits);
        g.getPaint();
    }

如何创建三角形、正方形和矩形的JFrame?更正我的代码谢谢

共有1个答案

栾耀
2023-03-14

在我开始写我的答案之前,我需要鼓励你仔细阅读:如何创建一个有效的最小、完整和可验证的示例和一个简短、自足、正确的示例。

>

  • 从您(现已删除)的代码中,我看到您还没有完成自定义绘画的Swing教程,或者您甚至没有注意它,这行会给您带来问题

    static Graphics2D g = new Graphics2D() 
    

    过度使用静态修饰符会伤害你,静态不是一个跨方法的魔法词,可以让你的变量在程序的任何地方都可以访问,你应该创建一个你的程序实例并从那里调用方法(它们不是静态的),请参阅为什么静态变量被认为是邪恶的?,你真的应该回去学习要点,然后使用GUI甚至使用Swing自定义绘画为您的学习增加更多复杂性。

    你正在使用setBounds()方法,这表明(我可以在你删除的代码中确认)你正在使用一个空布局:

    panel.setLayout(null);
    

    您真的应该考虑检查布局管理器

    您使用的是一种不推荐使用的方法,而应该使用方法。

    在手动设置JFrame的大小时,应该使用布局管理器并调用方法JFrame#pack(),该方法将计算JFrame的首选大小,或覆盖组件的getPreferredSize()

    在您删除的代码上,您的鼠标侦听器连接到了一个按钮,而您需要使用一个动作侦听器,请参阅如何使用动作来了解这一点。

    您没有将程序放在事件调度线程(EDT)上,这可能会使程序冻结,因为Swing不是线程安全的。您可以通过如下方式编写主方法来纠正此问题:

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                //Your constructor here
            }
        });
    }
    

    你应该更礼貌一点:“纠正我的代码谢谢”听起来像是命令,我会这么说的,你能帮我吗?这听起来像是请求某人帮助你,因为他们可以,而不是因为他们必须帮助你,以上几点都可以纠正你的代码。

    在所有上述内容(您应该仔细阅读)之后,我们可以继续进行编码部分:

    为了绘制矩形,我们需要了解一些关于矩形的知识:

    • 矩形有宽度和高度,两者都不同
    • 在Swing中绘制矩形的方法是使用Graphics2D方法的drawRect(x,y,width,height) draw(Shape),其中形状是矩形2D的一个实例

    要绘制正方形,我们需要知道:

    • 正方形有宽度和高度,两者大小相等

    你一定是在说...“但是你用来绘制正方形的方法和矩形是一样的!”,嗯...是的,我们是,区别在于我们要传递一个 宽度高度正方形的大小相等,矩形的大小不同。

    要绘制三角形,您需要知道:

    • 三角形有三条边,它们可以是相同或不同的大小

    现在,将所有这些放在一起,我们应该将所有代码放在 JGroup的覆盖方法中,称为 油漆组件(),如教程所示(参见第#1点)。它应该看起来像这样:

      
       @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g); //ALWAYS call this method first!
        g.drawRect(10, 10, 50, 50); //Draws square
        g.drawRect(10, 75, 100, 50); //Draws rectangle
        g.drawPolygon(new int[] {35, 10, 60}, new int[] {150, 200, 200}, 3); //Draws triangle
    }
    
      

    但是我们还需要在我们的JPanel上重写另一个方法(请参阅:我应该避免在Swing中使用setPreferred | Maximum | MinimumSize吗?普遍的共识是肯定的),否则我们的JFrame将比我们想要的小,所以它应该是这样的:

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

    不要忘了在这些方法中调用Override!

    只有这些方法,我们已经完成了绘制形状的程序,但我知道如果我不发布整个代码,您最终会在一个不起作用或导致html" target="_blank">编译错误的地方编写上述方法,因此产生以下输出的整个代码(实际上是MCVE或SSCCE(请参阅本答案中的第一段以了解每个意思))是:

      
       import java.awt.Dimension;
    import java.awt.Graphics;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class ShapesDrawing {
    
        private JFrame frame;
        private JPanel pane;
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new ShapesDrawing().createAndShowGui();
                }
            });
        }
    
        public void createAndShowGui() {
            frame = new JFrame(getClass().getSimpleName());
            pane = new JPanel() {
                @Override
                protected void paintComponent(Graphics g) {
                    super.paintComponent(g); //ALWAYS call this method first!
                    g.drawRect(10, 10, 50, 50); //Draws square
                    g.drawRect(10, 75, 100, 50); //Draws rectangle
                    g.drawPolygon(new int[] {35, 10, 60}, new int[] {150, 200, 200}, 3); //Draws triangle
                    g.dispose();
                }
    
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(300, 300);
                }
            };
    
            frame.add(pane);
            frame.pack();
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    }
    
      

    我真的希望你能阅读我在这里发布的每一个链接,因为这是值得的

    如果需要填充形状,则调用fillRect和fillPolygon,而不是drawRect和drawPolygon:

      
       @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g); //ALWAYS call this method first!
        g.drawRect(10, 10, 50, 50); //Draws square
        g.fillRect(150, 10, 50, 50); //Fills a square
        g.drawRect(10, 75, 100, 50); //Draws rectangle
        g.fillRect(150, 70, 100, 50); //Fills a square
        g.drawPolygon(new int[] {35, 10, 60}, new int[] {150, 200, 200}, 3); //Draws triangle
        g.fillPolygon(new int[] {185, 150, 215}, new int[] {150, 200, 200}, 3); //Fills triangle
        g.dispose();
    }
    
      

    根据@MAD程序员的评论:

    我们是否可以避免使用“绘制/填充多边形”(draw/fillPolygon)而使用更新的形状API…提供了更多功能,并且通常更易于使用:P

    这是使用Shapes API更新的 油漆组件方法:

      
       @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g); //ALWAYS call this method first!
    
        Graphics2D g2d = (Graphics2D) g;
        g2d.draw(new Rectangle2D.Double(10, 10, 50, 50));
        g2d.fill(new Rectangle2D.Double(150, 10, 50, 50));
    
        g2d.draw(new Rectangle2D.Double(10, 75, 100, 50));
        g2d.fill(new Rectangle2D.Double(150, 75, 100, 50));
    
        g2d.draw(new Polygon(new int[] {35, 10, 60}, new int[] {150, 200, 200}, 3));
        g2d.fill(new Polygon(new int[] {185, 150, 215}, new int[] {150, 200, 200}, 3));
    
        g2d.dispose();
        g.dispose();
    }
    
      

    产生以下输出:

  •  类似资料:
    • 我必须在正方形上画一个三角形,带星号,预期输出如下图所示。 指令是这样的:编写一个C程序,从用户那里读取一个数字n,并允许使用“*”字符打印一个带有屋顶的房子。房子应该是一个n×n正方形和屋顶两条45度的对角线形成屋顶(如果n是奇数,屋顶在顶部完美地关闭)。我创建了一个三角形和正方形,但我不能把它们结合起来。三角形

    • 本文向大家介绍python 打印直角三角形,等边三角形,菱形,正方形的代码,包括了python 打印直角三角形,等边三角形,菱形,正方形的代码的使用技巧和注意事项,需要的朋友参考一下 三角形 等腰直角三角形1 2.7 python:打印直角三角形 coding=utf-8 方式一 方式二 #打印实心等边三角形 #打印菱形 #实心正方形 #空心正方形 知识点说明: python ,end=''备注

    • 现在,我们的WebGL包装器已经构建好,让我们在屏幕上绘制一个简单的三角形,来创建我们的第一个WebGL应用。它将作为创建更复杂的3D模型的典型步骤的良好基础。本节,我们将介绍位置缓冲区的概念,它其实就是用来定义3D模型的位置和形状的顶点的数组。 图9-1 创建三角形平面 操作步骤 按照以下步骤使用WebGL渲染一个2D三角形: 1. 链接到glMatrix库和WebGL包装器: <script

    • 我有一个多边形的顶点列表,我试图在一个较大的三角形内创建一个等边三角形网格,以输入多边形的当前顶点为中心。 内部三角形边的大小由确定,它将容器边划分为相等的部分。最后,我想在Python的列表中存储所有这些三角形(包括原来的大三角形)顶点的坐标。 我提出的一个方法是: null

    • 本文向大家介绍Android实现圆角矩形和圆形ImageView的方式,包括了Android实现圆角矩形和圆形ImageView的方式的使用技巧和注意事项,需要的朋友参考一下 Android中实现圆角矩形和圆形有很多种方式,其中最常见的方法有ImageLoader设置Option和自定义View。 1.ImageLoader加载图片 ImageLoader.getInstance().displa

    • 问题内容: 我正在像这样扩展JFrame: 但是,屏幕上只画了一个正方形,有人知道为什么吗? 我的广场课也看起来像这样: 问题答案: JFrame的contentPane默认使用BorderLayout。当您向其添加一个Square时,默认情况下会添加BorderLayout.CENTER并覆盖以前添加的所有Square。您将需要阅读所有可用于Swing GUI的布局管理器。 例如,从这里开始:在