2010-09-15 58 views
2

我想是能画Image小号到JFrame,但每当我想要的(不是在JFrame.paint方法。如何绘制图形的paint()函数以外的一个JFrame

对于这个项目我我工作,我有一个class Bullseye extends BufferedImage,和我试图把它放到一个JFrame

class DrawingFrame extends JFrame { 
    public void drawImage(Image img, int x, int y) { 
     getGraphics().drawImage(img,x,y,null); 
     repaint(); 
    } 
} 

class Main { 
    public static void main(String[] args) { 
     DrawingFrame frame = new DrawingFrame(); 
     Bullseye bullseye = new Bullseye(20,20); //width,height 

     // later 
     frame.setVisible(true); 
     frame.drawImage(bullseye,10,20); 
     frame.drawImage(bullseye,20,20); 
     frame.drawImage(bullseye,30,20); 
    } 
} 

然而,什么也不显示经过一番研究,显然这并不因为更改graphics对象获取工作清零时我repaint()

我该怎么做?这甚至是正确的方法吗?

+0

我可以问你为什么不在油漆? – mhshams 2010-09-15 17:58:48

+0

因为我想在外部任意添加'Images'。一旦我重写了'paint',我就把'JFrame'紧紧地连接到我想添加的'Images'上。 – 2010-09-15 18:01:44

回答

1

在Java中绘制屏幕(几乎)总是在paint()中完成。你需要为你的类是什么:

class DrawingFrame extends JFrame { 

    private Image bullseye = new Bullseye(20,20); //width,height 


    public void paint(Graphics g) { 
     g.drawImage(bullseye,10,20); 
     g.drawImage(bullseye,20,20); 
     g.drawImage(bullseye,30,20); 
    } 

} 

class Main { 
    public static void main(String[] args) { 
     DrawingFrame frame = new DrawingFrame(); 

     // later 
     frame.setVisible(true); 
    } 
} 

如果您需要在一个特定的时间把bullseyes的图纸上,创建DrawingFrame对象上的标志,并设置它,当你需要他们。设置标志时,您需要调用repaint()。

4

我想你会把问题向后推。在Swing中,所有绘图操作都应在paint()方法中完成。

你可以做的是将你想绘制的图像作为属性存储在你的类中,然后在你的痛苦方法中,在你想要的任何地方绘制图像。例如:

class MyFrame extends JFrame { 

    Image image; 

    public void paint(Graphics g) { 
     super.paint(g); 
     if (image != null) { 
      g.drawImage(image, /* ... */); 
     } 
    } 

    public void setImage(Image image) { 
     this.image = image; 
     repaint(); 
    } 

} 

而在你的其他类:

myFrame.setImage(myImage); 
+0

这个问题是我想能够在各种(x,y)坐标处添加大量图像。用这种方法,我只能做一个。我可以做到这一点,所以它会在下一次调用paint时在某些坐标处“排队”绘制图像,但这看起来过度。 – 2010-09-15 18:06:12

+2

如果你想要更多的图像,你可以用'List '代替'image'属性。但是如果你想直接在JFrame中绘制,你必须重写'paint()'方法。 – 2010-09-15 18:08:23

1

如何创建一个离屏图像上进行绘制,而实际的油漆,然后外面的实际油漆刚刚绘制屏外图像实际显卡?有点双缓冲?

1

自定义绘画应该很少在paint()方法中完成,特别是JFrame的paint()方法。自定义绘画是通过重写Swing组件的paintComponent()方法完成的,通常是JComponent或JPanel。请参阅Custom Painting上的Swing教程部分以获取更多信息和工作示例。

但是,在这种情况下,你不需要做任何自定义绘画。您只需创建一个ImageIcon并将图标添加到JLabel,然后将JLabel添加到面板。请阅读How to Use Icons的Swing教程中的部分以获取工作示例。

如果找不到合适的布局管理器使用,也可以使用绝对定位。再次,您会在使用布局管理器的教程中找到一个更详细解释此部分的部分。

1

在你的类中创建一个图形对象,它必须具有全局,而不仅仅是方法本地存在。

public class Graphics2D freefrompaint = null; 

然后还具有用于流动的控制目的的布尔:

private boolean heypaintreturnnow = false; 

,并覆盖主体摇摆元器件超类的更新方法()asfollows:

public void update(Graphics g) { 
    if (heypaintreturnnow) return; 
    freefrompaint = (Graphics2D)g; 
    heypaintreturnnow = true; /*and if you want, do => super.update(?) once, or once after boolean hereof is set to false by your code. */ 

更新()将离屏图形数据缓冲区中的所有颜色清除为GraphicsObject的当前背景颜色。而且,你还必须知道在Swing Components的paint()中完成的确切的三种方法:(1)它调用它自己的paintComponent(),这里是委托给这个Component的实际绘画的地方; (2)绘制其边框的方法;然后是它的子组件的绘画。最后一个非常重要和不可避免的事情:使用一个类,嵌套,命名或匿名,与这个覆盖容器方法。并将该类传递给JFrame的setContentPane(Container actualgraphicsreference)方法;这是必须的。我希望我已经使我的解释性和内容丰富的方法明确无误。自我解释的是,你现在可以使用freefrompaint来绘制超越,操作系统对你的帧的repaint()的调用将不会调用一个“twin Graphics”默认的光栅清除操作,现在你已经抑制了去上面的代码指导并向你推荐。感谢您提供富有表现力的机会。