gpt4 book ai didi

java - 如何在 Java 中按一次键使形状移动?

转载 作者:行者123 更新时间:2023-11-29 04:38:19 24 4
gpt4 key购买 nike

我在大学里有一个任务是画一个椭圆,让它在屏幕上一步一步地移动,只按一次按钮。这是我的代码:

public class Window extends JPanel {

private static Ellipse2D.Double Ellipse;
private JFrame frame;

public Window() {
super();
int width = 20;
int height = 30;
Ellipse = new Ellipse2D.Double(width, height, 100, 50);
}

public Dimension getPreferredSize()
{
return (new Dimension(frame.getWidth(), frame.getHeight()));
}

@Override
public void paintComponent(Graphics g) {
super.paintComponents(g);
Graphics2D brush = (Graphics2D) g;
int width = getWidth();
int height = getHeight();
g.clearRect(0, 0, width, height);
brush.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
brush.draw(Ellipse);
}
public class MoveCircle implements KeyListener, ActionListener {

@Override
public void keyPressed(KeyEvent e) {
System.out.println("Working on top!");
double newX = 0; double newY = 0;
if (e.getKeyCode() == Event.ENTER) {
for (int i = 0; i < 26; i ++)
{
System.out.println("Working on bottom!");
newX = Ellipse.x + 10;
Ellipse.x = newX;
newY = Ellipse.y + 10;
Ellipse.y = newY;
repaint();
}
}
}

@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}

@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub

}
}
private void createAndDisplayGUI(Window window)
{
frame = new JFrame();
Container container = frame.getContentPane();
container.add(window);
window.addKeyListener(new MoveCircle());
frame.setSize(400, 400);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
window.requestFocusInWindow();
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
Window window = new Window();
window.createAndDisplayGUI(window);
}
});
}

}

虽然我每次都在循环中调用函数 repaint() ,但椭圆只是从原始点从根本上移动到上次迭代中定义的点,而没有在每次迭代中绘制椭圆的位置。是否可以使用 Swing Timer 使其在每次迭代中重新绘制椭圆?我很乐意在这方面得到帮助。

最佳答案

您有两个问题:第一个是您的循环正在 UI 线程上运行。第二个是您对重绘工作原理的误解。重绘所做的只是向 UI 线程添加请求以进行重绘。它本身不执行重绘。所以如果你在UI线程上运行操作,多次调用它是没有效果的。正如您所建议的,您可以使用 Swing Timer 解决此问题,正如我在下面汇总的那样

ActionListener al = new ActionListener() {
int iterations = 0;
public void actionPerformed(ActionEvent ae) {
if (iterations == 25) {
timer.stop();
}
interations++;
System.out.println("Working on bottom!");
newX = Ellipse.x + 10;
Ellipse.x = newX;
newY = Ellipse.y + 10;
Ellipse.y = newY;
repaint();
}
};

final timer = new javax.swing.Timer(delay, al);
timer.start();

关于java - 如何在 Java 中按一次键使形状移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40310940/

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