-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三角形、正方形和矩形?更正我的代码谢谢
在我开始写我的答案之前,我需要鼓励您仔细阅读:如何创建一个有效的最小、完整和可验证的示例和一个简短的、自包含的、正确的示例。
从您的(现已删除)代码中,我看到您还没有完成自定义绘画的Swing 教程,或者您甚至没有注意它,这一行会给您带来问题
static Graphics2D g = new Graphics2D()
Run Code Online (Sandbox Code Playgroud)过度使用static修饰符会伤害你,static不是一个跨方法的魔法词,让你的变量在你的程序中的任何地方都可以访问,你应该创建一个程序实例并从那里调用方法(它们不是静态的) ,请参阅为什么静态变量被认为是邪恶的?,并且在使用 GUI 甚至使用 Swing 自定义绘画为您的学习增加更多复杂性之前,您真的应该回去学习基础知识。
您正在使用setBounds()方法,该方法表明(并且我可以在您删除的代码中确认)您正在使用null-layout:
panel.setLayout(null);
Run Code Online (Sandbox Code Playgroud)
你真的应该考虑检查布局管理器
您正在使用已弃用的方法,JFrame#show()而应该使用JFrame#setVisible()方法。
你手动设置您的大小JFrame,你应该使用布局管理器调用该方法JFrame#pack()将计算首选大小为您JFrame或覆盖您的组件getPreferredSize()。
在您删除的代码上,您有一个MouseListener附加到JButton,而您需要使用ActionListener,请参阅如何使用操作来了解这一点。
您没有将您的程序放在事件调度线程 (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)你应该更有礼貌:“更正我的代码,谢谢”听起来像是一个命令,我会说你能帮我吗?这听起来像是请求/请愿某人帮助您,因为他们可以,而不是因为他们必须帮助您,以上所有要点都可以更正您的代码。
说完以上所有内容(您应该仔细阅读),我们可以继续编码部分:
为了绘制矩形,我们需要了解有关矩形的知识:
drawRect(x, y, width, height)draw(Shape)Graphics2DShapeRectangle2D要绘制正方形,我们需要知道:
drawRect(x, y, width, height)draw(Shape)Graphics2DShapeRectangle2D您一定是在说…… “但是您用来绘制正方形的方法与绘制矩形的方法相同!” ,嗯...是的,我们是,不同之处在于我们将传递 awidth和height相同大小的正方形和不同大小的矩形。
要绘制三角形,您需要知道:
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)
产生以下输出:
| 归档时间: |
|
| 查看次数: |
19269 次 |
| 最近记录: |