我现在对编程有点陌生,正在尝试用 java 制作 Pong。但是我无法显示任何图形。
主类
public class Pong1 {
public static Frame frame = new Frame();
public static Panel panel = new Panel();
public static void main(String[] args) {
initUI();
}
public static void initUI(){
frame.setLayout(new BorderLayout());
frame.add(BorderLayout.CENTER, panel);
frame.pack();
frame.setVisible(true);
}
public static int getPanelWidth(){
return panel.getWidth();
}
public static int getPanelHeight(){
return panel.getHeight();
}
}
JFrame 类
package pong1;
import java.awt.Dimension;
import javax.swing.JFrame;
public class Frame extends JFrame{
Frame(){
setTitle("Pong");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(true);
setMinimumSize(new Dimension(800,500));
setLocationRelativeTo(null);
}
}
在最后一个类中是 JPanel 类,我在其中重写并调用paintComponent。然而,什么也没有出现。
public class Panel extends JPanel{
Panel(){
setPreferredSize(new Dimension(800,500));
setMinimumSize(new Dimension(800,500));
}
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.blue);
g2.fillOval(100,100,100,100);
}
我查看了数十篇其他帖子,尝试了许多不同的方法,但什么也没有出现。有谁知道这是怎么回事吗?
最佳答案
我运行了您发布的代码,它似乎工作得很好,但是,对 static
的依赖非常令人担忧,并且可能会导致一些非常有趣的问题,最好避免它。
此外,您应该确保您的 UI 是在事件调度线程的上下文中创建的,以减少可能导致更多问题的线程冲突问题。
最后,您实际上并不需要扩展 JFrame
,您并没有真正向类添加任何值,您可以使用工厂或构建器模式以较低的复杂性实现相同的功能
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Pong1 {
public static void main(String[] args) {
new Pong1();
}
public Pong1() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Pong");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new Panel());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class Panel extends JPanel {
public Panel() {
}
@Override
public Dimension getPreferredSize() {
return new Dimension(800, 500);
}
@Override
public Dimension getMinimumSize() {
return getPreferredSize();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("...");
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.blue);
g2.fillOval(100, 100, 100, 100);
}
}
}
哦,您确实应该避免使用 setPreferred/Minimum/MaximumSize
,请参阅 Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?有关该主题的更多讨论
关于java - 为什么Java Graphics不画画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30880708/