【问题标题】:Making a JTextField background transparent使 JTextField 背景透明
【发布时间】:2014-05-07 04:05:09
【问题描述】:

我正在尝试使 JTextField 的背景透明,这样它下面的 JLabel 仍然可见,但是每当在 JTextField 中输入文本时,您都可以看到文本。这就是我现在所拥有的。

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

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

那么,我的问题是如何使 JTextField 的背景透明?

【问题讨论】:

  • 你使用了.setOpaque(false); ?
  • 是的,我确保将其设置为 false
  • 试试 .setColor(new Color(0, 0, 0, 0));
  • 这不是一个有效的颜色标识符。
  • @Noob 这是一个非常危险的建议,因为绘图引擎不知道它需要通知下面的组件以在顶级组件更改时自行更新,从而导致重绘问题和工件。

标签: java swing jtextfield


【解决方案1】:

这个例子简单地使用了setOpaque(false)。标签文本始终可见。我用 Java 1.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                   
}

【讨论】:

  • 我想通了,在初始化框架时它这样做了.. javax.swing.UIManager.setLookAndFeel(info.getClassName());
  • 为什么没有 setBounds?我没有使用任何布局管理器。为什么不这样放置我的组件?
  • 它也适用于 JTextArea 仅一行 textArea.setOpaque(false);
【解决方案2】:

将外观设置更改为金属或窗户 如果您已经将其设置为透明,它将起作用 Nimbus laf 在程序运行后立即显示 textareas 背景

【讨论】:

  • Mac OS X laf 也支持透明背景。 Nimbus 似乎是个问题。
【解决方案3】:

看起来 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-08
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    相关资源
    最近更新 更多