Сбросить / удалить границу в Swing - PullRequest
1 голос
/ 07 апреля 2009

Вот очень специфический вопрос кодирования:

Недавно меня попросили сохранить старый работающий код графического интерфейса Java Swing на работе, и я столкнулся с этой проблемой:

Я прикрепил свой собственный подкласс InputVerifier под названием MyFilenameVerifier к JTextField (но для этих целей он также может быть любым JComponent). Я переопределил метод verify () так, что он вызывает super.verify(input) (где input - это параметр JComponent для verify ()). Если super.verify(input) возвращается false, я делаю:

input.setBorder(BorderFactory.createLineBorder(Color.RED));

Это соглашение, используемое во всем пользовательском интерфейсе этого приложения, которое началось задолго до меня, поэтому у меня нет большого выбора, кроме как использовать другие способы привлечь внимание пользователей (жаль, что я не сделал). Так оно и работает.

Проблема в том, что, как только пользователь возвращается и вводит что-то допустимое в текстовое поле, мне нужен способ установить его обратно на границу по умолчанию (вместо того, чтобы просто сказать, установить его в Color.GRAY или что-то другое, что другого цвета от своей первоначальной границы). Другими словами, мне нужен способ сказать: «Удалите лишнее украшение и вернитесь к нормальному состоянию» или просто установите границу по умолчанию.

Ответы [ 7 ]

5 голосов
/ 07 апреля 2009

Не могли бы вы просто позвонить input.getBorder() и кэшировать его где-нибудь перед установкой границы красного цвета?

5 голосов
/ 07 апреля 2009

Или, не кэшируя что-либо, вы можете указать JComponent обновить его пользовательский интерфейс обратно к настройкам внешнего вида и настроек через component.updateUI. Это должно привести к тому, что компонент сбросит свои цвета, границы, шрифты и т. Д., Чтобы они соответствовали исходным настройкам.

3 голосов
/ 07 апреля 2009

input.getBorder()

Разве не было бы замечательно, если бы никто никогда не видел это, и я ушел на свободу без ударов задом, которых я заслуживаю задавать этот вопрос?

1 голос
/ 07 апреля 2009

Другая возможность, если вам нужно только несколько входных виджетов, это создать подкласс, например, JTextField, добавьте setBorderOverride () и измените getBorder (), чтобы он возвращал «overriddingBorder», если он не нулевой.

Затем вы просто используете setBorderOverride (redBorder), чтобы сделать его красным, и setBorderOverride (null), чтобы очистить его.

Это, конечно, зависит от того, как рисовать для использования getBorder (), что он может делать или не делать, а может зависеть от реализации.

1 голос
/ 07 апреля 2009

Вам нужно сохранить существующую границу при ее изменении.

Один из способов сделать это - использовать методы putClientProperty () и getClientProperty (), которые вы найдете документированными в API.

1 голос
/ 07 апреля 2009

Не знаю, как строится ваша система, но я думаю, что вы можете сохранить исходную границу перед ее изменением. Таким образом, вы можете изменить его позже

// assuming the Border was not null before
if (!super.verify(input)) {
    original = input.getBorder();
    input.setBorder(...);
} else {
    if (original != null) {
        input.setBorder(original);
        original = null;  // not needed
    }
}
0 голосов
/ 07 апреля 2009

Кстати, вам нужна только одна статическая ссылка на границу - это один и тот же экземпляр границы, используемый всеми JTextFields.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...