Java 如何拥有一个透明的JTextField?

Java 如何拥有一个透明的JTextField?,java,swing,jtextfield,transparent,Java,Swing,Jtextfield,Transparent,这是我在这里的第一篇帖子,如果这样问不对,我很抱歉。我想提出改进建议 说到这个问题,我看到了一个关于透明Jtextfield的youtube视频(),但是相同的代码没有给出相同的输出 import javax.swing.*; import java.awt.*; public class TextField3 { public TextField3() { ImageIcon icon = new ImageIcon("pi

这是我在这里的第一篇帖子,如果这样问不对,我很抱歉。我想提出改进建议

说到这个问题,我看到了一个关于透明Jtextfield的youtube视频(),但是相同的代码没有给出相同的输出

    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();
      }
    }

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


我搜索了这个问题,发现set不透明为false可以解决这个问题。但当我尝试时,JTextField完全消失,只显示背景图像。有人能帮助解决这个问题吗?

您需要使用
setOpaque(false)
方法使JTextField透明。这应该行得通。

Swing设计用于布局管理器。您不应该使用空布局,也不应该使用setBounds()

Swing是基于父/子关系设计的。如果希望文本字段显示在标签顶部,则不要将两个组件都添加到框架中。相反,您需要一个如下结构:

- 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);
现在,您将看到标签中心的文本字段


但是,文本字段的半透明背景仍然存在问题,因为Swing不能正确处理半透明。有关更多信息和解决方案,请查看:

我已经尝试过,正如您在代码中看到的,它已被注释掉。当我添加该行时,JTextField完全消失,只显示背景图像。但问题是,当我添加setOpaque(false)时,textfield和文本也不显示。代码的结构完全错误。您没有遵循Swing设计原则。我已经在回答中更详细地解释了问题。谢谢你的帮助,我现在明白了。你能链接一些资源来正确学习swing吗?@MayankGoyal,很高兴它能帮上忙。先从这个开始。它涵盖了许多Swing基础知识,每个部分都有要下载和测试的演示代码?你可能想用JPanel。@weisj,不,我是想用JLabel。这是一种以实际大小显示图像并在顶部显示组件的简单方法,无需进行任何自定义绘制。查看此方法的局限性。