Я столкнулся с проблемой при использовании JTextField в BoxLayout в JScrollPane.Как заставить BoxLayout и JScrollPane ограничить размер контента?
Желаемый результат - это JTextField, который прокручивается внутри себя, как вы видите, когда вы вставляете URL-адрес, длина которого превышает ширину экрана, в адресную строку вашего веб-браузера. Вся строка сдвигается влево или вправо, когда вы пытаетесь переместить каретку за границы текстового поля.
Однако, если вы вставляете JScrollPane, текстовое поле не может этого сделать, а расширяется, чтобы соответствовать всей строке.
Перед текстом:
После текста:
В текстовом поле увеличивает его ширину, в результате чего полоса прокрутки появляется, а не "внутренний прокруткой" поведение, описанное выше (где текстовое поле остается одного размера, но только показывает часть текста).
Такое поведение происходит даже при настройке политики полосы прокрутки для JScrollPane.HORIZONTAL_SCROLLBAR_NEVER
:
Я заметил, что текстовое поле выполняет «внутреннюю прокрутку» правильно, пока окно не изменяют размера, на котором текст поле изменяет размеры экрана.
Мне нужна панель прокрутки, потому что мне нужна вертикальная полоса прокрутки в моем приложении, но Я хотел бы, чтобы горизонтальная ось была ограничена любым размером, которое позволяет окно панели. Как я могу это достичь?
сегмент кода для приведенных выше примеров:
import java.awt.Dimension;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
public class GUI {
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JScrollPane scrollPane = new JScrollPane(panel);
frame.add(scrollPane);
JTextField textField = new JTextField();
panel.add(textField);
frame.setSize(500, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
// max width = Short.MAX_VALUE so it expands to fill the frame width
// max height = preferred height so the text area height does not expand
textField.setMaximumSize(new Dimension(Short.MAX_VALUE, textField.getPreferredSize().height));
frame.setVisible(true);
}
}
Лучшее решение будет по-прежнему осуществлять горизонтальную полосу прокрутки, если комбинированный минимальный размер компонентов в панели (по горизонтальной оси) было больше, чем ширина окна (скажем, если я добавил туда кнопку слева от текстового поля).
'JTextField' не будет обертываться. В этом случае не используйте диспетчер компоновки, который позволяет текстовому полю расти, возможно, что-то вроде «GridBagLayout». Вы также можете взглянуть на [Следует ли мне избегать использования методов Set (Preferred | Maximum | Minimum) в Java Swing?] (Http://stackoverflow.com/questions/7229226/should-i-avoid- the-use-of-setpreferredmaximumminimumsize-methods-in-java-swi) – MadProgrammer
@MadProgrammer Я не говорю об обертке. Я говорю о том, когда вы вводите предел текстового поля с заданным размером. По мере ввода текста текст перед кареткой, как представляется, перемещается влево внутри поля. – snickers10m