Java JFrame矩形

时间:2014-01-24 06:21:03

标签: java swing jframe paint

所以,我一直在学习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 个答案:

答案 0 :(得分:2)

  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
  5. 此外,您应该从事件发送线程运行您的Swing应用

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                new MyApp();
            }
        });
    }
    
  6. 请勿在{{1​​}}方法中使用while。你会遇到问题。如果你想要重复绘制某些东西,比如动画,你会想要使用paintComponent。你可以看到一个例子here或任何数量的SO帖子你只能简单地搜索如何使用Swing Timer。

  7. 此外,您的javax.swing.Timer课程已经是App次级。无需在构造函数中创建另一个JFrame。只需添加组件,就像这样

    JFrame