如何将两个java swing元素放在彼此的顶部?

如何将两个java swing元素放在彼此的顶部?,java,swing,javabeans,Java,Swing,Javabeans,所以我有一个我正在做的项目,它画一个圆和一个正方形,并通过按钮调整它们的大小。一切都很好,但是我必须做的是把圆放在正方形里面,这样圆就可以内接了,我似乎不知道如何把两个摆动元素放在彼此的上面。 以下是当前情况的图片: 以下是photoshop版本的外观: 这是我的圆圈课: import java.awt.Canvas; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java

所以我有一个我正在做的项目,它画一个圆和一个正方形,并通过按钮调整它们的大小。一切都很好,但是我必须做的是把圆放在正方形里面,这样圆就可以内接了,我似乎不知道如何把两个摆动元素放在彼此的上面。 以下是当前情况的图片:

以下是photoshop版本的外观:

这是我的圆圈课:

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;

public class Picture extends Canvas implements VetoableChangeListener, PropertyChangeListener {
    private final int SIZE = 100;
    private int radius = 1;

    public Picture() {
        setSize(SIZE,SIZE);
    }

    public void vetoableChange(PropertyChangeEvent pce) throws PropertyVetoException {
        if ((pce.getPropertyName()).equals("value")) {
            int v = (Integer)pce.getNewValue();
            if ((v <=0)||(v > SIZE/2))
                throw new PropertyVetoException ("Value out of bounds!", pce);        
        }   
    }


    public void propertyChange(PropertyChangeEvent pce) {
        if ((pce.getPropertyName()).equals("value")) {
            setRadius((Integer)pce.getNewValue());
            repaint(); 
        }
    }

    public void setRadius(int radius) {
        this.radius = radius;
    }

    public int getRadius() {
        return this.radius;
    }

    public void paint (Graphics g) {
        Dimension d = getSize();
        g.setColor(Color.GREEN);
        g.fillOval(d.width/2 - radius, d.height/2 - radius, radius*2, radius*2);
    }

}
导入java.awt.Canvas;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.beans.PropertyChangeEvent;
导入java.beans.PropertyChangeListener;
导入java.beans.PropertyVetoException;
导入java.beans.VetoableChangeListener;
公共类Picture extensed Canvas实现VetoableChangeListener、PropertyChangeListener{
私有最终整数大小=100;
私有整数半径=1;
公共图片(){
设置大小(大小、大小);
}
public void vetoableChange(PropertyChangeEvent pce)引发PropertyVetoException{
如果((pce.getPropertyName()).equals(“值”)){
int v=(整数)pce.getNewValue();
如果((v尺寸/2))
抛出新的PropertyVetoException(“值超出界限!”,pce);
}   
}
公共无效属性更改(属性更改事件pce){
如果((pce.getPropertyName()).equals(“值”)){
setRadius((整数)pce.getNewValue());
重新油漆();
}
}
公共空间设置半径(整数半径){
这个半径=半径;
}
公共int getRadius(){
返回这个.radius;
}
公共空间涂料(图g){
维度d=getSize();
g、 setColor(Color.GREEN);
g、 圆角(d.宽度/2-半径,d.高度/2-半径,半径*2,半径*2);
}
}
这是我的Square类,类似于:

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;


public class Square extends Canvas implements VetoableChangeListener, PropertyChangeListener {
    private final int SIZE = 100;
    private int side = 1;
    public Square() {
        setSize(SIZE,SIZE);
    }

    public void vetoableChange(PropertyChangeEvent pce) throws PropertyVetoException {
        if ((pce.getPropertyName()).equals("value")) {
            int v = (Integer)pce.getNewValue();
            if ((v <=0)||(v > SIZE/2))
                throw new PropertyVetoException ("Value out of bounds!", pce);        
        }   
    }

    public void propertyChange(PropertyChangeEvent pce) {
        if ((pce.getPropertyName()).equals("value")) {
            setSide((Integer)pce.getNewValue());
            repaint();
        }
    }

    public void setSide(int side) {
        this.side = side;
    }

    public int getSide() {
        return this.side;
    }

    public void paint (Graphics g) {
        Dimension d = getSize();
        g.setColor(Color.BLUE);
        g.drawRect(d.width/2 - side, d.height/2 - side, side*2, side*2);
    }

}
导入java.awt.Canvas;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.beans.PropertyChangeEvent;
导入java.beans.PropertyChangeListener;
导入java.beans.PropertyVetoException;
导入java.beans.VetoableChangeListener;
公共类Square扩展画布实现VetoableChangeListener、PropertyChangeListener{
私有最终整数大小=100;
私有内部侧=1;
公众广场(){
设置大小(大小、大小);
}
public void vetoableChange(PropertyChangeEvent pce)引发PropertyVetoException{
如果((pce.getPropertyName()).equals(“值”)){
int v=(整数)pce.getNewValue();
如果((v尺寸/2))
抛出新的PropertyVetoException(“值超出界限!”,pce);
}   
}
公共无效属性更改(属性更改事件pce){
如果((pce.getPropertyName()).equals(“值”)){
setSide((整数)pce.getNewValue());
重新油漆();
}
}
公共无效设置侧(内部侧){
这个边=边;
}
公共int getSide(){
把这面还给我;
}
公共空间涂料(图g){
维度d=getSize();
g、 setColor(Color.BLUE);
g、 drawRect(d.宽度/2-侧面,d.高度/2-侧面,侧面*2,侧面*2);
}
}
我已经将它们都添加到调色板中。请您向我解释一下如何将这两个元素放在彼此之上,我对Swing和JavaBeans还不熟悉


提前谢谢

首先,您不应该扩展画布,这是一个AWT组件。在Swing中,您可以扩展JComponent(或JPanel),然后将自定义绘制添加到
paintComponent(…)
方法中。有关详细信息,请阅读Swing教程中有关自定义绘制的部分

此外,还应使每个组件透明(通过在组件的构造函数中使用setOaque(false),以便一个组件的背景不覆盖另一个组件)

我已经将它们都添加到调色板中

由于使用布局管理器的规则,它们都显示在选项板的顶部:

因此,您有两个选择:

  • 利用父/子关系。也就是说,将正方形添加到调色板中,将圆添加到正方形中。这意味着您需要在正方形上设置布局管理器,以便可以将圆添加到其中。
    BorderLayout
    可能很容易使用

  • 使用
    OverlayLayout
    创建面板。此布局管理器允许您在同一面板中添加两个组件,两个组件相互重叠。您可以将正方形添加到面板中,将圆形添加到面板中(按此顺序,因为Swing会先绘制添加到面板中的最后一个组件)

  • 一个完全不同(可能更简单)的选项是使用单个组件,并在
    paintComponent()
    方法中绘制正方形和圆形


  • 首先,您不应该扩展画布,即AWT组件。在Swing中,您可以扩展JComponent(或JPanel),然后将自定义绘制添加到
    paintComponent(…)
    方法。有关详细信息,请阅读Swing教程中有关自定义绘制的部分

    此外,还应使每个组件透明(通过在组件的构造函数中使用setOaque(false),以便一个组件的背景不覆盖另一个组件)

    我已经将它们都添加到调色板中

    由于使用布局管理器的规则,它们都显示在选项板的顶部:

    因此,您有两个选择:

  • 利用父/子关系。也就是说,将正方形添加到调色板中,将圆添加到正方形中。这意味着您需要在正方形上设置布局管理器,以便可以将圆添加到其中。
    BorderLayout
    可能很容易使用

  • 使用
    OverlayLayout
    创建一个面板。此布局管理器允许您在同一面板中添加两个组件。您可以
    class Circle implements Drawable {
        int x; int y; int radius;
        public void draw(Graphics g) {
            g.fillOval(x - radius, y - radius, radius*2, radius*2);
        }
    }
    
    class MyContainer extends JPanel {
        List<Drawable> ld = ...
        public void paintComponent(Graphics g) {
            for (Drawable d : ld) {
                d.draw(g);
            }
        }