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

如何在JTextField内嵌入JButton并确保输入后按钮不消失?

解决JButton嵌入JTextField并保持可见的问题

要实现按钮嵌入文本框且始终可见,你需要调整组件层级和文本框内边距,具体修改如下:

核心修改点

  • 将按钮添加到JTextField内部(而非contentPane),利用JTextField作为容器的特性
  • 调整文本框右侧内边距,避免输入文本被按钮遮挡
  • 修正按钮的坐标为相对于文本框的位置

修改后的完整代码

license = new JTextField();
license.addFocusListener(new FocusAdapter() {
    @Override
    public void focusLost(FocusEvent e) {
        String licenseField = license.getText();
        if(licenseField.isBlank() || licenseField.isEmpty()) {
            license.setText("Enter your license key");
            license.setForeground(Color.GRAY);
        }
    }
});
license.addMouseListener(new MouseAdapter() {
    @Override
    public void mousePressed(MouseEvent e) {
        String licenseField = license.getText();
        if(licenseField.equals("Enter your license key")) {
            license.setText("");
            license.setForeground(new Color(240, 185, 11));
        }
    }
});
license.addMouseMotionListener(new MouseMotionAdapter() {
    @Override
    public void mouseMoved(MouseEvent e) {
        license.setFocusable(true);
    }
});
license.setFocusable(false);
license.setBorder(null);
Border lineBorder = BorderFactory.createLineBorder(new Color(240, 185, 11), 1);
// 调整右侧内边距,给按钮留出足够空间(按钮宽度109 + 6px间距)
Border padding = BorderFactory.createEmptyBorder(0, 7, 0, 115);
license.setBorder(BorderFactory.createCompoundBorder(lineBorder, padding));
license.setText("Enter your license key");
license.setForeground(Color.GRAY);
license.setBackground(Color.BLACK);
license.setFont(new Font("Tahoma", Font.PLAIN, 12));
license.setBounds(115, 248, 370, 60);
contentPane.add(license);
license.setColumns(10);

JButton connect = new JButton("Connect");
connect.setFocusPainted(false);
connect.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
connect.setBorder(null);
connect.setFont(new Font("SansSerif", Font.BOLD, 12));
connect.setForeground(Color.BLACK);
connect.setBackground(new Color(240, 185, 11));
// 调整按钮坐标为相对于文本框的位置(右侧对齐,上下居中)
connect.setBounds(256, 7, 109, 46);
// 将按钮添加到文本框内部,而非contentPane
license.add(connect);

关键说明

  1. 组件层级调整:把按钮添加到license(JTextField)中,这样按钮会作为文本框的子组件,随文本框移动且始终显示在其内部
  2. 内边距设置:右侧内边设为115px,确保输入的文本不会延伸到按钮区域
  3. 按钮位置:通过setBounds(256,7,109,46)让按钮在文本框内右侧对齐,上下留出7px间距保持居中
  4. 可见性保障:按钮作为文本框的子组件,不会因文本框的焦点状态或内容变化而消失,始终保持可见

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 09:41:04