在jframe中创建java的正方形,矩形,三角形[关闭]

2024-04-02

我有一个 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三角形、正方形和长方形?更正我的代码,谢谢


在我开始写答案之前,我需要鼓励您仔细阅读:如何创建有效的最小、完整且可验证的示例 https://stackoverflow.com/help/mcve and a 简短、独立、正确的示例 http://sscce.org/.


  1. 从你的(现已删除)代码中,我发现你还没有经历过Swing 自定义绘画教程 https://docs.oracle.com/javase/tutorial/uiswing/painting/然而或者你根本没有注意它,这条线会给你带来问题

    static Graphics2D g = new Graphics2D() 
    
  2. 过度使用static修饰符会伤害你,static不是一个跨方法的魔术词来使您的变量可以在程序中的任何位置访问,您应该创建程序的实例并从那里调用方法(它们不是静态的),请参阅为什么静态变量被认为是邪恶的? https://stackoverflow.com/questions/7026507/why-are-static-variables-considered-evil,你真的应该回去学习要点 https://docs.oracle.com/javase/tutorial/java/nutsandbolts/在使用 GUI 以及 Swing 自定义绘画为您的学习增加更多复杂性之前。

  3. 你正在利用setBounds()方法,这表明(我可以在您删除的代码中确认)您正在使用null-layout:

    panel.setLayout(null);
    

    你真的应该考虑检查布局管理器 https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

  4. 您正在使用已弃用的方法JFrame#show() https://docs.oracle.com/javase/7/docs/api/java/awt/Window.html#show()相反你应该使用JFrame#setVisible() https://docs.oracle.com/javase/7/docs/api/java/awt/Window.html#setVisible(boolean) method.

  5. 您正在手动设置尺寸JFrame,您应该使用布局管理器并调用该方法JFrame#pack() https://docs.oracle.com/javase/7/docs/api/java/awt/Window.html#pack()这将计算您的首选尺寸JFrame或覆盖你的组件的getPreferredSize().

  6. 在您删除的代码中,您有一个MouseListener附于一个JButton,相反你需要使用ActionListener, see 如何使用动作 https://docs.oracle.com/javase/tutorial/uiswing/misc/action.html学习这个。

  7. 你没有把你的程序放在事件调度线程 (EDT) https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html这可能会使您的程序冻结,因为 Swing 不是线程安全的。您可以通过编写您的main方法如下:

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                //Your constructor here
            }
        });
    }
    
  8. 你应该更有礼貌:“更正我的代码,谢谢”听起来像是一个命令,我会这么说你可以帮帮我吗?这听起来像是请求某人帮助您,因为他们可以,而不是因为他们必须帮助您,以上所有要点都可以纠正您的代码。


说完上述所有内容(您应该仔细阅读),我们可以继续编码部分:

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

  • 矩形有宽度和高度,两者不同
  • The way to draw a rectangle in Swing is with drawRect(x, y, width, height) https://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html#drawRect(int,%20int,%20int,%20int) draw(Shape) https://docs.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html#draw(java.awt.Shape) of the Graphics2D method where Shape would be an instance of Rectangle2D http://docs.oracle.com/javase/7/docs/api/java/awt/geom/Rectangle2D.html

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

  • 正方形有宽度和高度,两者大小相等
  • The way to draw a square in Swing is with drawRect(x, y, width, height) https://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html#drawRect(int,%20int,%20int,%20int) draw(Shape) https://docs.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html#draw(java.awt.Shape) of the Graphics2D method where Shape would be an instance of Rectangle2D http://docs.oracle.com/javase/7/docs/api/java/awt/geom/Rectangle2D.html

你一定是说...“但是你画正方形的方法和画长方形是一样的!”,嗯...是的,我们是,不同之处在于我们将通过一个width and height正方形大小相同,矩形大小不同。

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

  • 三角形有 3 条边,它们的大小可以相同或不同
  • We have no method to drawTriangle in Swing, but we have drawPolygon(xPoints, yPoints, nPoints) https://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html#drawPolygon(int%5B%5D,%20int%5B%5D,%20int) draw(Shape) https://docs.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html#draw(java.awt.Shape) of the Graphics2D method, which will draw a Polygon of nPoints (3 in this case), taking the coords from each array element of xPoints for the X coords and yPoints for the Y coords and where Shape would be an instance of Polygon https://docs.oracle.com/javase/7/docs/api/java/awt/Polygon.html

现在,将所有这些放在一起,我们应该将所有代码放在我们的重写方法中JPanel called paintComponent() https://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#paintComponent(java.awt.Graphics)如教程中所示(参见第 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
}

但我们还需要重写另一个方法getPreferredSize() https://docs.oracle.com/javase/7/docs/api/java/awt/Container.html#getPreferredSize() on our JPanel, (see: 我应该避免在 Swing 中使用 setPreferred|Maximum|MinimumSize 吗? https://stackoverflow.com/questions/7229226/should-i-avoid-the-use-of-setpreferredmaximumminimumsize-methods-in-java-swi普遍共识是肯定的),否则我们的JFrame会比我们想要的小,所以它应该看起来像这样:

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

别忘了打电话@Override在那些方法中!

仅使用这些方法,我们就完成了绘制形状的程序,但我知道,如果我不发布整个代码,您最终将在无法工作或导致编译错误的地方编写上述方法,因此,产生以下输出的整个代码(实际上是 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 and fillPolygon代替drawRect and 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();
}

Edit

根据@MadProgrammer 的评论:

我们可以避免使用draw/fillPolygon支持使用更新的 Shapes API ...提供更多功能并且通常更易于使用:P

这是更新的paintComponent使用 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();
}

产生以下输出:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在jframe中创建java的正方形,矩形,三角形[关闭] 的相关文章

随机推荐

  • 验证失败时如何保留文件字段值

    我有一个带有文件字段的经典 Rails 3 表单 一切正常 上传有效并且数据保存到数据库中 当验证失败时 例如 缺少标题 然后用户将被发送回表单 并带有render action gt new 普通的 但这里的问题是用户必须再次选择其文件
  • Apache 标头配置中的“always”和“onsuccess”有什么区别?

    我有一个网站 其中定义了虚拟主机 etc apache2 sites enabled 标题设置为always像这样的选项 Header always set X Frame Options DENY 如果我现在使用设置相同的标头 htacc
  • Ajax 分页 - 启用后退按钮 [重复]

    这个问题在这里已经有答案了 可能的重复 如何 后退按钮支持 Ajax https stackoverflow com questions 648250 how to back button support ajax 我有一个 ASP NET
  • 在 ASP.NET Core Web API 控制器中使用 C# 7 元组

    你知道为什么会这样吗 public struct UserNameAndPassword public string username public string password HttpPost public IActionResult
  • 在 AngularJS 中通过模态编辑对象 - 使用临时对象?

    设想 用户单击项目 以下代码运行并打开一个模式 其中包含填充了项目名称的文本框 scope edit function item scope editingItem Name item Name 我在模式中的 HTML
  • 如何从 table1 中选择前 500 行并将它们插入到 table2 中?

    我定义了完全相同的 2 个表 t2 和 t1 t2 有 1000 行 t1 完全是空的 如何从 t2 中选择前 500 行并将它们插入到 t1 中 我将使用 emptyTable 和 populatedTable 因为问题很混乱 重要的 T
  • Laravel 视图缓存如何工作?

    根据 Laravel 的文档 https laravel com docs 5 3 blade introduction https laravel com docs 5 3 blade introduction 视图被编译成纯 PHP 代
  • MPMoviePlayerController 拍摄屏幕截图但仅显示黑屏

    我在播放 MPMoviePlayerController 时截取屏幕截图 完美保存屏幕截图 但图像只有黑色 我使用下面的代码 UIGraphicsBeginImageContext self moviePlayerController vi
  • 使用闪亮的 ggplot 地图获取正确的点击坐标

    我启动了一个带有 ggplot 世界地图的闪亮应用程序 我想获取绘图上点击的坐标 以便用户可以对地图进行操作 但坐标很奇怪 要么NULL或非常小的东西 重复点击似乎只会改变一个坐标 ui R library shiny Define UI
  • Java - 更改 JLabel

    我有一个名为 Keys java 的按钮类 它将按钮面板返回到名为 Control java 的类 我在 Control java 中有一个 JLabel 但我想做的是在按下按钮时更改 JLabel 你会怎样做呢 我尝试在 Keys jav
  • 是否可以在不安装VS的情况下运行CodedUI测试?如何?

    我想在测试机上运行我的编码 UI 测试 但我希望我可以避免在我的测试机上安装 VS2012 有什么办法可以做到吗 根据this http blogs microsoft co il shair 2015 04 08 automation r
  • 如何添加已经存在的db字段中的数据

    我正在尝试添加数据main storage表 但是当我保存记录时它显示错误 failed unsupported operand type s for DeferredAttribute and int In Main Storage pr
  • 查找将用户带到我的网站的引荐网址

    复制 查找上一页 URL https stackoverflow com questions 772780 finding previous page url 如何在 ASP NET 中找到将用户带到我的网站的引荐 URL 也可以看看 如何
  • 如何更快地解决欧拉项目#21?

    原始问题 令 d n 定义为 n 的真因数之和 小于 n 的数能被 n 整除 如果 d a b 且 d b a 其中 a b 则 a 和 b 是友好对 并且 a 和 b 中的每一个称为友好数 例如 220的真因数是1 2 4 5 10 11
  • iphone uipickerview:图像和文本

    是否可以在文本旁边添加图像 如图标 UIPickerView 我看到的例子UIPickerViews有两列 一列有图像 另一列有文本 这不是我需要的 我需要一个包含文本和图像的列 Thanks 您需要为选择器的每一行创建自己的视图 如果只是
  • 将 python 模块添加到 AzureML 工作区

    我最近一直致力于将机器学习模型部署为 Web 服务 我使用 Azure 机器学习工作室创建自己的工作区 ID 和授权令牌 然后 我训练了 LogisticRegressionCV 模型sklearn 线性模型在我的机器本地 使用 pytho
  • 地理距离 MySQL

    要搜索距给定位置最近的位置 请按距离排序 我应该使用浮动还是点 我应该预先计算 cos sin sqrt 的值吗http www movable type co uk scripts latlong db html http www mov
  • 如何获取UIBarButtonItem中心位置

    我正在做一些自定义视图控制器转换 我希望我的转换从按下的按钮的中心开始 For UIButton我可以 myCustomTransition startingPoint buttonPressed center 但如果我想使用UIBarBu
  • 性别表标准化是否太过分了?

    我不是数据库专家 但我正在尝试清理另一个数据库 所以我的问题是 性别表正常化会不会太过分了 User table userid int pk genderid char 1 fk etc gender table genderid char
  • 在jframe中创建java的正方形,矩形,三角形[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个 Java 问题 据我了解 无法在 Java 中绘制几何图形 代码和以下内容您可以帮助我吗 这是代码 public class