所以我有一个我正在做的项目,它绘制一个圆形和一个正方形,并通过按钮调整它们的大小。一切都很好,但我必须做的是把圆圈放在方形内,这样就可以刻上圆圈了,我似乎无法弄清楚如何将两个摆动元素放在一起。 以下是目前的情况:
这是一个应该如何显示的Photoshop版本:
这是我的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的新手。
提前致谢!
答案 0 :(得分:2)
首先,你不应该扩展Canvas,这是一个AWT组件。在Swing中,您可以扩展JComponent(或JPanel),然后向paintComponent(...)
方法添加自定义绘制。有关详细信息,请阅读自定义绘画的Swing教程中的部分。
此外,您应该使每个组件透明(在组件的构造函数中使用setOaque(false),以便一个组件的背景不会覆盖另一个组件。
我已将它们都添加到调色板中。
由于使用了布局管理器的规则,它们都显示在调色板的顶部:
所以你有几个选择:
利用Swings的父/子关系。这是将方块添加到调色板,将圆圈添加到方块。这意味着您需要在方块上设置布局管理器,以便可以向其添加圆圈。 BorderLayout
可能很容易使用。
使用OverlayLayout
创建面板。此布局管理器允许您在同一面板中相互添加两个组件。您可以将面板添加到面板,将圆圈添加到面板(按顺序,因为Swing首先绘制添加到面板的最后一个组件)。
完全不同(也可能更容易)的选项是使用单个组件并在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);
}
}