Swing JTextField如何去掉边框?

26

有没有办法在 JTextField 中去掉边框?

txt = new JTextField();
txt.setBorder(null);   // <-- this has no effect.

我希望它看起来像一个JLabel - 但我仍然需要它是一个JTextField,因为我希望人们能够突出显示它。


很有趣知道你使用的是什么系统/环境。或者还有更多的代码涉及...对我来说,它(再次)完美地工作。请查看此图像以获取一些结果(和代码):http://img709.imageshack.us/img709/9034/fields.jpg - user85421
7个回答

75

10
感谢您提到了 null 无法按预期工作的原因。 - Nils Schmidt
应该返回-1,因为它不起作用。可行的解决方案是建议覆盖setBorder以什么都不做。 - Markus V.
2
这可能取决于上下文,因为某些不明显的原因,可能有效或无效。但是,这是有用的信息,我不认为有任何理由对其进行贬低评价。 - Tom Hawtin - tackline
正如Tom所说,这可能取决于上下文。鉴于OP的上下文,这将非常出色地发挥作用。顺便说一句,谢谢Tom。 :) - Björn

23

根据你之前的一个问题的答案,你知道一些PL&F可能会覆盖边框。

显而易见的解决方案是覆盖PL&F正在调用的setBorder方法,并丢弃更改。

JTextField text = new JTextField() {
    @Override public void setBorder(Border border) {
        // No!
    }
};

@finnw:在括号里输入“null”。您不需要覆盖它。 - Ramses
@user3300710 在哪里输入 'null'?就像原问题中所述,setBorder(null) 是不可靠的(即当您自己测试时它可以工作,但在现场可能无法工作,或者在您转向其他事情后的某个随机时间停止工作)。 - Tom Hawtin - tackline
@finnw:好的,你是对的。我没有仔细阅读原始问题,抱歉。 - Ramses
1
嘲笑了“不!” - Mihai Fumarel

3

不,您不能去掉边框。特别是在AWT组件的显示上。它们使用本机部件集(在Java之外绘制)。

试着让这条线与您的背景相似...例如,如果您的背景是白色,则必须:

setBorder(BorderFactory.createLineBorder(Color.white));

然后将背景设置为白色:
setBackground(Color.white);

3

尝试将其设置为BorderFactory.createEmptyBorder(),而不是null。有时这样做可以"解决问题",因为将其设置为null实际上具有不同的含义。

如果这样做没有效果,那么可能是您正在使用的外观覆盖了某些内容。您是使用默认设置还是自定义设置?


3
根据我对Swing的经验,它的问题通常不限于一个,而是需要像剥洋葱一样逐层解决。如果没有看到你的整个代码,我就不知道这是否能完全解决问题。如果我要解决这个错误,这将是我尝试的第一件事。如果它没有奏效,我会尝试调查外观和感觉(如果你正在使用一些花哨的东西)是否会干扰。 - Uri

1
txt.setBorder(new LineBorder(Color.BLACK,0));

可能有效。

0

你可以简单地

textField.setBorder(null);

或者

textField.setBorder(new EmptyBorder(0, 0, 0, 0))


-1
唯一让它在所有情况下都可行的方法是以下设置:
setBorder (BorderFactory.createLineBorder (new Color (0, 0, 0, 0), 2));

否则(当父容器的背景为null时),您将会看到“I”光标永远停留在JTextField的左边缘。(只需进行不同边框厚度的一些测试,观察JTextField第一次激活时放置光标的相当奇怪的方式。)
或者您可以设置:
setBorder (BorderFactory.createLineBorder (getBackground (), 2));

但是你将在所有四个方向上以2个像素的大小获得视野范围更大的区域。如果您不指定边框厚度,您将看到光标在此边框和剩余区域之间永远存在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接