在我的测试类中,我创建了三个面板。 在我的绘画课上,我徒手画画。
我想将我的对象 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/