[英]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);
}
}
}
JFrame
這樣的頂級容器上繪畫,因為他們已經承載了繪畫組件的負載並且沒有雙重緩沖。 而是使用自定義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); } }
另請注意,在上面的代碼中,我覆蓋了getPreferredSize()
方法。 這是您在JPanel
上繪畫時想要做的事情。 原因是沒有設置首選大小,因此您需要設置它。 此外,還應使用此選項,以便您不必設置包含它的框架的大小。 相反,只需調用frame.pack()
,將尊重JPanel
的首選大小。
KeyListener
與Swing應用程序一起使用。 而是使用Key Bindings ,您可能會使用KeyListener
來解決焦點問題。 您可以在此處查看示例,了解如何使用簡單的鍵綁定。 此外,你應該像這樣從事件調度線程運行你的Swing應用程序
public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable(){ @Override public void run() { new MyApp(); } }); }
不要在paintComponent
方法中使用while
。 你會遇到問題。 如果你想要重復繪制某些東西,比如動畫,你會想要使用javax.swing.Timer
。 你可以在這里看到一個例子,或者你可以找到任何數量的SO帖子,只是簡單地搜索如何使用Swing Timer。
此外,您的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.