Java 在JFrame中移动JPanel

Java 在JFrame中移动JPanel,java,swing,jpanel,move,Java,Swing,Jpanel,Move,我希望在JFrame中移动一个jpanel,它似乎不会移动。我可以在paint()方法中设置它的位置,但它不会在repaint中更新。请帮忙!这是我的密码: public void paint(Graphics g) { g.drawImage(playerImg, x, 50, null); this.setLocation(x, 50); } public void update() { this.repaint(); } public void keyPres

我希望在JFrame中移动一个jpanel,它似乎不会移动。我可以在paint()方法中设置它的位置,但它不会在repaint中更新。请帮忙!这是我的密码:

public void paint(Graphics g) {
    g.drawImage(playerImg, x, 50, null);
    this.setLocation(x, 50);
}

public void update() {
    this.repaint();
}


public void keyPressed(KeyEvent key) {
    if(key.getKeyCode() == KeyEvent.VK_UP) {
        x = x + 50;
        System.out.println("e");
        update();
    }
}
“我可以在paint()方法中设置它的位置”-说真的,不要在任何
paint
方法中修改任何组件的状态,事实上,您没有调用
super.paint
,已经破坏了绘制链,这将导致其他问题层出不穷

相反,将父容器布局管理器设置为
null
,您现在会发现组件消失。这是因为布局管理器负责设置组件的大小和位置,而您必须接管控制


您应该重写
paintComponent
并调用
super.paintComponent
,而不是重写
paintComponent
。查看更多详细信息

1)切勿在绘制方法中设置位置,因为这会带来麻烦。2) 您甚至不应该覆盖一个JPanel或JComponent的paint,而是
paintComponent
。3) 您确定要移动JPanel吗?更常见的是尝试移动JLabel或图像。4) Swing程序不应该调用
update()
方法。5) 为了使绝对定位有效,容器必须使用
null
布局,这是一种危险的非布局。1)为什么要尝试设置组件的位置?2) 为了更快地获得更好的帮助,请发布一个(最简单的完整测试和可读示例)。我添加了super.paintComponent(),并将JFrame的布局设置为FlowLayout(),但是,我的JPanel中的图像现在是不可见的,无论布局是null还是Flow。这是因为您
JPanel
没有提供大小提示。并确保您正在从
paintComponent
中调用
super.paintComponent
,而不是从
paint
中调用。如果删除布局管理器,则不仅要对组件的位置负责,还要对组件的大小负责。。。