在Java中自由绘制,将绘图添加到JPanel

时间:2014-10-20 20:10:30

标签: java swing jpanel

在我的班级测试中我创建了三个面板。 在我的班级画画中,我自由地画画。

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

   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) {}
}           

1 个答案:

答案 0 :(得分:2)

  

getContentPane()。add(d,BorderLayout.CENTER); //这有效吗

这是有效的,因为内容窗格使用BorderLayout,布局管理器会在将Draw组件添加到CENTER时为Draw组件提供所有可用空间。

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

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

您可以更改centerPanel的布局管理器以使用BorderLayout,也可以覆盖Draw类的getPreferredSize()方法以返回面板的相应首选大小。

问题是为什么你不想在不需要的时候创建一个额外的“centerPanel”?