2

JFrame に 2 つの楕円を配置する必要があります。すべての楕円は、異なる内部クラスにあります。問題は、BorderLayout では、CENTER を使用すると、フレーム全体にまたがることができるということです。ただし、最初の楕円が上書きされるため、2 番目の楕円を追加することはできません。

これらの 2 つの楕円を両方とも画面全体に描画するには、どのレイアウト マネージャーを使用できますか? これらはアニメーション化されるため、互いに重なり合う可能性があるため、両方を画面全体に描画する必要があります。

- - 編集 - -

Oval は JPanel なので、異なる位置から始まる 2 つの異なる楕円を持つ 2 つの JPanel があります。

BoxLayout を次のように使用してみました。

 mainPanel = new JPanel();
 mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS));

 mainPanel.add(drawPanel1);
 mainPanel.add(drawPanel2);

 frame.getContentPane().add(BorderLayout.CENTER, mainPanel);

ただし、楕円が中心を通過するとすぐに、一方のパネルが画面の上半分を占め、もう一方のパネルが画面の下半分を占めているため、楕円は消えます。それ以外は正常に動作しています。私が必要とする唯一のことは、両方がすべての画面を占有するようにレイアウトを修正することです

1 行 1 列の GridLayout も試しましたが、それでもフレーム全体がいっぱいになりませんでした。

4

4 に答える 4

5

+1 mKorbel と HFOE の回答。

HFOE のアドバイスを使用する:

ここに私が作った例があります:

MyOvalクラス (特定の色で楕円形を描画するのに十分なデータを保持するようにモデル化されたクラス) を使用し、 for クラスと に追加するメソッドを含む単一の呼び出しも使用しJPanelます。DrawPanelArrayListMyOvalArrayList

JPanelJFrame に追加され、フレームが設定され、2 つの楕円がクラスに追加されます。これにより、新しい楕円が追加され、arraylist に追加され、repaintDrawPaneladdOval(...)呼び出されてから呼び出されpaintComponentますJPanel

ここに画像の説明を入力

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

class Test {

    public Test() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        DrawPanel dp = new DrawPanel(500, 400);

        frame.add(dp);

        frame.pack();
        frame.setVisible(true);

        dp.addOval(0, 0, dp.getWidth(), dp.getHeight(), Color.GREEN);
        dp.addOval(0, 0, dp.getWidth(), dp.getHeight(), Color.BLUE);
        //dp.addOval(5, 5, dp.getWidth(), dp.getHeight(),Color.RED);//uncomment here to see 2nd circle better
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test();
            }
        });
    }
}

class DrawPanel extends JPanel {

    private ArrayList<MyOval> ovals = new ArrayList<>();
    private int width, height;

    public DrawPanel(int w, int h) {
        width = w;
        height = h;
    }

    @Override
    protected void paintComponent(Graphics grphcs) {
        super.paintComponent(grphcs);

        Graphics2D g2d = (Graphics2D) grphcs;
        g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));

        for (MyOval oval : ovals) {
            g2d.setColor(oval.getColor());
            g2d.drawOval(oval.getX(), oval.getY(), oval.getWith(), oval.getHeight());
        }
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(width, height);
    }

    void addOval(int x, int y, int w, int h, Color color) {
        ovals.add(new MyOval(x, y, w, h, color));
        repaint();
    }
}

class MyOval {

    int x, y, with, height;
    Color color;

    public MyOval(int x, int y, int with, int height, Color color) {
        this.x = x;
        this.y = y;
        this.with = with;
        this.height = height;
        this.color = color;
    }

    public Color getColor() {
        return color;
    }

    public int getHeight() {
        return height;
    }

    public int getWith() {
        return with;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}

NBはい、両方の楕円形を見ることはできませんが、それはそれらが同じ座標にあるためです。

dp.addOval(0, 0, dp.getWidth(), dp.getHeight(), Color.GREEN);
//dp.addOval(0, 0, dp.getWidth(), dp.getHeight(), Color.BLUE);
dp.addOval(5, 5, dp.getWidth(), dp.getHeight(), Color.RED);//uncomment here to see 2nd circle better

次のように他のものを見るには:

ここに画像の説明を入力

于 2013-01-06T18:33:22.693 に答える
4

2 つの GUI コンポーネントを描画して JFrame に追加するのではなく、同じ JPanel のpaintComponent(...)メソッドで楕円を描画し、その JPanel を JFrame の contentPane BorderLayout.CENTER に追加することを検討してください。より詳細な回答が必要な場合は、質問に詳細を記入してください。

楕円を互いに分離したい場合、およびそれらが JComponent またはその子の 1 つを拡張するクラスにある必要がある場合は、mKorbel の回答 (1+ に) を見てください。または、相互にオーバーレイする必要がある場合は、おそらく JLayeredPane を使用し、不透明でない JPanels を使用します。

于 2013-01-06T16:59:49.640 に答える
3

これらの 2 つの楕円を両方とも画面全体に描画するには、どのレイアウト マネージャーを使用できますか?

GridLayoutまたはBoxLayoutを参照してください。

于 2013-01-06T17:00:47.407 に答える
-1

GridLayoutでもBoxLayoutでも修正できなかったので、自分の質問に答える必要があります。このレイアウトでこれを実現する方法はあるかもしれませんが、レイアウトをまったく使用しない方が簡単であることがわかりました。

コードは次のとおりです。

    frame.setLayout(null);
    frame.getContentPane().add(drawPanel1);
    frame.getContentPane().add(drawPanel2);
    drawPanel1.setBounds(0, 0, frame.getWidth(), frame.getHeight());
    drawPanel2.setBounds(0, 0, frame.getWidth(), frame.getHeight());

このコードにより、2 つのパネルの両方がフレーム サイズ全体を引き継ぐことができるようになり、最終的にこの問題が解決されます。

于 2013-01-06T18:10:48.653 に答える