JTextField не уменьшается за пределы длины текста в JScrollPaneJAVA

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

Сообщение Anonymous »

Я обнаружил, что если я оберну JTextField в JScrollPane, он никогда не уменьшится за пределы длины текста — даже если для политики горизонтальной полосы панели прокрутки установлено значение JScrollPane.HORIZONTAL_SCROLLBAR_NEVER. Вертикальная полоса по-прежнему важна, поэтому я не могу отказаться от этой панели в реальном приложении.
Поле приложения хранит названия медицинских учреждений и может хранить очень длинные строки. Окно все равно должно сжиматься, даже если это означает обрезку текста (но, что важно, не самого компонента).
MRE:

Код: Выделить всё

import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import javax.swing.text.JTextComponent;
import java.awt.Component;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

public class TextFieldDemo {

static JTextComponent field;

public static void main(String[] args) {
Container mainPanel = createScroller(); // run this line to reproduce
//        Container mainPanel = createMainPanel(); // run this line to see normal shrinking
JFrame frame = new JFrame("Text Field Demo");
frame.setContentPane(mainPanel);
frame.setLocationRelativeTo(null);
frame.pack();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
}

private static Container createScroller() {
JScrollPane scroller = new JScrollPane(createMainPanel());
scroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
return scroller;
}

private static Container createMainPanel() {
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.gridy = 0;
constraints.gridwidth = 3;
constraints.weightx = 1;
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.insets = new Insets(5,5,5,5);
panel.add(createTextField(), constraints);
constraints.gridwidth = 1;
constraints.gridy = 1;
constraints.weightx = 0;
constraints.fill = GridBagConstraints.NONE;
panel.add(createLongTextButton(), constraints);
panel.add(createResetButton(), constraints);
constraints.weightx = 1;
constraints.fill = GridBagConstraints.HORIZONTAL;
panel.add(Box.createGlue(), constraints);
return panel;
}

private static Component createTextField() {
field = new JTextField();
field.setEditable(false);
field.setText(createShortText());
return field;
}

private static Component createLongTextButton() {
JButton button = new JButton("Set long text");
button.addActionListener(e -> field.setText(createLongText()));
return button;
}

private static String createLongText() {
return "Long long long long long long long long long long long long long long long long long long long text";
}

private static Component createResetButton() {
JButton button = new JButton("Reset");
button.addActionListener(e -> field.setText(createShortText()));
return button;
}

private static String createShortText() {
return "Short text";
}
}
Без скроллера:
Изображение

Со скроллером (компонент обрезан):
Изображение

Java 8.

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

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

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

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

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

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