我最近一直在研究一个Java小程序。它本来是一个小程序,但从那以后我决定通过Java开发一个应用程序。我正在尝试更改我的代码以便能够将程序作为应用程序运行。我的第一个问题是:这是一个坏主意吗?从头开始更好吗?
我的下一个问题涉及在窗户上绘画。如果尝试将我的小程序更改为应用程序是一个好主意,我想知道谁来解决我在图形方面遇到的这个问题。这是我的主要问题。我目前正在使用"paintComponent"方法来绘制一个简单的字符串。我这样做是一种测试,以确保它正常工作。我从我创建的名为 graphicsPanel 的 JPanel 调用"paintComponent"方法。我还让它打印出一个字符串来通知我该方法已被调用。我的问题是,我无法显示这些迹象。我已经对这个常见问题进行了一些搜索,但是我已经尝试了建议的解决方案,但没有进展。请让我知道我能做什么。
~雷恩
主类:(它比ApplicationGame属于一个单独的类)
public class Application { // Rename to a better name later
public static void main(String args[]) {
ApplicationGame app = new ApplicationGame();
app.runGame(); // Method that contains the init of the JFrame and the declaration of the graphicsPanel
app.setVisible(true);
}
}
我的班级声明(框架):
public class ApplicationGame extends JFrame
private static final long serialVersionUID = 1L;
更多帧定义:
setSize(600,600); // All in the ApplicationGame class
setDefaultCloseOperation(EXIT_ON_CLOSE);
setTitle("Game - ALPHA 0.0.4"); // Rename
我的图形面板代码:
JPanel graphicsPanel;
graphicsPanel = new JPanel(new BorderLayout()) {
private static final long serialVersionUID = 1L; // Suggested by Eclipse to insert this line
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("Working...", 50, 50);
System.out.println("Painted onto the panel");
}
};
graphicsPanel.setBounds(0, 0, getWidth(), getHeight());
graphicsPanel.setPreferredSize(new Dimension(200, 200));
add(graphicsPanel, BorderLayout.CENTER); // In the class ApplicationGame (class extends JFrame)
还没有解决我的问题:
摆动 - 绘制未调用组件方法
为什么 paint()/paintComponent() 从未被调用?
为了防止出现细微问题,应确保在使用 Swing 组件之前从主线程迁移到事件调度线程,方法是从 main 调用 SwingUtilities.invokeLater
。但是,这可能不是此问题的原因。
您使用paintComponent
的方式没有错。它是自动调用的。此演示显示了一个正确显示graphicsPanel
的框架:
public class ApplicationGame extends JFrame {
ApplicationGame() {
JPanel graphicsPanel = new JPanel(new BorderLayout()) {
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("Working...", 50, 50);
System.out.println("Painted onto the panel");
}
};
graphicsPanel.setPreferredSize(new Dimension(200, 200));
add(graphicsPanel, BorderLayout.CENTER);
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(ApplicationGame::new);
}
}
在设置和显示框架的代码中的某个位置,您一定缺少一个步骤,但您尚未显示所有必要的代码。