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

BoxLayout中使用JTextField出现组件错位、输入时重复绘制问题如何解决?

问题原因

  1. 代码存在笔误:f.getContentPanel() 是无效方法名,正确调用应为 f.getContentPane()
  2. 半透明背景与组件不透明标识冲突:你给组件设置了带alpha通道的半透明背景,同时调用了setOpaque(true)。Swing中opaque属性为true时,会默认组件完全覆盖底层区域,不需要重绘下方内容,最终导致重绘时没有清理之前的绘制痕迹,出现文字重叠、组件显示拆分的异常。
  3. 不符合Swing线程规范:Swing组件必须在事件调度线程(EDT)中初始化,直接在main线程中初始化组件可能出现偶发渲染异常。

修复方案

如果需要保留半透明效果,可通过重写组件的paintComponent方法手动绘制半透明背景,同时设置opaque为false即可:

import javax.swing.*;
import java.awt.*;

public class TestBoxLayout {
    public static void main(String[] args) {
        // 组件初始化放到事件调度线程执行
        SwingUtilities.invokeLater(() -> {
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(new Dimension(900,500));
            // 修正方法名笔误
            f.getContentPane().setBackground(Color.BLACK);
            f.setLayout(new BoxLayout(f.getContentPane(), BoxLayout.PAGE_AXIS));

            // 自定义支持半透明的JLabel
            JLabel boxOne = new JLabel() {
                @Override
                protected void paintComponent(Graphics g) {
                    g.setColor(new Color(33,255,240,75));
                    g.fillRect(0, 0, getWidth(), getHeight());
                    super.paintComponent(g);
                }
            };
            boxOne.setOpaque(false);
            boxOne.setMinimumSize(new Dimension(900,50));
            boxOne.setMaximumSize(new Dimension(900,50));
            boxOne.setPreferredSize(new Dimension(900,50));
            boxOne.setForeground(Color.WHITE);
            boxOne.setText("This is the first box.");

            // 自定义支持半透明的JTextField
            JTextField boxTwo = new JTextField() {
                @Override
                protected void paintComponent(Graphics g) {
                    g.setColor(new Color(33,255,240,75));
                    g.fillRect(0, 0, getWidth(), getHeight());
                    super.paintComponent(g);
                }
            };
            boxTwo.setOpaque(false);
            boxTwo.setMinimumSize(new Dimension(900,50));
            boxTwo.setMaximumSize(new Dimension(900,50));
            boxTwo.setPreferredSize(new Dimension(900,50));
            boxTwo.setForeground(Color.WHITE);

            f.add(boxOne);
            f.add(boxTwo);
            f.setVisible(true);
        });
    }
}

如果你不需要半透明效果,直接将背景色的alpha值设置为255(完全不透明),不需要重写绘制方法也能解决问题:

// 示例:不透明背景配置
boxOne.setBackground(new Color(33,255,240));
boxOne.setOpaque(true);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:27:04