我有以下类(面板类)和一个主类(Main类),显示在面板类下面。代码假设显示paintComponent
方法内的文本。虽然框架打开,显示我提供的标题,但它不显示paintComponent
的字符串。我在Java网站上的教程之后编写了代码,我不知道为什么它不起作用。
panel
package com.learn.java;
import javax.swing.*;
import java.awt.*;
class panel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponents(g);
g.drawString("From Paint Component Method ", 10, 20);
}
}
Main
package com.learn.java;
import javax.swing.*;
import java.awt.*;
public class Main {
public static void main(String[] args) {
JFrame Frame = new JFrame("The big Title");
Frame.setLayout(new FlowLayout());
Frame.setSize(850, 800);
Frame.setVisible(true);
Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Frame.add(new panel());
}
}
答案 0 :(得分:1)
代码存在许多问题,评论中建议的解决方案是次优的。
首先,自定义绘制组件中的绘制链断开。重写方法需要调用super方法,而是调用'复数'版本。要修复它,请更改:
super.paintComponents(g);
要:
super.paintComponent(g);
现在解决上述问题。摆脱FlowLayout
隐藏了问题,因为虽然流布局考虑了组件的首选大小(并且没有拉伸它们),但JFrame
(BorderLayout
)的默认布局确实将组件拉伸到填补可用空间。
正确的方法是让自定义绘制的组件覆盖getPreferredSize()
方法。然后它将在流程布局中按预期显示。
完成后,请删除:
Frame.setSize(850, 800);
因为这只是猜测..然后移动..
Frame.setVisible(true);
到最后一个声明,紧接在它之前,放上..
Frame.pack(); // make the GUI the correct size
进一步的提示:请学习常见的Java命名法(命名约定 - 例如EachWordUpperCaseClass
,firstWordLowerCaseMethod()
,firstWordLowerCaseAttribute
,除非它是UPPER_CASE_CONSTANT
)并一致地使用它。 / p>