see*_*edg 2 java layout swing jpanel jframe
我需要在JFrame中放置两个椭圆.每个椭圆形都在不同的内部阶层.问题在于使用BorderLayout,当使用CENTER时,它允许您跨越整个帧.但是我不能添加第二个椭圆,因为它在第一个椭圆上被覆盖.
我可以使用什么布局管理器将这两个椭圆涂在整个屏幕上?这些将是动画的,因此最终可能会相互叠加,所以我需要它们都在整个屏幕上绘制.
- - 编辑 - -
椭圆形是一个JPanel所以我有两个JPanels,两个不同的椭圆形从不同的位置开始.
我试过像这样使用BoxLayout:
mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS));
mainPanel.add(drawPanel1);
mainPanel.add(drawPanel2);
frame.getContentPane().add(BorderLayout.CENTER, mainPanel);
Run Code Online (Sandbox Code Playgroud)
然而,一旦椭圆形穿过中心,当一个面板占据屏幕的上半部分而另一个面板占据屏幕的下半部分时,它就会消失.除此之外它工作正常.我唯一需要的是修复布局,以便它们占据所有屏幕
我也试过GridLayout有1行和1列,但仍然没有填满整个帧.
+1 mKorbel和HFOE答案.
使用HFOEs建议:
Herre是我做的一个例子:
它使用一个MyOval类(一个建模的类来保存足够的数据来绘制一个ceartain颜色的椭圆),它还使用一个JPanel被调用的DrawPanel包含ArrayListfor MyOval类和一个方法来添加ArrayList.
的JPanel是O JFrame中加入大于2米的椭圆形被添加到该帧是调用setVisible DrawPanel使用类addOval(...),这将不是增加一个新的椭圆形和到ArrayList并调用重绘,后者又将调用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;
}
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
看到对方是这样的:
