Java setLocation()在new keyEvent之后重置

Java setLocation()在new keyEvent之后重置,java,Java,首先,抱歉英语不好 我有个问题。我编写了一个简单的keyEvent代码,它可以移动我的JLabel。它工作正常,但当我要求代码使用keyEvent更改setText时,他将重置我的setLocation()。这是我的密码: package view; import javax.swing.JFrame; import javax.swing.GroupLayout; import javax.swing.GroupLayout.Alignment; import javax.swing.JLa

首先,抱歉英语不好

我有个问题。我编写了一个简单的keyEvent代码,它可以移动我的JLabel。它工作正常,但当我要求代码使用keyEvent更改setText时,他将重置我的setLocation()。这是我的密码:

package view;

import javax.swing.JFrame;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JLabel;

import controller.Keylisteners;

@SuppressWarnings("serial")
public class Builder extends JFrame {

public JLabel plaatje = new JLabel();
public static Builder instance;

public static Builder getInstance(){
    if(instance == null){
        instance = new Builder();
    }
    return instance;
}

public Builder() {
    setSize(getMaximumSize());
    this.addKeyListener(new Keylisteners());
    setLayout(null);
    //plaatje.setText("UP");
    GroupLayout groupLayout = new GroupLayout(getContentPane());
    groupLayout.setHorizontalGroup(
        groupLayout.createParallelGroup(Alignment.LEADING)
            .addGroup(Alignment.TRAILING, groupLayout.createSequentialGroup()
                .addContainerGap(595, Short.MAX_VALUE)
                .addComponent(plaatje)
                .addGap(567))
    );
    groupLayout.setVerticalGroup(
        groupLayout.createParallelGroup(Alignment.LEADING)
            .addGroup(Alignment.TRAILING, groupLayout.createSequentialGroup()
                .addContainerGap(570, Short.MAX_VALUE)
                .addComponent(plaatje, GroupLayout.PREFERRED_SIZE, 65,       GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
    );
    getContentPane().setLayout(groupLayout);


} 
}
还有另一班

package controller;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import view.Builder;

public class Keylisteners extends KeyAdapter{



public void keyPressed(KeyEvent e) {
     if (e.getKeyCode() == KeyEvent.VK_UP) {
 Builder.getInstance().plaatje.setText("UP");
         Builder.getInstance().plaatje.setLocation(Builder.getInstance().plaatje.getX(),      Builder.getInstance().plaatje.getY()-5);
         Builder.getInstance().plaatje.repaint();
        }
     else if (e.getKeyCode() == KeyEvent.VK_DOWN) { 
     Builder.getInstance().plaatje.setText("DOWN");
         Builder.getInstance().plaatje.setLocation(Builder.getInstance().plaatje.getX(), Builder.getInstance().plaatje.getY()+5);
         Builder.getInstance().plaatje.repaint();
        }
     else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
   Builder.getInstance().plaatje.setText("LEFT");
         Builder.getInstance().plaatje.setLocation(Builder.getInstance().plaatje.getX()-5, Builder.getInstance().plaatje.getY());
         Builder.getInstance().plaatje.repaint();
        }
     else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
      Builder.getInstance().plaatje.setText("RIGHT");
         Builder.getInstance().plaatje.setLocation(Builder.getInstance().plaatje.getX()+5, Builder.getInstance().plaatje.getY());
         Builder.getInstance().plaatje.repaint();
        }

}

@Override
public void keyReleased(KeyEvent e) {


}

@Override
public void keyTyped(KeyEvent e) {


} 
}

我希望有人能帮上忙。

您的问题是,即使您在框架上将layoutmanager设置为null,但在内容窗格中将其设置为GroupLayout


getContentPane().setLayout(groupLayout)

当您手动调用setLocation时,这会起作用,因为您的contentpane没有重新验证。但当您调用setText时,它调用的是validate()


因此,如果您想要移动组件,我的建议是将contentpane上的布局设置为null,尝试使用绝对布局<代码>设置布局(空)
更改标签的文本会导致容器valitdate()。这意味着容器将重新计算位置,并且您正在使用布局,因此它将重置

import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;

import java.awt.event.KeyListener;

@SuppressWarnings("serial")
public class Builder extends JFrame implements KeyListener {

public JLabel plaatje = new JLabel();
public static Builder instance;

public static Builder getInstance() {
    if (instance == null) {
        instance = new Builder();
    }
    return instance;
}

public Builder() {
    setSize(getMaximumSize());
    this.addKeyListener(this);
    setLayout(null);
    plaatje.setText("UP");

    add(plaatje);
    plaatje.setBounds(0, 0, 50, 50);

}

public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_UP) {
        Builder.getInstance().plaatje.setText("UP");
        Builder.getInstance().plaatje.setLocation(Builder.getInstance().plaatje.getX(), Builder.getInstance().plaatje.getY() - 5);
        Builder.getInstance().plaatje.repaint();
    } else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
        Builder.getInstance().plaatje.setText("DOWN");
        Builder.getInstance().plaatje.setLocation(Builder.getInstance().plaatje.getX(), Builder.getInstance().plaatje.getY() + 5);
        Builder.getInstance().plaatje.repaint();
    } else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
        Builder.getInstance().plaatje.setText("LEFT");
        Builder.getInstance().plaatje.setLocation(Builder.getInstance().plaatje.getX() - 5, Builder.getInstance().plaatje.getY());
        Builder.getInstance().plaatje.repaint();
    } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
        Builder.getInstance().plaatje.setText("RIGHT");
        Builder.getInstance().plaatje.setLocation(Builder.getInstance().plaatje.getX() + 5, Builder.getInstance().plaatje.getY());
        Builder.getInstance().plaatje.repaint();
    }

}

@Override
public void keyReleased(KeyEvent e) {

}

@Override
public void keyTyped(KeyEvent e) {

}

public static void main(String[] args) {
    Builder.getInstance().setVisible(true);
}
}

你没有发布代码来突出你的问题,现在我发布了。对不起,我忘了。突出我的问题的代码是Builder.getInstance().plaatje.setText(“UP”);