调用 Paint mehtod 时 JLabel 不显示

问题描述

这是我年终项目的一小部分,我正在尝试在 JFrame 中添加带有 JLabel 的直线。如果我删除 JLabel,则该行将显示,否则不会显示。我只知道 java swing,因此我对 java 图形没有任何经验。

提前致谢:)

import java.awt.EventQueue;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;

public class Draw extends JFrame {

    private JPanel contentPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokelater(new Runnable() {
            public void run() {
                try {
                    Draw frame = new Draw();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printstacktrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Draw() {
        setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100,100,569,461);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5,5,5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        
        JLabel lbl = new JLabel("Show ");
        lbl.setBounds(263,90,49,14);
        contentPane.add(lbl);
    }
    
    @Override
    public void paint(Graphics g) {
        g.drawLine(100,0);
        g.drawArc(200,200,120,180);
    }
}

解决方法

正如评论中已经说过的,不要覆盖 #paint(Graphics g)JFrame 方法。而是覆盖 #paintComponent(Graphics g)contentPane 方法。

contentPane = new JPanel() {
    @Override
    protected void paintComponent(Graphics g) {
        //Don't forget to call the super method
        super.paintComponent(Graphics g);
        //Draw the line
        g.drawLine(100,100,0);  //Maybe adapt the line's position
    }
};

不知道有没有必要打电话给:

super.paintComponent(Graphics g);

也许这也是由 #paintChildren(Graphics g); 类的 Component 完成的。