【问题标题】:Swing JTextField how to remove the border?Swing JTextField如何去掉边框?
【发布时间】:2011-01-17 22:11:27
【问题描述】:

无论如何要删除JTextField 中的边框吗?

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

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

【问题讨论】:

标签: java swing jtextfield


【解决方案1】:
JTextField textField = new JTextField();
textField.setBorder(javax.swing.BorderFactory.createEmptyBorder());

http://java.sun.com/javase/6/docs/api/javax/swing/BorderFactory.html

将边框设置为“null”时,实际上是在告诉外观使用(操作系统的)本机边框样式(如果有的话)。

【讨论】:

  • +1 提到为什么 null 不能按预期工作的原因
  • 应该是-1。因为它不起作用。可行的解决方案是建议说:覆盖 setBorder 什么都不做
  • 由于非显而易见的原因,这可能会或可能不会根据上下文起作用。 stackoverflow.com/questions/2281539/… 但是,这是很好的信息,我看不出有什么理由拒绝它。
  • 正如汤姆所说,这可能在上下文中起作用。鉴于 OP 的上下文,这将非常有效。谢谢汤姆,顺便说一句。 :)
【解决方案2】:

从您之前的@​​987654321@ 的回答中,您知道某些 PL&F 可能会破坏边界。

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

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

【讨论】:

  • @finnw:在括号中输入“null”。你不需要覆盖它。
  • @user3300710 在哪里输入'null'?与最初的问题一样,setBorder(null) 是不可靠的(即,当您自己测试它时,它可以工作,但可能无法在现场工作,或者在您继续其他事情之后的某个时间随机)。
  • @finnw:好吧,你说得对。我没有仔细阅读原始问题,对不起。
  • 懒洋洋地回答“不!”
【解决方案3】:

尝试将其设置为 BorderFactory.createEmptyBorder() 而不是空值。有时这会“起到作用”,因为将其设置为 null 实际上具有不同的含义。

如果这不起作用,则您使用的外观可能会覆盖某些内容。你是使用默认的还是自定义的?

【讨论】:

  • @Markus,根据我使用 Swing 的经验,它的问题通常不限于一个问题,而是必须像洋葱一样剥皮。没有看到你的整个代码,我不知道这是否能完全解决问题。如果我正在处理这个错误,这将是我会尝试的第一件事。如果它不起作用,我会尝试调查外观(如果您使用的是花哨的东西)是否有干扰。
【解决方案4】:

不,您不能删除边框。尤其是 AWT 组件的显示。他们使用本机小部件集(在 Java 之外绘制)。

尝试使线条与您的背景相似...例如,如果您的背景是白色,那么您必须:

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

然后将背景设置为白色:

setBackground(Color.white);

【讨论】:

    【解决方案5】:
    txt.setBorder(new LineBorder(Color.BLACK,0));
    

    可能会起作用。

    【讨论】:

      【解决方案6】:

      你可以简单

      textField.setBorder(null);

      或

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

      【讨论】:

        【解决方案7】:

        使其适用于所有情况的唯一方法是以下设置:

        setBorder (BorderFactory.createLineBorder (new Color (0, 0, 0, 0), 2));
        

        否则(当父容器的背景为空时)您将看到“I”光标永远保留在 JTextField 的左边缘。 (只需对不同的边框厚度进行一些测试,并观察 JTextField 在您第一次激活它时放置光标的非常奇怪的方式。)

        您也可以设置:

        setBorder (BorderFactory.createLineBorder (getBackground (), 2));
        

        但您会在所有四个方向上获得光学上大 2 个像素的场。如果您不指定边框粗细,您将看到光标在此边框和字段之间永久保留。

        【讨论】:

          猜你喜欢
          • 2019-11-28
          • 2012-09-09
          • 1970-01-01
          • 2011-01-24
          • 2014-08-05
          • 1970-01-01
          • 2020-11-01
          • 1970-01-01
          相关资源
          最近更新 更多