gpt4 book ai didi

java - 自定义组件不显示

转载 作者:搜寻专家 更新时间:2023-11-01 03:36:06 24 4
gpt4 key购买 nike

当我设置组件的大小时,除了组件位置的 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);
}
}

我的 PlayGround 类:

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(自定义组件)类:

import java.awt.Graphics;
import java.awt.Point;

import javax.swing.JComponent;

public class Adamak extends JComponent {

private static final long serialVersionUID = 1L;

@Override
protected void paintComponent(Graphics arg0) {
super.paintComponent(arg0);
Point point = getLocation();
arg0.drawRect(point.x-10, point.y-10, 20, 50);//drawing stomach
arg0.drawLine(point.x+10,point.y, point.x+20, point.y+50);//drawing right hand
arg0.drawLine(point.x-10, point.y, point.x-20, point.y+50);//drawing left hand
arg0.drawLine(point.x, point.y-10, point.x, point.y-20);//drawing neck
arg0.drawLine(point.x-5, point.y+40, point.x-5, point.y+100);//drawing left leg
arg0.drawLine(point.x+5, point.y+40, point.x+5, point.y+100);//drawing right leg
arg0.drawOval(point.x-10, point.y-40, 23, 20);//drawing head
arg0.drawRect(point.x-20, point.y-40, 40, 140);
}

public void moveRight(){
Point point = getLocation();
if((point.x+1-20) < 710){
setLocation(new Point(point.x+1, point.y));
setBounds(point.x-20,point.y-40,710-40,461-140);
repaint();
}
}

public void moveLeft(){
Point point = getLocation();
if((point.x-1-20) > 0){
setLocation(new Point(point.x-1,point.y));
setBounds(point.x-20,point.y-40,710-40,461-140);
repaint();
}
}

public void moveUp(){
Point point = getLocation();
if((point.y-1-40) > 0){
setLocation(new Point(point.x,point.y-1));
setBounds(point.x-20,point.y-40,710-40,461-140);
repaint();
}
}

public void moveDown(){
Point point = getLocation();
if((point.y+1-100) < 461){
setLocation(new Point(point.x,point.y+1));
setBounds(point.x-20,point.y-40,710-40,461-140);
repaint();
}
}
}

如有任何帮助,我们将不胜感激。

最佳答案

当您将子组件添加到空布局(绝对定位)时,您应该准确指定组件的位置和尺寸。

使用 setbounds(x,y,width,height) 方法你可以做到。

因为您已经为 adamax 组件设置了位置 setSize() 就足够了。

例子

Adamak ad1 = new Adamak();
ad1.setSize(300, 300);
ad1.setLocation(100, 100);

或使用setBounds()

Adamak ad1 = new Adamak();
ad1.setBounds(100,100,300,300);

编辑

这是为了你的意见

是的,让我使用您正在绘制的矩形进行解释。

主要问题是这段代码

Point point = getLocation();

在这种情况下,这将返回 Adamak 相对于它的父容器的位置

ad1.setLocation(100,100); 

从您调用的paintComponent 方法

 Point point = getLocation();

现在 point.x=100point.y=100然后使用

绘制外框
arg0.drawRect(point.x-20, point.y-40, 40, 140);

同上 arg0.drawRect(80, 60, 40, 140);

但是您希望您的组件宽度为 40,这怎么可能??它从 80 的组件的 x 开始绘制,但你的面板的宽度为 40。所以你不会看到任何东西。至少 (80 + 40) 宽度组件需要显示矩形的左右但边框线有一些 thikness 所以你需要 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, something);它从最右边的角开始绘制,即 0,宽度为 40,组件的宽度为 40 +。y 和高度相同

这是输出

enter image description here

但是

如果你想移动你的精神而不是移动效率不高的jcomponents,请使用paintComponent方法重绘它们。这是一个很好的例子https://www3.ntu.edu.sg/home/ehchua/programming/java/J8a_GameIntro-BouncingBalls.html

关于java - 自定义组件不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31071179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com