组件中的重新调整大小

3
所以我有一个程序,在使用paintComponent(准确来说是弧和椭圆)显示图像的同时,旁边还有一组JButton和JTextArea。如果用户更改帧的大小,我希望这些弧/椭圆也能够随之改变大小。我已经实现了getWidth、getHeight等方法,但似乎无法使其正常工作。
以下是我的代码。如果我不设置setPreferredSize,则无法正常工作;弧/椭圆会被挤在边框和按钮之间。如果我尝试使用getWidth()和getHeight()而不是200作为尺寸,它也不起作用;弧/椭圆根本不会显示出来。不确定该怎么办。
另外,如果您有任何简化代码的提示(例如,如果只需要一个类),将不胜感激。
public class GUIDesign
{
public static void main(String[] args)
{
    GUIFrame frame = new GUIFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}
}
class GUIFrame extends JFrame
{
PaintPanel2 canvas = new PaintPanel2();
public GUIFrame()
{
    ...

    add(mainHolder, BorderLayout.CENTER);   //has the JButtons, JTextArea.
    add(canvas, BorderLayout.WEST);
    this.setTitle("this");
    this.pack();
    this.setLocationRelativeTo(null);
}
}
class PaintPanel2 extends JPanel
{
private static int SIZE = 200;

public PaintPanel2()
{
    setPreferredSize(new Dimension(SIZE, SIZE));
}
protected void paintComponent(Graphics g)
{
    super.paintComponent(g);

    int xCenter = getWidth()/2;
    int yCenter = getHeight()/2;

    int startOvalX = (int) (xCenter/5);
    int startOvalY = (int) (yCenter/5);
    int endOvalX = (int) (xCenter * 1.5);
    int endOvalY = (int) (yCenter * 1.5);
    g.setColor(Color.green);
    g.fillArc(startOvalX, startOvalY, endOvalX, endOvalY, 0, 180);
    g.setColor(Color.black);
    g.drawArc(startOvalX, startOvalY, endOvalX, endOvalY, 0, 180);
    g.setColor(Color.black);
    g.fillOval((int)(startOvalX/1.5) - 1, (int) (startOvalY * 2.5),(int) (endOvalX * 1.1) + 2,(int)(endOvalY/1.5));
    g.setColor(Color.green);
    g.fillOval((int)(startOvalX/1.5), (int) (startOvalY * 2.5) -1,(int) (endOvalX * 1.1),(int)(endOvalY/1.5));
}
}
1个回答

2

当您使用BorderLayout作为布局管理器时,添加在CENTER中的组件将在主容器调整大小时进行调整。 因此,如果将代码更改为将画布放置在中心位置,则会得到预期的结果:

add(mainHolder, BorderLayout.WEST);   //has the JButtons, JTextArea.
add(canvas, BorderLayout.CENTER);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接