2014-09-04 65 views
-1

首先,對於糟糕的英語感到抱歉。Java setLocation()在新的keyEvent後重置

我有一個問題。我編寫了一個簡單的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) { 


} 
} 

我希望有人能幫忙。

+0

您還沒有發佈突出顯示您的問題的代碼 – ControlAltDel 2014-09-04 18:10:31

+0

現在我做了。我忘了,我很抱歉。突出顯示我的問題的代碼是Builder.getInstance()。plaatje.setText(「UP」); – VeraRodermond 2014-09-04 18:13:30

回答

0

嘗試使用AbsoluteLayout。 setLayout(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); 
} 
} 
+0

謝謝!這工作正常! – VeraRodermond 2014-09-04 18:32:55

0

你的問題是,即使你在你的框架上的佈局管理器設置爲空,你將其設置爲GroupLayout的對你的contentPane

getContentPane().setLayout(groupLayout);

當你手動,這個調用setLocation因爲你的contentpane沒有重新驗證。但是當你調用setText時,它調用validate()。

所以,如果你想移動部件,我的建議是設置你的contentPane的佈局爲空