在我的课堂测试中,我创建了三个面板。
在课堂绘画中,我徒手绘画。
我想将我的对象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) {}
}
最佳答案
getContentPane()。add(d,BorderLayout.CENTER); //这有效
之所以可行,是因为内容窗格使用BorderLayout
,并且布局管理器在将Draw组件添加到CENTER时将为其提供所有可用空间。
centerPanel.add(d);
add(centerPanel, BorderLayout.CENTER);
这是行不通的,因为BorderLayout会将所有空间都分配给“ centerPanel”。但是“ centerPanel使用FlowLayout,默认情况下,FlowLayout将遵循添加到其中的任何组件的首选大小。您的Draw类没有首选大小,因此大小为零。
您可以将centerPanel的布局管理器更改为也使用BorderLayout,或者可以重写Draw类的
getPreferredSize()
方法以返回面板的适当首选大小。问题是,为什么在不需要时要创建一个额外的“ centerPanel”?