【问题标题】:Transparency for JTextField not workingJTextField 的透明度不起作用
【发布时间】:2013-12-17 12:24:42
【问题描述】:

我正在登录服务器,当我将不透明设置为 false 时,我的 JTextFields 不透明。

我的代码:

//username  
    JTextField jUsername = new JTextField(10);  
    jUsername.setBounds(520, 284, 190, 25);  
    jUsername.setOpaque(false);  
    jUsername.setBorder(null);  
    getContentPane().add(jUsername);  

    //password  
    JTextField jPassword = new JTextField(15);  
    jPassword.setBounds(520, 374, 190, 25);  
    jPassword.setOpaque(false);  
    jPassword.setBorder(null); 
    //jPassword.setBackground(new Color(Color.TRANSLUCENT));
    getContentPane().add(jPassword);

一张仍在发生的图片:

任何人以前见过或知道如何解决它?我环顾四周,但没有人遇到与我相同的问题,并且他们的修复对我不起作用。 (我知道我没有使用JPasswordField 作为密码,这是临时的)

【问题讨论】:

  • 尝试将文本字段的背景色也设置为透明色,例如jUsername.setBackground(new Color(0, 0, 0, 0)),如您的previous question 所示。如果您喜欢半透明背景,请使用不同的 alpha 值,例如 new Color(255, 255, 255, 128) 将是 50% 透明...
  • 请填写答案,以便我可以^

标签: java swing opacity jtextfield


【解决方案1】:

基本上,文本字段的 UI 代理不仅绘制文本,还绘制字段区域(在边框内),而不管 opaque 设置如何。

您可以将背景颜色设置为透明值,例如new Color(0, 0, 0, 0),它是完全透明的。

例如...

JTextField jUsername = new JTextField(10);  
jUsername.setBounds(520, 284, 190, 25);  
jUsername.setBackground(new Color(0, 0, 0, 0));
jUsername.setOpaque(false);  
jUsername.setBorder(null);  
getContentPane().add(jUsername);  

//password  
JTextField jPassword = new JTextField(15);  
jPassword.setBounds(520, 374, 190, 25);  
jPassword.setBackground(new Color(0, 0, 0, 0));
jPassword.setOpaque(false);  
jPassword.setBorder(null); 
//jPassword.setBackground(new Color(Color.TRANSLUCENT));
getContentPane().add(jPassword);

您可以通过更改最后一个参数来影响颜色的透明度,例如new Color(255, 255, 255, 128) 将是白色,50% 透明...

您可能还希望更改插入符号的颜色,请查看JTextComponent#setCaretColor 了解更多详情

【讨论】:

  • setColor(...)?
  • @HovercraftFullOfEels 我年轻又愚蠢?
  • 使用here
  • @HovercraftFullOfEels 实际上,看它是试图绕过 ui 委托忽略不透明状态,但是我有时间时必须再做一次测试
  • 使用 .setBackground(...) 而不是 .setColor(...) 这很好用!
【解决方案2】:

不知道您尝试了什么,为了获得更好的帮助,请尽快发布SSCCE,简短。可运行,可使用 setBackground 而不是 Image 进行编译

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

public class LabelImageText extends JPanel {

    private static final long serialVersionUID = 1L;

    public LabelImageText() {
        JTextField jUsername = new JTextField(10);
        jUsername.setText("MyText");
        jUsername.setOpaque(false);
        //jUsername.setBorder(null);
        add(jUsername);
        JTextField jPassword = new JTextField(15);
        jPassword.setText("MyText");
        jPassword.setOpaque(false);
        //jPassword.setBorder(null);
        add(jPassword);
        setBackground(Color.RED);
    }

    private static void createAndShowUI() {
        JFrame frame = new JFrame("set Opaque");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new LabelImageText());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                createAndShowUI();
            }
        });
    }
}

【讨论】:

  • 这一定与不同的外观和感觉有关,因为在 Mac OS 下,这不起作用,我很确定在 Windows L&F 下也不起作用,没试过虽然;)
  • 有趣,不包括电池:-),真的不记得有什么问题,但是non_transparent selection in DefaultHighlighter会有问题...
  • +1, @MadProgrammer and I'm pretty sure under Windows L&F it doesn't either, - 非透明文本字段在使用 JDK7 的 Windows 上按预期工作。那就是您只需使用 textField.setOpaque(false) 并且父组件将显示出来。我很惊讶这在 Mac LAF 上不起作用。对我来说似乎有点错误。
  • @camickr 我可能是mac os使用的边框实现的问题
【解决方案3】:

我尝试了另一种选择,它对我有用。

您可以修改textfield 的属性Background。在选择框中选择选项自定义代码并将new Color(0, 0, 0, 0)粘贴到txtField.setBackground 属性中。

然后只需将边框属性更改为No border。最后取消选中opaque 复选框。

Here a capture of my netbeans interface

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 2023-04-03
    • 2012-12-22
    相关资源
    最近更新 更多