2011-07-13 46 views
1

我想在JPanel上绘制图形。现在,我在做什么是,我用的paintComponent方法来定义绘图:在JPanel上绘制图形而不使用PaintComponent方法并重新调用

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.setColor(Color.BLACK); 
    g.fillRect(10,10,100,100); 
} 

然后我调用重绘()的地方我希望把图形。

但我不知道是否有一种方法来将图形添加到JPanel就像添加组件,而不使用此paintComponent方法:panel.add(myComponent)。我看到图形类型无法启动,但也许可能有另一种类型让我这样做。

我很确定像FANG Engine这样的GUI有很多GUI,但是我看到的所有例子都是使用这种方法。有没有这样做的任何建议?因为它有时会搞乱我程序的整体设计。

在此先感谢。

+0

http://download.oracle.com/javase/tutorial/uiswing /components/panel.html – mKorbel

+0

@mKorbel,在我来到这里之前,我经历了所有这些API和教程。你甚至读过我的问题吗? – Emir

+0

@Emir:*“它有时会搞乱我的程序的整体设计。”*除非你认为*为什么*它搞砸了,我怀疑问题会持续使用已建议的替代方法。 –

回答

4

最简单的方法是创建一个自定义的Icon对象,它负责您的绘画。然后,您可以通过JLabel将图标添加到面板(或将其放在按钮或任何其他带图标的组件上),同时抽象出绘画作品。

+2

用于'implements Icon'的+1,用于[示例](http://stackoverflow.com/questions/2833482/how-to-represent-double-values-as-circles-in-a-2d-matrix-in-爪哇/ 2834484#2834484)。 – trashgod

+0

虽然我想绘制图形。像g.drawLine等。我能在图标类中做到这一点吗? – Emir

+2

@Emir,你可以创建一个'BufferedImage',获取它的'Graphics'对象,在那里执行绘图任务,然后将'BufferedImage'设置为'JLabel'的图标。 – mre

3

你可以看看图像和缓冲图像apis。除了paintcomponent和graphics g之外,您可以通过很多方式生成和处理缓冲图像。我猜如果你生成缓冲图像,然后将它们加载到你的JPanel上,你将能够得到类似的效果。你可以使用setRGB方法绘制你想要的东西。它不像涂料方法那样多才多艺,但它是另一种选择。

+0

BufferedImage没有绘制方法。你可以说得更详细点吗? – Emir

+0

它有一个setRGB函数,虽然这非常有用。只是不容易使它适合您的需求,如涂料方法。你很可能必须逐个像素地工作。我将这添加到我的主帖。 –

0
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Main { 

    public static void main(String[] args) { 
     JPanel viewportPanelTop = new JPanel(); 
     JPanel viewportPanelBottom = new JPanel(); 
     JPanel viewportPanelCenter = new JPanel(); 
     viewportPanelCenter.setBackground(Color.black); 
     viewportPanelCenter.setPreferredSize(new Dimension(600, 400)); 
     JPanel viewportPanelWest = new JPanel(); 
     JPanel viewportPanelEast = new JPanel(); 

     JFrame frame = new JFrame(); 
     frame.setTitle("JFrame"); 
     frame.setLocation(300, 300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLayout(new BorderLayout()); 
     frame.add(viewportPanelTop, BorderLayout.NORTH); 
     frame.add(viewportPanelWest, BorderLayout.WEST); 
     frame.add(viewportPanelCenter, BorderLayout.CENTER); 
     frame.add(viewportPanelEast, BorderLayout.EAST); 
     frame.add(viewportPanelBottom, BorderLayout.SOUTH); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private Main() { 
    } 
} 
+0

1)这是您在此处发布的标题和代码,2)其他绘画需要使用JLabel(如此处所述),3)您没有告诉我们您确切想要绘制的内容,然后有些答案看起来像(为你)拍摄到黑暗......因为你可以绘制图像或图标,并将其放到JLabel或...或者... 4)如果你想使用java.awt.Graphics,那么看看这里http://www.java2s.com/Code/Java/2D-Graphics-GUI/Catalog2D-Graphics-GUI.htm – mKorbel

0

一个想法是将每个自定义绘画放入单独的JPanel中,然后添加它。

public class MyFrame extends JFrame { 
    //initialize frame... 
    //put your components 

    //now put your jpanel 
    MyPanel custom = new MyPanel(); 
    custom.setBounds(10, 10, 100, 100); 

    this.add(custom); 
} 

public class MyPanel extends JPanel { 
    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     //draw your stuff... 
    } 
} 

当然,这将使它少了很多动态...

编辑:

谈到分离,如果你想你的屏幕在例如分离两部分: 一个用于自定义绘画,另一个用于组件,例如用于游戏, 那么此解决方案应该适合您的需求...

+0

谢谢你的答复。但为什么我会这样做?我可以在一堂课中完成所有这一切。更重要的是,这仍然使用paintComponent方法。谢谢你尝试。 – Emir

相关问题