Java 使JTextField背景透明

Java 使JTextField背景透明,java,swing,jtextfield,Java,Swing,Jtextfield,我试图使JTextField的背景透明,这样它下面的JLabel仍然可见,但是每当在JTextField中输入文本时,您都可以看到文本。这是我现在的基本情况 在下图中,JTextField背景设置为黑色。 理论上,如果JTextField的背景是透明的,它应该是这样的。 所以,我的问题是如何使JTextField的背景透明 此示例使用的是简单的setOpaque(false)。标签文本始终可见。我用Java1.7和1.8测试了它。所以,如果它对你不起作用,你还做了什么来初始化你的框架 pub

我试图使JTextField的背景透明,这样它下面的JLabel仍然可见,但是每当在JTextField中输入文本时,您都可以看到文本。这是我现在的基本情况

在下图中,JTextField背景设置为黑色。

理论上,如果JTextField的背景是透明的,它应该是这样的。


所以,我的问题是如何使JTextField的背景透明

此示例使用的是简单的
setOpaque(false)
。标签文本始终可见。我用Java1.7和1.8测试了它。所以,如果它对你不起作用,你还做了什么来初始化你的框架

public class TextField extends javax.swing.JFrame {
    public TextField() {
        initComponents();
    }

    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jTextField1 = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        getContentPane().setLayout(null);

        jLabel1.setText("Test");
        getContentPane().add(jLabel1);
        jLabel1.setBounds(60, 40, 70, 14);

        jTextField1.setText("jTextField1");
        jTextField1.setOpaque(false);
        getContentPane().add(jTextField1);
        jTextField1.setBounds(50, 30, 90, 40);

        pack();
    }// </editor-fold>                        

    public static void main(String args[]) {
        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TextField().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JLabel jLabel1;
    private javax.swing.JTextField jTextField1;
    // End of variables declaration                   
}
public class TextField扩展了javax.swing.JFrame{
公共文本字段(){
初始化组件();
}
//                           
私有组件(){
jLabel1=newjavax.swing.JLabel();
jTextField1=newjavax.swing.JTextField();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
getContentPane().setLayout(null);
jLabel1.setText(“测试”);
getContentPane().add(jLabel1);
jLabel1.立根(60,40,70,14);
jTextField1.setText(“jTextField1”);
jTextField1.setOpaque(false);
getContentPane().add(jTextField1);
jTextField1.立根(50,30,90,40);
包装();
}//                         
公共静态void main(字符串参数[]){
/*创建并显示表单*/
invokeLater(new Runnable()){
公开募捐{
new TextField().setVisible(true);
}
});
}
//变量声明-不修改
私有javax.swing.JLabel jLabel1;
私有javax.swing.JTextField jTextField1;
//变量结束声明
}

将“外观和感觉”设置更改为“金属”或“窗户” 如果您已经将其设置为透明,它将工作
Nimbus laf使textareas背景在程序运行时立即可见。看起来Nimbus在JTextField、JTextArea等中不支持透明背景。这里的代码不是使背景透明,而是使组件设置其背景颜色以匹配其父级背景:

private static final HierarchyListener _hl = new HierarchyListener() {

    @Override
    public void hierarchyChanged(HierarchyEvent e) {
        Component c = e.getComponent();
        for (Component p = c; p != null; p = p.getParent()) {
            if (p.isOpaque()) {
                int bk = p.getBackground().getRGB();
                c.setBackground(new Color(bk));
                break;
            }
        }

    }
};

public static void makeComponentCopyParentBackground(Component c) {
    c.removeHierarchyListener(_hl); // Guard against client calling multiple times.
    c.addHierarchyListener(_hl);
}

您是否使用了.setOpaque(false)?是的,我确保将其设置为false.setColor(新颜色(0,0,0,0));这不是一个有效的颜色标识符。@Noob这是一个非常危险的建议,因为绘制引擎不知道当顶层组件发生更改时,它需要通知下面的组件进行自我更新,从而导致重新绘制问题和瑕疵。我发现了这一点,在初始化框架时它做到了这一点。。setLookAndFeel(info.getClassName());为什么没有挫折?我没有使用任何布局管理器。为什么不这样放置我的组件呢?它也适用于JTextArea,只有一行
textArea.setOpaque(false)Mac OS X laf也支持透明背景。光环似乎是个问题。