我想知道如何将值连续导出到JFrame中的TextField,有一个正在移动的圆,我正在计算它的速度,我希望每次改变速度时都要在TextField中显示这个速度,但问题是我无法从(public void(keyPressed(KeyEvent e))获取值并将其带到main方法以在TextField中显示它(field.setText(Double.toString(velx) ));)enter image description here enter image description here
public class All extends JComponent implements ActionListener, KeyListener {
Timer t = new Timer(5, this);
double x=0 , y=0;
static double velx=0 ,vely=0;
public All() {
t.start();
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setStroke(new BasicStroke(10));
g2.setColor(Color.red);
g2.drawLine(10, 300, 1990, 300);
g2.setColor(Color.blue);
g2.fill(new Ellipse2D.Double(x,y,40,40));
g2.setStroke(new BasicStroke(10));
g2.setColor(Color.green);
g2.drawRect(900, 500, 700,400);
}
public void up() {
vely=vely-0.5;
velx = 0;
}
public void down() {
vely=vely+0.5;
velx = 0;
}
public void left() {
velx=velx-0.5;
vely = 0;
}
public void right() {
velx=velx+0.5;
vely = 0;
}
public static void stop() {
velx=0;
vely=0;
}
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if(code == KeyEvent.VK_UP) {
up();
if(x>900 && x<1577 && y>500 && y<860) {
System.out.println("up: "+(-1*vely)+"/s");
}
}
if(code == KeyEvent.VK_DOWN) {
down();
if(x>900 && x<1577 && y>500 && y<860) {
System.out.println("down: "+vely+"/s");
}}
if(code == KeyEvent.VK_RIGHT) {
right();
if((x<=1880 && x>=-7 && y>=262 && y<=288 ) || (x>900 && x<1577 && y>500
&& y<860 )) {
System.out.println("right: "+velx+"/s");
}
}
if(code == KeyEvent.VK_LEFT) {
left();
if(x<=1880 && x>=-7 && y>=262 && y<=288 || (x>900 && x<1577 && y>500 &&
y<860)) {
System.out.println("left: "+(-1*velx)+"/s");}
}
if(code == KeyEvent.VK_SPACE) {
stop();
}
}
主要方法:
public static void main(String[] args) {
JLabel velocity = new JLabel("Velocity");
JLabel change = new JLabel("Change");
JFrame frame = new JFrame("APPLICATION");
Button button = new Button("Mode 2");
TextField field = new TextField();
change.setBounds(30, 486, 150,50);
velocity.setBounds(30, 400, 150,50);
button.setBounds(150, 500, 150,30);
field.setBounds(150, 415, 150,30);
velocity.setForeground(Color.white);
velocity.setFont(new Font("sansserif",Font.PLAIN, 30));
change.setForeground(Color.white);
change.setFont(new Font("sansserif",Font.PLAIN, 30));
button.setFont(new Font("serif",Font.PLAIN, 18));
field.setFont(new Font("serif",Font.PLAIN, 18));
frame.setContentPane(new All());
frame.setBackground(Color.BLACK);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(true);
frame.pack();
frame.add(field);
frame.add(button);
frame.add(velocity);
frame.add(change);
frame.setSize(800,600);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
field.setText(Double.toString(velx));
button.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
if(e.getActionCommand()=="Mode 2"){
All2.main(args);
frame.setVisible(false);
stop();
}
}
});
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void actionPerformed(ActionEvent arg0) {
repaint();
x += velx;
y += vely;
if(x>=1885) {
x=1885;
stop();
}
if(y>=1010) {
y=1010;
stop();
}
if(y>=372 && y<374 && x<300 ) {
stop();up();
}if(x<300 && (y>374 && y<524) ) {
stop();right();
}if( x<300 && y>=524 && y<526) {
stop();down();
}
if(x<=-7) {
x=-7;
stop();
}
if(y<=-5) {
y=-5;
stop();
}
}
}
答案 0 :(得分:0)
有很多种方法可以解决这个问题,包括在你的问题评论中建议的那些涉及正确挂钩GUI的内容,这样就可以自动注意更改并填充,而无需你做太多的工作。
快速而肮脏的解决方案是为该字段设置一个全局变量。
TextField yourTextField; // <-- global variable (initialized somewhere)
然后,您可以在每次按下某个键时直接从keyPressed(...)更新它的文本(请参阅下面的示例),或者您可以在任何可能更新它的键检查中将其挤出。
public void keyPressed(KeyEvent e) {
// ... all the other stuff
textField.setText( Double.toString(velx) );
}
它也可以在right(),left()等方法中更新。然而,这些方法中的任何一种都是丑陋的,既不推荐也不适当处理它。
我不确定理想这样做的方式是什么,但是一种方法就是运行某种常规的UI更新,检查你想要的所有字段UI显示。的值。
更新功能
void updateUI() {
// ... whatever else needs doing
if( !textField.getText().equals( Double.toString(velx) ) ) {
textField.setText( Double.toString(velx) );
}
}
然后在某个主程序中调用该函数。
void mainLoop() {
updateUI()
}
另一个是调整你的功能,这样当你调整这些值时,你也会勾选一些会触发条件UI更新的框。
在更改特定变量的值时更改的全局(或其他范围)变量。
boolean velx_changed = false;
更改值并标记更新
velx++;
velx_changed = true;
主程序中发生的事情
void mainLoop() {
if( velx_changed ) {
textField.setText( Double.toString(velx) );
}
}
答案 1 :(得分:-1)
谢谢你。我在课堂上使用了静态TextField然后我将它添加到主方法中的框架
static TextField field = new TextField();
在keyPressed中
if(code == KeyEvent.VK_RIGHT) {
right(); field.setText(Double.toString(velx));
if((x<=1880 && x>=-7 && y>=262 && y<=288 ) || (x>900 && x<1577 && y>500
&& y<860 )) {
System.out.println("right: "+velx+"/s");
}
}
主要方法
frame.add(field);