Качаем JTextField как убрать границу?

Есть ли способ удалить границу в JTextField?

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

Я бы очень хотел, чтобы он выглядел как JLabel, но мне все равно нужно, чтобы он был JTextField, потому что я хочу, чтобы люди могли его выделить.


person Markus V.    schedule 17.02.2010    source источник
comment
было бы интересно узнать, какую систему/среду вы используете. Или есть еще код... Он (опять же) отлично работает для меня. Посмотрите это изображение с некоторыми результатами (и кодом): img709.imageshack.us/img709/9034 /fields.jpg   -  person user85421    schedule 17.02.2010


Ответы (7)


Из ответа на ваш предыдущий вопрос вы знаете, что некоторые PL&F могут загромождать границу.

Поэтому очевидное решение состоит в том, чтобы переопределить метод setBorder, который вызывает PL&F, и отменить изменение.

JTextField text = new JTextField() {
    @Override public void setBorder(Border border) {
        // No!
    }
};
person Tom Hawtin - tackline    schedule 17.02.2010
comment
@finnw: введите «null» в скобках. Вам не нужно переопределять его. - person Ramses; 29.04.2014
comment
@user3300710 user3300710 Введите «null», где? Как и в исходном вопросе, setBorder(null) ненадежен (т. е. когда вы проверяете его самостоятельно, он работает, но может не работать в полевых условиях или случайным образом через некоторое время после того, как вы перешли к другим вещам). - person Tom Hawtin - tackline; 29.04.2014
comment
@finnw: хорошо, ты прав. Я не внимательно прочитал исходный вопрос, извините. - person Ramses; 29.04.2014
comment
Lolled в нет! - person Mihai Fumarel; 05.06.2020

JTextField textField = new JTextField();
textField.setBorder(javax.swing.BorderFactory.createEmptyBorder());

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

Устанавливая для границы значение «null», вы на самом деле указываете внешнему виду использовать собственный стиль границы (операционной системы), если он есть.

person Björn    schedule 17.02.2010
comment
+1 за упоминание причины, ПОЧЕМУ null не работает должным образом - person Nils Schmidt; 17.02.2010
comment
должно быть -1. потому что это не работает. решение, которое работает, - это предложенное, которое говорит: переопределить setBorder, чтобы ничего не делать - person Markus V.; 17.02.2010
comment
Это может работать или не работать в зависимости от контекста по неочевидным причинам. stackoverflow .com/questions/2281539/ Однако это хорошая информация, и я не вижу причин для ее понижения. - person Tom Hawtin - tackline; 17.02.2010
comment
Как говорит Том, это может работать в зависимости от контекста. Учитывая контекст из ОП, это сработало бы великолепно. Спасибо, Том, кстати. :) - person Björn; 17.02.2010

Попробуйте установить значение BorderFactory.createEmptyBorder() вместо null. Иногда это «срабатывает», потому что установка значения null на самом деле имеет другое значение.

Если это не работает, возможно, внешний вид, который вы используете, имеет приоритет над чем-то. Вы используете по умолчанию или что-то нестандартное?

person Uri    schedule 17.02.2010
comment
@Markus, по моему опыту работы со Swing, проблемы с ним часто не ограничиваются одной проблемой, а скорее должны быть очищены, как луковица. не видя весь ваш код, я не знаю, решит ли это проблему полностью. Если бы я имел дело с ошибкой, это было бы первое, что я бы попробовал. Если бы это не сработало, я бы попытался выяснить, мешает ли внешний вид (если вы используете что-то необычное). - person Uri; 17.02.2010

Нет, вы не можете удалить границу. Особенно над отображением компонентов AWT. Они используют собственный набор виджетов (отрисовываются вне Java).

Попробуйте сделать линию, похожую на ваш фон... например, если ваш фон белый, вам нужно:

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

Затем установите фон на белый:

setBackground(Color.white);
person stuklist    schedule 25.08.2011

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

может работать.

person gerardw    schedule 03.02.2013

Вы можете просто

textField.setBorder(null);

or

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

person Divin Irakiza    schedule 02.06.2021

Единственный способ заставить его работать во ВСЕХ обстоятельствах - это следующая настройка:

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

в противном случае (когда у вас есть нулевой фон родительского контейнера) вы увидите, что курсор «I» навсегда останется на левом краю вашего JTextField. (Просто сделайте несколько тестов для различной толщины границы и наблюдайте довольно странный способ, которым JTextField помещает курсор, когда вы активируете его в первый раз.)

В качестве альтернативы вы можете установить:

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

но вы получите поле оптически больше на 2 пикселя во всех четырех направлениях. Если вы не укажете толщину границы, вы увидите курсор МЕЖДУ этой границей и полем, остающимся навсегда.

person Tomek    schedule 10.03.2012