在jframe中创建java的正方形、长方形、三角形

-2 java graphics geometry swing custom-painting

我的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();
    }
Run Code Online (Sandbox Code Playgroud)

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

Fra*_*ool 5

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


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

    static Graphics2D g = new Graphics2D() 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 过度使用static修饰符会伤害你,static不是一个跨方法的魔法词,让你的变量在你的程序中的任何地方都可以访问,你应该创建一个程序实例并从那里调用方法(它们不是静态的) ,请参阅为什么静态变量被认为是邪恶的?,并且在使用 GUI 甚至使用 Swing 自定义绘画为您的学习增加更多复杂性之前,您真的应该回去学习基础知识。

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

    panel.setLayout(null);
    
    Run Code Online (Sandbox Code Playgroud)

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

  4. 您正在使用已弃用的方法,JFrame#show()而应该使用JFrame#setVisible()方法。

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

  6. 在您删除的代码上,您有一个MouseListener附加到JButton,而您需要使用ActionListener,请参阅如何使用操作来了解这一点。

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

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


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

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

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

您一定是在说…… “但是您用来绘制正方形的方法与绘制矩形的方法相同!” ,嗯...是的,我们是,不同之处在于我们将传递 awidth和height相同大小的正方形和不同大小的矩形。

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

  • 一个三角形有3条边,它们的大小可以相同也可以不同
  • 我们没有方法drawTriangle在Swing,但我们有所述的方法,其中将绘制的多边形(在本例3)中,从每个阵元取COORDS为COORDS和用于COORDS并且其中将是一个实例drawPolygon(xPoints, yPoints, nPoints) draw(Shape)Graphics2DnPointsxPointsXyPointsYShapePolygon

现在,将所有这些放在一起,我们应该将所有代码放在我们JPanel调用的重写方法中paintComponent(),如教程中所示(参见第 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
}
Run Code Online (Sandbox Code Playgroud)

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

@Override
public Dimension getPreferredSize() {
    return new Dimension(300, 300);
}
Run Code Online (Sandbox Code Playgroud)

不要忘记调用@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

如果您需要填充形状,则调用fillRectandfillPolygon而不是drawRectand 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();
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


编辑

根据@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();
}
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

在此处输入图片说明