java - Java徒手绘图,添加绘图到JPanel

标签 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);   */

类(class)抽签:

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

最佳答案

getContentPane().add(d, BorderLayout.CENTER); //This works

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

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

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

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

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

关于java - Java徒手绘图,添加绘图到JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26474039/

相关文章:

即使我将 JPanel 添加到 JFrame,Eclipse 上的 Java 也不会显示 JPanel

java - LinkedHashMap的合并映射

java - 在 libgdx 中旋转 ShapeRenderer 时出现视觉伪影

java - 如何在 spring-boot 中禁用 spring-data-mongodb

Java:Swing 库和线程安全

java - 限制 JScrollPane View 宽度

java - 如何在 JPanel (Java) 中正确旋转图像

java - 如何在 Jframe 中创建 JPanel?

java - 类的文档中没有变量