在jframe中创建java的正方形,矩形,三角形

我有一个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 ? 更正我的代码谢谢

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


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

     static Graphics2D g = new Graphics2D() 
  2. 过度使用static修饰符会对你造成伤害, static不是一个跨方法的神奇词,使你的变量可以在程序的任何地方访问,你应该创建一个程序实例并从那里调用方法(它们不是static),请参阅为什么静态变量被认为是邪恶的? ,你应该回过头来学习基本知识,然后再使用GUI为学习增加更多复杂性,甚至更多使用Swing自定义绘画。

  3. 你正在使用setBounds()方法,它建议(我可以在你删除的代码中确认)你正在使用null-layout

     panel.setLayout(null); 

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

  4. 您正在使用不推荐使用的方法JFrame#show()而应该使用JFrame#setVisible()方法。

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

  6. 在您删除的代码上,您有一个连接到JButtonMouseListener ,而您需要使用ActionListener ,请参阅如何使用Actions来了解这一点。

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

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


在完成上述所有内容之后(您应该仔细阅读)我们可以继续编写代码:

为了绘制一个矩形,我们需要了解一个矩形:

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

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

  • 正方形的宽度和高度都相同
  • 在Swing中绘制正方形的方法是使用Graphics2D方法的drawRect(x, y, width, height) draw(Shape) ,其中Shape将是Rectangle2D一个实例

你必须说…… “但你用来绘制正方形的方法与矩形相同!” ,嗯…是的,我们是,不同之处在于我们要为正方形传递widthheight相等的尺寸,并为矩形传递不同的尺寸。

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

  • 三角形有3个边,它们可以是相同或不同的尺寸
  • 我们没有在Swing中draw(Shape) drawPolygon(xPoints, yPoints, nPoints)方法,但是我们有了drawPolygon(xPoints, yPoints, nPoints) draw(Shape) ,它将绘制nPoints的多边形(在本例中为3),从每个数组元素中获取coords X坐标的yPointsY坐标的yPoints以及Shape将是Polygon一个实例

现在,将所有这些放在一起,我们应该在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 } 

但是我们还需要在JPanel上覆盖另一个方法getPreferredSize() (参见: 我应该避免在Swing中使用setPreferred | Maximum | MinimumSize吗?普遍的共识是肯定的),否则我们的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); } } 

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

如果你需要填充形状,那么调用fillRectfillPolygon而不是drawRectfillPolygon

 @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(); } 

在此处输入图像描述


编辑

根据@MadProgrammer的评论:

我们可以避免使用draw/fillPolygon来支持使用更新的Shapes API …提供更多function并且通常更容易使用:P

这是使用Shapes API更新的paintComponent方法:

 @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(); } 

其中产生以下输出:

在此处输入图像描述