试图让它在加载时自己画一个窗口
事实证明,这比我想象的要困难得多。我只是在进行一些学习,并利用绘图功能。我想要的是程序启动一个包含矩形的窗口。该矩形的大小将根据窗口的大小进行缩放(即,如果窗口为1000px,并且矩形设置为按90%缩放,则矩形将为900px)。我有数学计算出如何居中并确定它的大小,但通过使用存根,我发现使用object.getWidth()和高度等,每次都返回0,完全算数浆纱。试图让它在加载时自己画一个窗口
想了一会儿之后,我假设它是因为它试图从一个仍在构建的对象中获取宽度和高度。按照我自己的逻辑,只要你在构造函数的构建部分之后做数学,它应该没问题,但是可惜 - 我看起来是错的。
我试着创建独立的类,创建一个框架和一个使绘图。绘图对象接受一个JFrame作为构造函数的一部分,并尝试绘制它。我分别实例化每一个,先框架,然后绘制对象(发送帧对象),但似乎也没有工作。
有什么建议吗?
编辑:
安德鲁的建议。这里将被添加到窗口
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);
}
}
当paintComponent(...)方法传递Graphics对象时,为什么要使用getGraphics(...)方法?另外,您应该调用super.paintComponent(g)作为方法中的第一条语句。我不知道你为什么评论它。
阅读Swing教程中关于Custom Painting的部分以获取工作示例。
如果您需要更多的帮助,然后发布您的SSCCE,所以我们不会猜测你的实际代码是什么样子。
编辑:
你加任何显示报表,看看是否在drawRect中(...)方法中使用的值作出任何意义吗?不要以为你的数学论坛是正确的。对于一件事,你需要了解如何计算工作整数:
// int width = (usrScale/100) * this.getWidth();
// int height = (usrScale/100) * this.getHeight();
int width = usrScale * this.getWidth()/100;
int height = usrScale * this.getHeight()/100;
在注释掉的代码(usrScale/100)= 0,因为乘法完成之前该值转换为整数。
我尝试过和没有你提到的两件事。它没有改变任何东西。你会看到我离开的代码 – Sinaesthetic 2011-04-12 03:34:52
@Sinaesthetic,请参阅编辑。也是下次发布适当的SSCCE。我们不能执行你的代码,因为它没有main()方法。 – camickr 2011-04-12 04:08:45
我提到过我添加了存根以检查getWidth()和getHeight()返回的内容。他们正在返回正确的值,尽管重复,而不是一次,因为程序似乎崩溃了 - 我不得不将它放在paintComponent()中,以便在实现后得到结果。您对我的配方的编辑产生的结果不正确的一个因素。我回去尝试使用双打,然后在将其发送到fillRect方法之前转换回整数。相同的结果。我也提到它是由一个启动器启动的。没有什么花哨。我会将它添加到我的帖子中... – Sinaesthetic 2011-04-12 04:23:39
没有看到你的代码有点棘手,但一个选择是setPreferredSize(x,y);在JFrame上,然后调用pack();之后,您可以检查窗口大小。
不 - 这个答案错误的原因有几个:a)随机方法调用时不知道发生了什么问题总是不好的。 b)永远不要在应用程序代码中调用setXX(XX == min/max/pref)。相反,如果合适,在DrawPanel上实现getXXSize(这里可能会也可能不会,这取决于OP的意图)c)在这个例子中,没有理由更喜欢使用setBounds来包装:“实现”框架,即所有位置/宽度设置容器层次结构中的组件。 – kleopatra 2011-04-12 08:39:30
哇,被低估是令人惊讶的痛苦,虽然我认为我误解了这个问题,所以它可能是合理的。但无论如何,为什么不应该调用setPreferredSize,似乎永远不会?不是所有的代码“应用程序代码”?那么为什么那里的方法呢? – AlbeyAmakiir 2011-04-12 23:13:42
对不起,造成疼痛,但好......不正确的答案是不正确的答案;-)至于为什么不使用,请参阅http://wiki.java.net/twiki/bin/view/Javadesktop/SwingLabsImperialRules(看起来由于java.net迁移可怕)。至于全是应用程序:并不是真的,框架代码的规则略有不同。至于它为什么在那里:不知道,也许作为最后的手段?实际上,它是用于复合组件的ui委托代码中的方法(我认为其中一个是xxComboBoxUI,但不指定,现在没有检查) – kleopatra 2011-04-13 13:16:04
做paintComponent(Graphics)
方法中的计算JPanel
添加到JFrame
。只有在屏幕上“实现”组件时才会调用paintComponent()
方法。
我把一个存根显示对象的宽度......它的读数一个宽度而不是0,但仍然没有显示 – Sinaesthetic 2011-04-12 03:02:32
这实际上结束了使用普通的paint()方法。 – Sinaesthetic 2011-04-14 22:49:29
您是否坚持使用'JFrame'(它没有'paintComponent(Graphics)'方法)或'JPanel'(它有)? – 2011-04-14 23:12:06
编辑过的版本可以正常工作,并且完全按照程序进行编程(绘制一个居中的绿色填充矩形,按照组件尺寸的90%缩放) - 那么您的期望究竟是什么? – kleopatra 2011-04-12 08:25:18