如何拥有透明的 JTextField?

How to have a transparent JTextField?

这是我第一次 post 在这里,如果这不是正确的提问方式,我深表歉意。我想要改进的建议。

关于这个问题,我看到了一个关于透明 Jtextfield 的 youtube 视频 (https://www.youtube.com/watch?v=2Ruc5rkDg1E),但是相同的代码没有给出相同的输出。

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

    public class TextField3 {
       public TextField3() {
          ImageIcon icon = new ImageIcon("pic1.jpg");
          //JLabel l1 = new JLabel();
          //l1.setBounds(0, 0, 900, 500);
          //l1.setIcon(icon);

          Color back = new Color(0, 0, 0, 80);
          Color fore = new Color(255, 255, 255);
          Font font = new Font("Times New Roman", Font.BOLD, 24);

          JFrame f1 = new JFrame("My First TextField");
          f1.setBounds(150, 50, 900, 500);
          //f1.setVisible(true);
          f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          f1.getContentPane().setLayout(null);

          JLabel l1 = new JLabel();
          l1.setBounds(0, 0, 900, 500);
          l1.setIcon(icon);

          JTextField tf = new JTextField("TextField");
          //tf.setOpaque(false);
          tf.setBounds(275, 150, 350, 60);
          tf.setVisible(true);
          tf.setHorizontalAlignment(JTextField.CENTER);

          tf.setBackground(back);
          tf.setForeground(fore);
          tf.setFont(font);

          f1.add(l1);
          f1.add(tf);
          f1.setVisible(true);
      }
      public static void main(String[] args) {
          TextField3 tf = new TextField3();
      }
    }

The output from the youtube video.

My output

上面的代码与视频的代码不完全相同。实际上视频中的代码生成了一个空白的 JFrame,然后我将代码的 JLabel 部分移到了 JFrame 的部分下面,然后它产生了第二张图片中的输出。

我搜索了这个问题,发现将 Opaque 设置为 false 可以解决这个问题。但是当我尝试它时,JTextField 完全消失,只显示背景图像。有人可以帮助解决这个问题吗?

您需要使用 setOpaque(false) 方法使您的 JTextField 透明。那应该可以。

Swing 旨在与布局管理器一起使用。您不应该使用空布局,也不应该使用 setBounds()。

Swing 是基于parent/child 关系设计的。如果您希望文本字段出现在标签的顶部,则不要将这两个组件都添加到框架中。相反,您需要这样的结构:

- frame
    - background label
        - text field

所以你的基本代码应该是这样的:

JTextField textField = new JTextField("text");
textField.setBackground(...);

JLabel background = new JLabel(...);
label.setlayout( new GridBagLayout() );
label.add(textField, new GridBagConstraints());

frame.add(label, BorderLayout.CENTER);

现在您将在标签的中央看到文本字段。

但是,文本字段的 semi-transparent 背景仍然存在问题,因为 Swing 无法正确处理 semi-transparency。有关更多信息和解决方案,请查看: