我有一个Java的问题我理解不是来Java中的Draw Geometric数字,代码和以下你可以帮助我吗?
这是代码:
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
三角形,正方形和矩形?更正我的代码谢谢
答案 0 :(得分:2)
在我开始撰写答案之前,我需要鼓励您仔细阅读:如何创建有效的Minimal, Complete and Verifiable Example和Short, Self Contained, Correct Example。
从您(现已删除)的代码中,我发现您还没有通过Swing Tutorial on Custom Painting,或者您甚至没有注意它,这条线路会给您带来问题
static Graphics2D g = new Graphics2D()
过度使用static
修饰符会对您造成伤害,static
不是跨方法魔术词,使您的变量可以在程序中的任何位置访问,您应该创建你的程序的一个实例并从那里调用方法(它们不是静态的),请参阅Why are static variables considered evil?,你应该回过头来learn the essentials,然后再使用GUI为你的学习增加更多的复杂性,甚至更多用Swing自定义绘画。
您正在使用setBounds()
方法,建议(我可以在您删除的代码中确认)您使用的是null-layout
:
panel.setLayout(null);
您应该考虑查看layout managers
您正在使用已弃用的方法JFrame#show()
,而应使用JFrame#setVisible()
方法。
您需要手动设置JFrame
的大小,您应该使用布局管理器并调用方法JFrame#pack()
,这将计算{{1}的首选大小或覆盖您的组件JFrame
。
在您删除的代码中,getPreferredSize()
附加了MouseListener
,而您需要使用JButton
,请参阅How to use Actions了解相关信息。
您没有将您的程序放在Event Dispatch Thread (EDT)上,这会使您的程序冻结,因为Swing不是Thread安全的。您可以通过编写ActionListener
方法来更正此问题:
main
你应该更礼貌:"更正我的代码谢谢" 听起来像订单,我会说像你可以帮我吗? / em>这听起来像是某人要求你帮忙的请求/请愿书,因为他们可以,而不是因为他们必须帮助你,所有上述要点都会纠正你的代码。
在完成上述所有内容之后(您应该仔细阅读)我们可以继续编写代码:
为了绘制一个矩形,我们需要了解一个矩形:
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
//Your constructor here
}
});
}
方法的drawRect(x, y, width, height)
draw(Shape)
,Graphics2D
将是Shape
的实例{3}} 要画一个正方形,我们需要知道:
Graphics2D
方法的Rectangle2D
drawRect(x, y, width, height)
,其中Shape
将是{的实例{3}} 你必须说... "但是你用来绘制正方形的方法与矩形相同!" ,嗯......是的,我们是,区别在于我们将为方形和不同大小的矩形传递width
和height
相同的大小。
要绘制三角形,您需要知道:
drawTriangle
的方法,但是Graphics2D
方法的draw(Shape)
Rectangle2D
,它会绘制一个多边形nPoints
(本例中为3),取xPoints
X
坐标的每个数组元素的坐标和yPoints
坐标Y
的坐标Shape
将是drawPolygon(xPoints, yPoints, nPoints)
现在,把所有这些放在一起,我们应该将所有代码放在我们的JPanel
被覆盖的draw(Shape)
方法中,如教程所示(参见第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
上的另一个方法Polygon
,(参见:paintComponent()
普遍共识是肯定的),否则我们的JFrame
将小于我们想要什么,所以看起来应该是这样的:
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}
请勿忘记在这些方法中致电@Override
!
只有那些方法,我们已经完成了我们的程序来绘制形状,但我知道如果我不发布整个代码,你最终会在一个赢得&#39的地方写上面的方法。 ; t工作或导致编译错误,所以产生以下输出的整个代码(实际上是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();
}
Should I avoid the use of setPreferred|Maximum|MinimumSize in Swing?
根据@MadProgrammer的评论:
我们是否可以避免使用
draw/fillPolygon
来支持使用更新的Shapes API ...提供更多功能并且通常更易于使用: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();
}
产生以下输出: