Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自定义组件没有';我没有出现_Java_Swing_Jcomponent - Fatal编程技术网

Java 自定义组件没有';我没有出现

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,

当我设置组件的大小时,会显示大于组件位置的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,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);