Java 自定义组件没有';我没有出现
当我设置组件的大小时,会显示大于组件位置的x和y的值,否则不会显示。Java 自定义组件没有';我没有出现,java,swing,jcomponent,Java,Swing,Jcomponent,当我设置组件的大小时,会显示大于组件位置的x和y的值,否则不会显示。 这是我的代码: public class AdamakPogram{ public static void main(String[] args) { PlayGround playGround = new PlayGround(); Adamak ad1 = new Adamak(); Adamak ad2 = new Adamak(); ad1.setLocation(100,
这是我的代码:
public class AdamakPogram{
public static void main(String[] args) {
PlayGround playGround = new PlayGround();
Adamak ad1 = new Adamak();
Adamak ad2 = new Adamak();
ad1.setLocation(100,100);
ad2.setLocation(150, 100);
ad1.addMouseListener(new FocusListener(ad1));
ad1.addKeyListener(new ArrowListener(ad1));
playGround.addPerson(ad1);
ad2.addMouseListener(new FocusListener(ad2));
ad2.addKeyListener(new ArrowListener(ad2));
playGround.addPerson(ad2);
}
}
我的操场班级:import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
public class PlayGround extends JFrame{
private static final long serialVersionUID = 1L;
private JPanel zone;
public PlayGround() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 800, 600);
setResizable(false);
zone = new JPanel();
zone.setBorder(new EmptyBorder(5, 5, 5, 5));
zone.setBounds(100, 100, 800, 600);
setContentPane(zone);
zone.setLayout(null);
setVisible(true);
}
public void addPerson(Adamak adamak){
zone.add(adamak);
revalidate();
repaint();
}
public JPanel getZone() {
return zone;
}
public void setZone(JPanel zone) {
this.zone = zone;
}
}
和我的adamak(自定义组件)类:
导入java.awt.Graphics;
导入java.awt.Point;
导入javax.swing.JComponent;
公共类Adamak扩展JComponent{
私有静态最终长serialVersionUID=1L;
@凌驾
受保护的组件(图形arg0){
超级组件(arg0);
Point=getLocation();
arg0.drawRect(点x-10,点y-10,点20,点50);//绘制胃
arg0.drawine(点.x+10,点.y,点.x+20,点.y+50);//右手画
arg0.绘制线(点x-10,点y,点x-20,点y+50);//绘制左手
arg0.绘制线(点.x,点.y-10,点.x,点.y-20);//绘制颈部
arg0.绘制线(点x-5,点y+40,点x-5,点y+100);//绘制左腿
arg0.绘制线(点.x+5,点.y+40,点.x+5,点.y+100);//绘制右腿
arg0.draw椭圆形(点x-10,点y-40,23,20);//绘图头
arg0.drawRect(点x-20、点y-40、点40、点140);
}
公权{
Point=getLocation();
如果((点x+1-20)<710){
设置位置(新点(点x+1,点y));
立根(点x-20,点y-40710-40461-140);
重新油漆();
}
}
公共空间左移(){
Point=getLocation();
如果((点x-1-20)>0){
设定位置(新点(点x-1,点y));
立根(点x-20,点y-40710-40461-140);
重新油漆();
}
}
公共空间向上移动(){
Point=getLocation();
如果((点y-1-40)>0){
设定位置(新点(点x,点y-1));
立根(点x-20,点y-40710-40461-140);
重新油漆();
}
}
公共无效向下移动(){
Point=getLocation();
如果((点y+1-100)<461){
设定位置(新点(点x,点y+1));
立根(点x-20,点y-40710-40461-140);
重新油漆();
}
}
}
任何帮助都将不胜感激。当您将子组件添加到空布局(
绝对定位
)时,您应该准确指定组件的位置和尺寸
使用setbounds(x,y,width,height)
方法可以完成此操作
由于已为adamax
组件设置了位置,因此setSize()
就足够了
范例
Adamak ad1 = new Adamak();
ad1.setSize(300, 300);
ad1.setLocation(100, 100);
或者使用setBounds()
编辑
这是你的评论
是的,让我用你画的矩形解释一下
主要问题是这个代码
Point point = getLocation();
在本例中,返回相对于其父容器的Adamak
位置
ad1.setLocation(100,100);
从paintComponent方法
调用
Point point = getLocation();
现在point.x=100
和point.y=100
然后用
arg0.drawRect(point.x-20, point.y-40, 40, 140);
同
arg0.drawRect(80,60,40,140)代码>
但是你期望的组件宽度是40,这怎么可能呢??
它从组件的x开始绘制,该组件为80,但面板的宽度为40。因此您将不会看到任何内容。至少(80+40)宽度组件需要显示矩形的左右,但边框线有一些厚度,因此需要120+宽度的组件来显示
你想要的是改变这一点
比如说
Point point = new Point(20, yyy);
arg0.drawRect(point.x-20, point.y-40, 40, something);
现在40+宽度分量就好了,因为这和
arg0.drawRect(0,point.y-40,40,某物);
它从右角开始绘制,即0,宽度为40,组件的宽度为40+。y和高度相同
这是输出
但是
如果你想移动你的灵魂,而不是移动jcomponents
,这是没有效率的,请使用paintComponent
方法来重新绘制它们。这是一个很好的例子使用LayoutManagerinstead@StanislavL这可以解决我的问题吗?@FastSnail我在eclipse上使用Google window builder,它将JPanel布局设置为null,然后设置组件的边界。不正确吗?@Mohsen是的,这就是他们的目的,但就是这样,你设置(300300)为组件的大小,但它的实际大小:40为W,140为H。就像我给adamak类中最后一个drawRect方法的大小一样:arg0.drawRect(point.x-20,point.y-40,40,140),我不知道我们为什么要把尺寸调大。是的,谢谢你完整的回答。
arg0.drawRect(point.x-20, point.y-40, 40, 140);
Point point = new Point(20, yyy);
arg0.drawRect(point.x-20, point.y-40, 40, something);