java试图在加载时在自己身上绘制一个窗口
这比我想象的要困难得多。我只是在学习画图的功能。我想要的是一个程序启动一个包含(比如)矩形的窗口。该矩形的大小将根据窗口的大小进行缩放(即,如果窗口为1000px,且矩形设置为90%,则矩形将为900px)。我已经计算出如何居中并确定它的大小,但是通过使用存根,我发现使用对象。getWidth()和height等每次都返回0,这完全是大小调整的数学运算
在考虑了一段时间之后,我假设这是因为它试图从一个仍在构建的对象获得宽度和高度。按照我自己的逻辑,只要在构造函数的构建部分之后进行计算,就应该可以了,但唉,我似乎错了
我尝试创建单独的类来创建一个框架和一个绘制图形的类。绘图对象接受JFrame作为构造函数的一部分,并尝试在其上绘图。我分别实例化了每一个对象,首先是frame,然后是drawing对象(将frame对象发送给它),但这似乎也不起作用
有什么建议吗
编辑:
按照安德鲁的建议。这是要添加到窗口的面板对象
package scaling_test;
import java.awt.*;
import javax.swing.*;
public class MyDrawing extends JPanel
{
public MyDrawing() throws HeadlessException
{
this.setVisible(true);
}
public void paintComponent(Graphics g)
{
super.paintComponents(g);
//set scaling
int usrScale = 90;
int scaleRef = (100 - usrScale) / 2;
int xStart = this.getWidth() * (scaleRef / 100);
int yStart = this.getHeight() * (scaleRef / 100);
int width = (usrScale / 100) * this.getWidth();
int height = (usrScale / 100) * this.getHeight();
//draw square outline
g.setColor(Color.green);
g.fillRect(xStart, yStart, width, height);
}
}
这是添加jpanel对象的窗口:
package scaling_test;
import java.awt.*;
import javax.swing.*;
public class DrawThis extends JFrame
{
MyDrawing drawing;
public DrawThis() throws HeadlessException
{
drawing = new MyDrawing();
this.add(drawing);
}
}
那发射器呢
package scaling_test;
public class ScaleTest
{
public static void main(String[] args)
{
DrawThis program = new DrawThis();
program.setBounds(250, 250, 800, 600);
program.setVisible(true);
}
}
更新的面板(仍不工作):
package scaling_test;
import java.awt.*;
import javax.swing.*;
public class MyDrawing extends JPanel
{
public MyDrawing() throws HeadlessException
{
}
public void paintComponent(Graphics g)
{
super.paintComponents(g);
//set scaling
int usrScale = 90;
int scaleRef = (100 - usrScale) / 2;
int xStart = this.getWidth() * scaleRef / 100;
int yStart = this.getHeight() * scaleRef / 100;
int width = usrScale * this.getWidth() / 100;
int height = usrScale * this.getHeight() / 100;
//draw square outline
g.setColor(Color.green);
g.fillRect(xStart, yStart, width, height);
}
}
# 1 楼答案
在添加到
JFrame
的JPanel
的paintComponent(Graphics)
方法中进行计算。只有当组件在屏幕上“实现”后,才会调用paintComponent()
方法# 2 楼答案
不查看代码有点棘手,但一个选项是设置PreferredSize(x,y);在JFrame上,然后调用pack();之后,你可以检查窗户大小
# 3 楼答案
为什么要使用getGraphics(…)方法时,该组件(…)方法是否传递给图形对象?另外,你应该调用super。paintComponent(g)作为方法中的第一个语句。我不知道你为什么评论它
阅读Swing教程中关于Custom Painting的部分,了解工作示例
如果您需要更多帮助,请发布SSCCE,这样我们就不会一直猜测您的实际代码是什么样子
编辑:
是否添加了任何显示语句来查看drawRect(…)中使用的值方法有意义吗?不要以为你的数学公式是正确的。首先,您需要了解整数计算的工作原理:
在注释掉的代码中(usrScale/100)=0,因为该值在乘法完成之前被转换为整数