簡體   English   中英

Java JFrame矩形

[英]Java JFrame rectangle

所以,我一直在學習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來解決焦點問題。 您可以在此處查看示例,了解如何使用簡單的鍵綁定。
  5. 此外,你應該像這樣從事件調度線程運行你的Swing應用程序

     public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable(){ @Override public void run() { new MyApp(); } }); } 
  6. 不要在paintComponent方法中使用while 你會遇到問題。 如果你想要重復繪制某些東西,比如動畫,你會想要使用javax.swing.Timer 你可以在這里看到一個例子或者你可以找到任何數量的SO帖子,只是簡單地搜索如何使用Swing Timer。

  7. 此外,您的App類已經是JFrame sublcass。 沒有必要在構造函數中創建另一個JFrame 只需添加組件,就像這樣

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM