Java 如何在一个JFrame中放置两个同时占据全屏的椭圆

Java 如何在一个JFrame中放置两个同时占据全屏的椭圆,java,swing,layout,jframe,jpanel,Java,Swing,Layout,Jframe,Jpanel,我需要在一个框架中放置两个椭圆形。每个椭圆形都属于不同的内部类别。问题是,使用BorderLayout时,使用“中心”可以跨越整个框架。但是,我不能添加第二个椭圆,因为它在第一个椭圆上被覆盖 我可以使用什么布局管理器在整个屏幕上绘制这两个椭圆形?这些将是动画,因此可能会结束对彼此的顶部,所以我需要他们都在整个屏幕上绘制 ----编辑---- 椭圆是一个JPanel,所以我有两个JPanel,两个不同的椭圆从不同的位置开始 我尝试使用BoxLayout,如下所示: mainPanel = new

我需要在一个框架中放置两个椭圆形。每个椭圆形都属于不同的内部类别。问题是,使用BorderLayout时,使用“中心”可以跨越整个框架。但是,我不能添加第二个椭圆,因为它在第一个椭圆上被覆盖

我可以使用什么布局管理器在整个屏幕上绘制这两个椭圆形?这些将是动画,因此可能会结束对彼此的顶部,所以我需要他们都在整个屏幕上绘制

----编辑----

椭圆是一个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列的GrDead布局,但仍然没有填充整个框架。

< P>而不是绘制两个GUI组件并将它们添加到JFrror中,考虑在同一个JPosid的<代码PruttCube(…)> /Cux>方法中绘制椭圆,并将JPAND添加到JFrice的内容窗格BoDeLayOut.C.要获得更详细的答案,请在问题中提供更多信息

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

我可以使用哪种布局管理器来绘制这两个椭圆形 整个屏幕


请参见或

我必须回答自己的问题,因为我既没有使用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());

此代码使两个面板都能占据整个框架尺寸,从而最终解决此问题。

+1 mKorbel和HFOE回答

使用HFOEs建议:

Herre是我举的一个例子:

它使用一个
MyOval
类(一个建模用来保存足够数据以绘制特定颜色的椭圆形的类),它还使用一个名为
DrawPanel
JPanel
,其中包含一个
MyOval
类的
ArrayList
,以及一个添加到
ArrayList
的方法

JPanel
被添加到JFrame中。如果框架设置为可见,则使用
addOval(…)
将两个椭圆添加到
DrawPanel
类中,然后将新的椭圆添加到arraylist中,并调用repain,然后调用
JPanel
paintComponent

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

要这样看待对方:


oval
本身是一个独立的
JPanel
还是
JComponent
呢?@Chris你可以将绘画从两个类集中到一个数组中,在paintComponent中循环这个数组,+1以获得清晰的答案非常好的技巧,但不幸的是,就是这样。除非完全必要,否则不建议使用null
LayoutManager
,但我只需要这两个椭圆。你有代码知道如何用GridLayout实现同样的效果吗?我想我可以只使用一行一列的GridLayout(这意味着整个屏幕),但这不起作用:/@Chris:请不要这样做,因为这是一种黑客行为,会极大地限制你的程序的灵活性以及你更新或修改程序的能力。非常好的例子。问题是,在这个特定的例子中,由于一些不需要深入研究的原因,我所能做的有限。然而,对于一个类似的例子(没有这些限制),这绝对是一条路要走。谢谢你,先生:)@Chris谢谢你。尽管深入研究这些原因可能有助于获得更好的回答,当然,除非你所说的标准是作业。事实上,这基本上就是原因,但是你的答案肯定会帮助那些遇到同样问题的人,而不需要遵循这个标准。所以很明显,我选择了你的答案,而不是我的,因为它更简洁、更灵活。
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