油漆组件图纸未出现在框架上

时间:2018-04-04 22:14:16

标签: java swing jpanel

我有以下类(面板类)和一个主类(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());
    }

}

1 个答案:

答案 0 :(得分:1)

代码存在许多问题,评论中建议的解决方案是次优的。

首先,自定义绘制组件中的绘制链断开。重写方法需要调用super方法,而是调用'复数'版本。要修复它,请更改:

super.paintComponents(g);

要:

super.paintComponent(g);

现在解决上述问题。摆脱FlowLayout隐藏了问题,因为虽然流布局考虑了组件的首选大小(并且没有拉伸它们),但JFrameBorderLayout)的默认布局确实将组件拉伸到填补可用空间。

正确的方法是让自定义绘制的组件覆盖getPreferredSize()方法。然后它将在流程布局中按预期显示。

完成后,请删除:

Frame.setSize(850, 800);

因为这只是猜测..然后移动..

Frame.setVisible(true);

到最后一个声明,紧接在它之前,放上..

Frame.pack(); // make the GUI the correct size

进一步的提示:请学习常见的Java命名法(命名约定 - 例如EachWordUpperCaseClassfirstWordLowerCaseMethod()firstWordLowerCaseAttribute,除非它是UPPER_CASE_CONSTANT)并一致地使用它。 / p>