You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Swing:如何在JFrame底部正常显示JLabel标签?

问题解决:JFrame底部标签不显示+绘图异常修复

核心问题

你重写了JFrame的paint方法但没调用super.paint(g),这直接跳过了Swing的组件绘制流程,导致底部的JLabel完全没机会被渲染出来。另外,直接在JFrame上绘图也不符合Swing的最佳实践,容易引发布局和显示问题。

修复方案

改用JPanel作为专门的绘图容器,重写它的paintComponent方法(必须调用super.paintComponent(g)),把绘图逻辑移到这里;同时保留JLabel的布局设置,这样标签就能正常显示在窗口底部,支持任意长度的文本。

修改后的完整代码

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Peintre extends JFrame implements MouseMotionListener {
    private int valeurX;
    private int valeurY;
    private DrawingPanel drawingPanel;

    public Peintre() {
        super("Programme simple de dessin");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        // 底部标签设置,现在能正常显示
        JLabel label = new JLabel("Tirer sur la souris pour dessiner");
        label.setForeground(Color.PINK);
        label.setFont(new Font("Arial", Font.PLAIN, 20));
        add(label, BorderLayout.SOUTH);
        
        // 自定义绘图面板,负责绘制椭圆
        drawingPanel = new DrawingPanel();
        drawingPanel.addMouseMotionListener(this);
        add(drawingPanel, BorderLayout.CENTER);
        
        setSize(700, 500);
        setVisible(true);
    }

    // 专用绘图面板,遵循Swing绘图规范
    private class DrawingPanel extends JPanel {
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g); // 必须调用,保证面板背景和组件正常渲染
            g.fillOval(valeurX, valeurY, 15, 15);
        }
    }
    
    @Override
    public void mouseDragged(MouseEvent e) {
        valeurX = e.getX();
        valeurY = e.getY();
        drawingPanel.repaint(); // 只重绘绘图区域,性能更好
    }

    @Override
    public void mouseMoved(MouseEvent e) {}

    public static void main(String[] args) {
        new Peintre();
    }
}

关键修改点

  • 绘图容器分离:用JPanel做绘图区域,避免直接操作JFrame的绘制流程,这是Swing绘图的标准做法。
  • 调用父类绘制方法:paintComponent中必须调用super.paintComponent(g),否则面板背景和子组件都无法正常显示。
  • 鼠标监听绑定到绘图面板:获取的坐标是相对于绘图区域的,不会受窗口边框、标签等元素影响,更准确。
  • 局部重绘:只重绘绘图面板而非整个窗口,提升程序运行效率。

内容的提问来源于stack exchange,提问作者Cisco_dev_sn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 18:40:59