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