试图让它在加载时自己画一个窗口

试图让它在加载时自己画一个窗口

问题描述:

事实证明,这比我想象的要困难得多。我只是在进行一些学习,并利用绘图功能。我想要的是程序启动一个包含矩形的窗口。该矩形的大小将根据窗口的大小进行缩放(即,如果窗口为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); 
    } 
} 
+0

编辑过的版本可以正常工作,并且完全按照程序进行编程(绘制一个居中的绿色填充矩形,按照组件尺寸的90%缩放) - 那么您的期望究竟是什么? – kleopatra 2011-04-12 08:25:18

当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,因为乘法完成之前该值转换为整数。

+0

我尝试过和没有你提到的两件事。它没有改变任何东西。你会看到我离开的代码 – Sinaesthetic 2011-04-12 03:34:52

+0

@Sinaesthetic,请参阅编辑。也是下次发布适当的SSCCE。我们不能执行你的代码,因为它没有main()方法。 – camickr 2011-04-12 04:08:45

+0

我提到过我添加了存根以检查getWidth()和getHeight()返回的内容。他们正在返回正确的值,尽管重复,而不是一次,因为程序似乎崩溃了 - 我不得不将它放在paintComponent()中,以便在实现后得到结果。您对我的配方的编辑产生的结果不正确的一个因素。我回去尝试使用双打,然后在将其发送到fillRect方法之前转换回整数。相同的结果。我也提到它是由一个启动器启动的。没有什么花哨。我会将它添加到我的帖子中... – Sinaesthetic 2011-04-12 04:23:39

没有看到你的代码有点棘手,但一个选择是setPreferredSize(x,y);在JFrame上,然后调用pack();之后,您可以检查窗口大小。

+0

不 - 这个答案错误的原因有几个:a)随机方法调用时不知道发生了什么问题总是不好的。 b)永远不要在应用程序代码中调用setXX(XX == min/max/pref)。相反,如果合适,在DrawPanel上实现getXXSize(这里可能会也可能不会,这取决于OP的意图)c)在这个例子中,没有理由更喜欢使用setBounds来包装:“实现”框架,即所有位置/宽度设置容器层次结构中的组件。 – kleopatra 2011-04-12 08:39:30

+0

哇,被低估是令人惊讶的痛苦,虽然我认为我误解了这个问题,所以它可能是合理的。但无论如何,为什么不应该调用setPreferredSize,似乎永远不会?不是所有的代码“应用程序代码”?那么为什么那里的方法呢? – AlbeyAmakiir 2011-04-12 23:13:42

+0

对不起,造成疼痛,但好......不正确的答案是不正确的答案;-)至于为什么不使用,请参阅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

我把一个存根显示对象的宽度......它的读数一个宽度而不是0,但仍然没有显示 – Sinaesthetic 2011-04-12 03:02:32

+0

这实际上结束了使用普通的paint()方法。 – Sinaesthetic 2011-04-14 22:49:29

+0

您是否坚持使用'JFrame'(它没有'paintComponent(Graphics)'方法)或'JPanel'(它有)? – 2011-04-14 23:12:06