gpt4 book ai didi

java - 如何在 JFrame 中放置两个椭圆形并占据整个屏幕

转载 作者:行者123 更新时间:2023-12-03 01:04:45 24 4
gpt4 key购买 nike

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

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

----编辑----

Oval 是一个 JPanel,所以我有两个 JPanel,其中有 2 个不同的椭圆形,从不同的位置开始。

我尝试像这样使用 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,但仍然没有填满整个框架。

最佳答案

+1 mKorbel 和 HFOE 答案。

使用 HFOE 建议:

这是我制作的一个例子:

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

JPanel 添加到 JFrame 中,框架设置为可见,然后使用 addOval(...) 将 2 个椭圆添加到 DrawPanel 类中> 它将添加一个新的椭圆形到数组列表并调用 repaint,而 repaint 又将调用 JPanelpaintComponent

enter image description here

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

像这样看到另一个:

enter image description here

关于java - 如何在 JFrame 中放置两个椭圆形并占据整个屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14184414/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com