Прослушивание текстовых обрезков/показов JTextFieldJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Прослушивание текстовых обрезков/показов JTextField

Сообщение Anonymous »

Вот что хочет пользователь: если текст слишком длинный для текстового поля, установите его как всплывающую подсказку. В противном случае подсказки быть не должно.
Проблема: Swing не сообщает нам, обрезает ли он текст поля. Такого свойства нет, события не запускаются.
Для простоты забудьте о всплывающей подсказке. Просто заставьте отпечатки исчезнуть (см. MRE). По сути, мне нужно «слушать» обрезки/шоу.
Вот MRE. Измените размер окна, чтобы изменить ширину поля.
package demos.text.formattedTextField;

import javax.swing.JFormattedTextField;
import javax.swing.JPanel;
import javax.swing.text.DefaultFormatter;
import javax.swing.text.DefaultFormatterFactory;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.LayoutManager;
import java.text.ParseException;

public class FormattedTextFieldDemo {
public static void main(String[] args) {
Container mainPanel = createMainPanel();
JFrame frame = new JFrame("FormattableTextField Demo");
frame.setContentPane(mainPanel);
frame.setLocationRelativeTo(null);
frame.pack();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
}

private static JPanel createMainPanel() {
LayoutManager layout = new GridBagLayout();
JPanel panel = new JPanel(layout);
panel.add(createFormattedTextField(), constraints());
return panel;
}

private static GridBagConstraints constraints() {
GridBagConstraints constraints = new GridBagConstraints();
constraints.weightx = 1;
constraints.fill = GridBagConstraints.BOTH;
return constraints;
}

private static JFormattedTextField createFormattedTextField() {
JFormattedTextField textField = new JFormattedTextField();
DefaultFormatterFactory formatterFactory = new DefaultFormatterFactory();
formatterFactory.setDisplayFormatter(new DefaultFormatter() {
@Override
public String valueToString(Object value) throws ParseException {
return value instanceof Cat ? ((Cat) value).getName() : super.valueToString(value);
}
});
textField.setFormatterFactory(formatterFactory);
textField.setValue(createFormattedValue());
return textField;
}

private static Cat createFormattedValue() {
Cat cat = new Cat("mew".repeat(10));
return cat;
}

private static void onTextTrim() {
System.out.println("Text has been trimmed...");
}

private static void onTextShow() {
System.out.println("Text is now fully displayed...");
}

static class Cat {
private final String name;

public Cat(String name) {
this.name = name;
}

@Override
public String toString() {
return super.toString();
}

public String getName() {
return name;
}
}
}

Изображение
Изображение
Вот предложение GPT, которое работает, но в мой мнение, некрасиво
textField.addComponentListener(new ComponentAdapter() {
private boolean isTrimmed = false;

@Override
public void componentResized(ComponentEvent e) {
checkTextTrim(textField);
}

@Override
public void componentShown(ComponentEvent e) {
checkTextTrim(textField);
}

private void checkTextTrim(JFormattedTextField field) {
FontMetrics metrics = field.getFontMetrics(field.getFont());
String text = field.getText();
int textWidth = metrics.stringWidth(text);
int fieldWidth = field.getWidth();

boolean currentlyTrimmed = textWidth > fieldWidth;

if (currentlyTrimmed && !isTrimmed) {
isTrimmed = true;
onTextTrim();
} else if (!currentlyTrimmed && isTrimmed) {
isTrimmed = false;
onTextShow();
}
}
});


Подробнее здесь: https://stackoverflow.com/questions/792 ... jtextfield
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»