在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示例以及简短,自包含,正确的示例 。
-
从你的(现在删除的)代码中,我看到你还没有通过自定义绘画的Swing教程,或者你甚至没有注意它,这一行会给你带来问题
static Graphics2D g = new Graphics2D()
-
过度使用
static
修饰符会对你造成伤害,static
不是一个跨方法的神奇词,使你的变量可以在程序的任何地方访问,你应该创建一个程序实例并从那里调用方法(它们不是static),请参阅为什么静态变量被认为是邪恶的? ,你应该回过头来学习基本知识,然后再使用GUI为学习增加更多复杂性,甚至更多使用Swing自定义绘画。 -
你正在使用
setBounds()
方法,它建议(我可以在你删除的代码中确认)你正在使用null-layout
:panel.setLayout(null);
您应该考虑检查布局管理器
-
您正在使用不推荐使用的方法
JFrame#show()
而应该使用JFrame#setVisible()
方法。 -
您手动设置
JFrame
的大小,您应该使用布局管理器并调用方法JFrame#pack()
,它将计算JFrame
的首选大小或覆盖组件的getPreferredSize()
。 -
在您删除的代码上,您有一个连接到
JButton
的MouseListener
,而您需要使用ActionListener
,请参阅如何使用Actions来了解这一点。 -
您不是将程序放在可能使程序冻结的事件调度线程(EDT)上,因为Swing不是线程安全的。 您可以通过编写
main
方法来更正此问题,如下所示: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)
,其中Shape
将是Rectangle2D
一个实例
要绘制一个正方形,我们需要知道:
- 正方形的宽度和高度都相同
- 在Swing中绘制正方形的方法是使用
Graphics2D
方法的drawRect(x, y, width, height)
draw(Shape)
,其中Shape
将是Rectangle2D
一个实例
你必须说…… “但你用来绘制正方形的方法与矩形相同!” ,嗯…是的,我们是,不同之处在于我们要为正方形传递width
和height
相等的尺寸,并为矩形传递不同的尺寸。
要绘制三角形,您需要知道:
- 三角形有3个边,它们可以是相同或不同的尺寸
- 我们没有在Swing中
draw(Shape)
方法,但是我们有了drawPolygon(xPoints, yPoints, nPoints)
drawPolygon(xPoints, yPoints, nPoints)
draw(Shape)
,它将绘制nPoints
的多边形(在本例中为3),从每个数组元素中获取coordsX
坐标的yPoints
和Y
坐标的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); } }
我真的希望你阅读我在这里发布的所有链接,因为它是值得的
如果你需要填充形状,那么调用fillRect
和fillPolygon
而不是drawRect
和fillPolygon
:
@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(); }
其中产生以下输出: