2

我需要在 JFrame 中放置两个椭圆。每个椭圆都属于不同的内部类。问题是使用 BorderLayout 时,当使用 CENTER 时,它允许您跨越整个框架。但是我不能添加第二个椭圆,因为它被第一个覆盖了。

我可以使用什么布局管理器将这两个椭圆都绘制在整个屏幕上?这些将被动画化,因此最终可能会相互叠加,因此我需要将它们都绘制在整个屏幕上。

- - 编辑 - -

Oval 是一个 JPanel,所以我有两个 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类(一个类被建模以保存足够的数据来绘制一个特定颜色的椭圆),它还使用一个JPanel包含DrawPanelforArrayListMyOval和添加到ArrayList.

JPanel添加到 JFrame 的框架设置为可见,然后将 2 个椭圆添加到类DrawPaneladdOval(...),然后使用该类添加一个新的椭圆并添加到 arraylist 并调用 repaint,然后调用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;
    }
}

注意,是的,我们看不到两个椭圆,但那是因为它们位于相同的坐标处:

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

与其绘制两个 GUI 组件并将它们添加到 JFrame,不如考虑在同一 JPanel 的paintComponent(...)方法中绘制椭圆并将该 JPanel 添加到 JFrame 的 contentPane BorderLayout.CENTER。如需更详细的答案,请在您的问题中提供更多信息。

如果您希望椭圆彼此分开,并且它们必须位于扩展 JComponent 或其子之一的类中,请查看 mKorbel 的答案(1+)。或者,如果它们需要相互叠加,则可能使用 JLayeredPane,并使用不透明的 JPanel。

于 2013-01-06T16:59:49.640 回答
3

我可以使用什么布局管理器将这两个椭圆都绘制在整个屏幕上?

请参阅GridLayoutBoxLayout

于 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());

此代码使两个面板都可以接管整个框架大小,最终解决了这个问题。

于 2013-01-06T18:10:48.653 回答