所以,我一直在学习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);
}
}
}
答案 0 :(得分:2)
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
来解决焦点问题。您可以看到有关如何使用简单键绑定的示例Here。此外,您应该从事件发送线程运行您的Swing应用
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
new MyApp();
}
});
}
请勿在{{1}}方法中使用while
。你会遇到问题。如果你想要重复绘制某些东西,比如动画,你会想要使用paintComponent
。你可以看到一个例子here或任何数量的SO帖子你只能简单地搜索如何使用Swing Timer。
此外,您的javax.swing.Timer
课程已经是App
次级。无需在构造函数中创建另一个JFrame
。只需添加组件,就像这样
JFrame