gpt4 book ai didi

Java JFrame 矩形

转载 作者:行者123 更新时间:2023-12-02 06:17:22 28 4
gpt4 key购买 nike

所以,我一直在学习 Java,但我还是个新手,所以请耐心等待。我最近的目标是图形化程序,这次是对键盘控制的测试。由于某种原因,该程序不会显示矩形。通常,paint() 会独立运行,但由于某种原因它不会运行。我查看了我制作的其他程序以及网络上的其他程序,但我仍然无法弄清楚。

import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;

public class App extends JFrame{

public static int keyVal = 0;
public static void main(String[] args) {
new App();
while(true){
System.out.println(keyVal);
Wait.ms(50);
}
}

public App(){
JFrame f = new JFrame();

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setTitle("Pong");
f.setSize(300,400);

f.setLocationRelativeTo(null);

f.addKeyListener(new KeyListener(){
public void keyPressed(KeyEvent e){
keyVal = e.getKeyCode();
}

public void keyReleased(KeyEvent e){
keyVal = 0;
}

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

f.setVisible(true);
}

public void paint(Graphics g){
g.setColor(Color.orange);
while(true){
g.drawRect(20, 20, 100, 60);
}
}

}

最佳答案

  1. 不要在像 JFrame 这样的顶级容器上绘画,因为它们已经承载了绘画组件的负载并且不是双缓冲的。
  2. 而是使用自定义 JPanel 来绘制并重写其 paintComponent 方法并调用 super.paintCompoent。然后将该面板添加到框架中。

    public class MyPanel extends JPanel {
    @Override
    protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    }

    @Override
    public Dimension getPreferredSize() {
    return new Dimension(300, 300);
    }
    }
  3. 另请注意,在上面的代码中,我覆盖了 getPreferredSize() 方法。这就是您在 JPanel 上绘画时想要执行的操作。原因是没有设置首选大小,因此您需要设置它。另外,应该使用它,这样您就不必设置容纳它的框架的尺寸。相反,只需调用 frame.pack() 即可,并且会考虑 JPanel 的首选大小。

  4. 不要将 KeyListener 与 Swing 应用程序一起使用。而是使用 Key Bindings ,并且使用 KeyListener 时您可能会遇到焦点问题等。你可以看一个例子Here关于如何使用简单的按键绑定(bind)。
  5. 此外,您还应该像这样从事件调度线程运行 Swing 应用程序

    public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable(){
    @Override
    public void run() {
    new MyApp();
    }
    });
    }
  6. 不要在 paintComponent 方法中使用 while。你会遇到问题。如果您希望重复绘制某些内容(例如动画),您将需要考虑使用 javax.swing.Timer。你可以看一个例子here或者您只需简单搜索一下如何使用 Swing Timer 就可以找到任意数量的 SO 帖子。

  7. 此外,您的 App 类已经是 JFrame 子类。无需在构造函数中创建另一个 JFrame。只需向其中添加组件即可,如下所示

    public App() {
    add(new MyPanel(), BorderLayout.CENTER);
    add(new JButton("Button"), BorderLayout.SOUTH);
    }

关于Java JFrame 矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21325792/

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