3

そのため、JButtons と JTextArea のセットの横に paintComponent (正確には弧と楕円) を使用して画像を表示するプログラムがあり、ユーザーがサイズを変更したときに弧/楕円のサイズを変更したいフレーム。私はgetWidth、getHeightのものを実装しましたが、うまくいかないようです。

これは私のコードです。PreferredSize を設定しないと機能しません。フレームの端とボタンの間で円弧/楕円が押しつぶされます。サイズに 200 の代わりに getWidth() と getHeight() を使用しようとすると、どちらも機能しません。円弧/楕円はまったく表示されません。何をすべきかわからない。

また、コードの複雑さを軽減するためのヒント (たとえば、1 つのクラスのみが必要な場合) をいただければ幸いです。

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));
}
}
4

1 に答える 1

2

BorderLayoutをレイアウト マネージャーとして使用しているCENTER場合、メイン コンテナーのサイズが変更されると、 に追加されたコンポーネントがサイズ変更されます。したがって、コードを変更してキャンバスを中央に配置すると、期待どおりの結果が得られます。

add(mainHolder, BorderLayout.WEST);   //has the JButtons, JTextArea.
add(canvas, BorderLayout.CENTER);
于 2012-10-09T15:54:31.887 に答える