如何将2个java swing元素放在一起?

时间:2018-04-16 19:26:53

标签: java swing javabeans

所以我有一个我正在做的项目,它绘制一个圆形和一个正方形,并通过按钮调整它们的大小。一切都很好,但我必须做的是把圆圈放在方形内,这样就可以刻上圆圈了,我似乎无法弄清楚如何将两个摆动元素放在一起。 以下是目前的情况:

enter image description here

这是一个应该如何显示的Photoshop版本:

enter image description here

这是我的Circle课程:

surname

这是我的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 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);
    }

}

我已将它们都添加到调色板中。您能否向我解释如何将这两个元素放在一起,我是Swing和JavaBeans的新手。

提前致谢!

2 个答案:

答案 0 :(得分:2)

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

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

  

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

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

所以你有几个选择:

  1. 利用Swings的父/子关系。这是将方块添加到调色板,将圆圈添加到方块。这意味着您需要在方块上设置布局管理器,以便可以向其添加圆圈。 BorderLayout可能很容易使用。

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

  3. 完全不同(也可能更容易)的选项是使用单个组件并在paintComponent()方法中绘制方形和圆形。

答案 1 :(得分:0)

您应该至少覆盖isOpaque以在Circle和Square上返回false,因此非绘制像素将被视为&#34; show-through&#34;。

接下来,您还需要在容器中使用免费布局,以便能够控制对象的确切位置。

注意:不要使用Canvas,最好不要将任何组件子类化来表示绘图,只是实现一些方法(比如draw),它会绘制图形来绘制使用,并覆盖容器的paintComponent以在每个绘图对象上调用该方法:

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