2014-10-20 59 views
0

在我的课Test I创建三个面板。 在我的课上画画,我自由地画画。用Java自由地绘制,添加绘图到JPanel

我想将我的对象d添加到centerPanel。当我这样做没有画。但是,如果我将它添加到框架(使用getContentPane()。添加)它绘制。 有谁知道问题在哪里?

topPanel = new JPanel(); 
    centerPanel = new JPanel();  
    bottomPanel = new JPanel(); 

    Draw d = new Draw(); 
    getContentPane().add(d, BorderLayout.CENTER); //This works 
    add(topPanel, BorderLayout.PAGE_START);     
    add(bottomPanel, BorderLayout.PAGE_END); 


    /* I WANT THIS TO WORK INSTEAD    */ 
    /* centerPanel.add(d);      */ //How can I write this line of code? 
    /* add(topPanel, BorderLayout.PAGE_START); */    
    /* add(centerPanel, BorderLayout.CENTER);  */  
    /* add(bottomPanel, BorderLayout.PAGE_END); */ 

类消耗:

public class FreeHand extends JComponent, MouseListener, MouseMotionListener {  
    int x; 
    int y; 
    int posX; 
    int posY; 

    public FreeHand() 
    { 
     addMouseListener(this); 
     addMouseMotionListener(this); 
    } 

    @Override 
    public void mousePressed(MouseEvent me) {    
     posX = me.getX(); 
     posY = me.getY(); 
    } 

    @Override 
    public void mouseDragged(MouseEvent me) { 
     Graphics g = getGraphics(); 
     g.setColor(Color.RED); 
     g.drawLine(posX, posY, me.getX(), me.getY()); 
     posX = me.getX(); 
     posY = me.getY(); 
    } 

    @Override 
    public void mouseMoved(MouseEvent me) {} 

    @Override 
    public void mouseClicked(MouseEvent me) {} 

    @Override 
    public void mouseEntered(MouseEvent me) {} 

    @Override 
    public void mouseExited(MouseEvent me) {} 

    @Override 
    public void mouseReleased(MouseEvent me) {} 
}   
+0

我注意到你正在使用'getGraphics'在paintComponent'之外进行绘制,而这不是正确的方法。请阅读[我的答案](http://stackoverflow.com/quest离子/ 21322353/java-jpanel-getgraphics/21322873#21322873)举例说明如何正确执行此操作。 (在图像上绘图,然后在面板上绘制图像。) – Radiodef 2014-10-20 23:02:32

回答

2

的getContentPane()添加(d,BorderLayout.CENTER); //这个工程

做是因为内容窗格中使用BorderLayout和布局管理器将会给所有的绘图组件中的可用空间时,它被添加到该中心。

centerPanel.add(d);      
add(centerPanel, BorderLayout.CENTER); 

这不起作用,因为BorderLayout将给“centerPanel”所有空间。但是“centerPanel使用FlowLayout,默认情况下,FlowLayout将尊重添加到它的任何组件的首选大小。您的Draw类没有首选大小,因此大小为零。

您可以更改布局管理器中心面板也使用BorderLayout,或者您可以覆盖Draw类的getPreferredSize()方法以返回面板的相应首选尺寸。

问题是为什么当你不想创建额外的“centerPanel”时需要它吗?

+0

感谢您的解释。我想在centerPanel中绘制的原因是centerPanel的背景颜色设置为白色。我不知道如何改变Borderlayout.center的背景颜色? – user2939293 2014-10-20 20:42:55

+0

@ user2939293,'我不知道如何改变Borderlayout.center的背景颜色?你正在创建一个自定义组件,你可以随心所欲地绘制背景。或者,扩展JPanel会更容易,然后您只需设置背景。另外,当你获得帮助时,你通常会“接受”答案。 – camickr 2014-10-21 00:58:39