gpt4 book ai didi

java - 在java JFrame中的特定网格空间内移动对象可能使用GridBagLayout吗?

转载 作者:行者123 更新时间:2023-12-02 09:03:53 26 4
gpt4 key购买 nike

我想在 JFrame 窗口上的 1x 10 垂直网格上上下移动一个矩形。

网格应该编号,我应该能够知道矩形在网格上的第几层。

我对java没有太多的经验,但到目前为止,我从观看的教程中了解到的基本代码允许我在屏幕上上下移动矩形,但矩形会离开屏幕而且它不在网格上。

package JavaWork;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Lift extends JPanel implements ActionListener, KeyListener {
Timer tm = new Timer(5, this);
int x = 0, y = 0, velX = 0, velY = 0;
/**
*
*/
public Lift() {
// TODO Auto-generated constructor stub
tm.start();
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
}

public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
g.fillRect(x, y, 50, 30);

}

public void actionPerformed(ActionEvent e) {
x = x + velX;
y = y + velY;
repaint();
}

public void keyPressed(KeyEvent e) {
int c = e.getKeyCode();

if (c == KeyEvent.VK_UP) {
velX = 0;
velY = -1;

}
if (c == KeyEvent.VK_DOWN) {
velX = 0;
velY = 1;

}
}

public void keyTyped(KeyEvent e) {}
public void keyReleased(KeyEvent e) {}


/**
* @param args
*/
public static void main(String[] args) {
// TODO code application logic here
Lift t = new Lift();
JFrame jf = new JFrame();

jf.setTitle("Lift");
jf.setSize(600, 400);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.add(t);
}
}

任何建议、代码、网站或教程的视频链接将不胜感激:)

最佳答案

您可以自己完成相当于网格的工作,只需使用 40 倍数的 y 坐标进行绘制。我建议使用 40,因为您将窗口的高度设置为 400,并且您希望在其中有 10 个“楼层”你的网格和 400 ÷ 10 = 40。

因此,paintComponent 方法中的最后一行应如下所示:

g.fillRect(x, y * 40, 50, 30);

从技术上讲,窗口的绘图区域将略小于 400,因为 JFrame 大小包括窗口的标题栏和边框。您可以通过替换以下内容来解决此问题:

jf.setSize(600, 400);

这样:

jf.add(t);
jf.pack();

并删除其他 jf.add(t); 行。您还需要在类中添加 getPreferredSize 覆盖:

@Override
public Dimension getPreferredSize() {
return new Dimension(600, 400);
}

(您还需要在程序顶部添加 import java.awt.Dimension; 行。)

pack() 方法告诉窗口尽最大努力适应它所包含的每个组件的首选大小。这就是为什么您的面板有必要报告其自己的首选大小,这就是为什么有必要在 JFrame 打包并设置为可见之前添加面板。

至于为什么矩形会如此快地移出屏幕,这是由于您传递给计时器的数字所致:

Timer tm = new Timer(5, this);

5 表示 Swing 每 5 毫秒调用一次 actionPerformed 方法,即每秒 200 次!您可能想要一个更合理的值,例如每秒两次:

Timer tm = new Timer(500, this);

最后,您需要通过检查 actionPerformed 方法中的最小和最大 y 值来确保您的矩形永远不会离开屏幕:

y = y + velY;
y = Math.max(0, y); // don’t let y go off the top
y = Math.min(9, y); // don’t let y go off the bottom

关于java - 在java JFrame中的特定网格空间内移动对象可能使用GridBagLayout吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59971736/

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