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

К сожалению, для split требуется совпадение с нулевой шириной, но оно еще не исправлено, так как довольно много неправильного кода зависит от текущего поведения, используя, например, [something]*, как регулярное выражение. Использование таких шаблонов теперь будет генерировать FutureWarning, а те, которые никогда не могут разбить что-либо, выкиньте ValueError из Python 3.5 и далее:

>>> re.split(r'(?<!foo)(?=bar)', 'foobarbarbazbar')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/re.py", line 212, in split
    return _compile(pattern, flags).split(string, maxsplit)
ValueError: split() requires a non-empty pattern match.

Идея в том, что после определенного периода предупреждений поведение может быть изменено так, чтобы ваше регулярное выражение снова работало.


Если вы не можете использовать модуль regex, вы можете написать свою собственную функцию разделения используя re.finditer():

def megasplit(pattern, string):
    splits = list((m.start(), m.end()) for m in re.finditer(pattern, string))
    starts = [0] + [i[1] for i in splits]
    ends = [i[0] for i in splits] + [len(string)]
    return [string[start:end] for start, end in zip(starts, ends)]

print(megasplit(r'(?<!foo)(?=bar)', 'foobarbarbazbar'))
print(megasplit(r'o', 'foobarbarbazbar'))

Если вы уверены, что совпадения имеют только нулевую ширину, вы можете использовать начальные расщепления для более простого кода:

import re

def zerowidthsplit(pattern, string):
    splits = list(m.start() for m in re.finditer(pattern, string))
    starts = [0] + splits
    ends = splits + [ len(string) ]
    return [string[start:end] for start, end in zip(starts, ends)]

print(zerowidthsplit(r'(?<!foo)(?=bar)', 'foobarbarbazbar'))
20
задан Tom Hawtin - tackline 17 February 2010 в 18:35
поделиться

3 ответа

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

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

JTextField text = new JTextField() {
    @Override public void setBorder(Border border) {
        // No!
    }
};
17
ответ дан 29 November 2019 в 22:32
поделиться
JTextField textField = new JTextField();
textField.setBorder(javax.swing.BorderFactory.createEmptyBorder());

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

При установке границы на 'null', вы фактически говорите программе look & feel использовать родной стиль границы (операционной системы), если таковой имеется.

60
ответ дан 29 November 2019 в 22:32
поделиться

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

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

3
ответ дан 29 November 2019 в 22:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: