2015-12-08 3 views
0

Я столкнулся с проблемой при использовании JTextField в BoxLayout в JScrollPane.Как заставить BoxLayout и JScrollPane ограничить размер контента?

Желаемый результат - это JTextField, который прокручивается внутри себя, как вы видите, когда вы вставляете URL-адрес, длина которого превышает ширину экрана, в адресную строку вашего веб-браузера. Вся строка сдвигается влево или вправо, когда вы пытаетесь переместить каретку за границы текстового поля.

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

Перед текстом:

Before entering text

После текста:

After entering text

В текстовом поле увеличивает его ширину, в результате чего полоса прокрутки появляется, а не "внутренний прокруткой" поведение, описанное выше (где текстовое поле остается одного размера, но только показывает часть текста).

Такое поведение происходит даже при настройке политики полосы прокрутки для JScrollPane.HORIZONTAL_SCROLLBAR_NEVER:

After entering text, without a scrollbar

Я заметил, что текстовое поле выполняет «внутреннюю прокрутку» правильно, пока окно не изменяют размера, на котором текст поле изменяет размеры экрана.

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

сегмент кода для приведенных выше примеров:

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); 
    } 
} 

Лучшее решение будет по-прежнему осуществлять горизонтальную полосу прокрутки, если комбинированный минимальный размер компонентов в панели (по горизонтальной оси) было больше, чем ширина окна (скажем, если я добавил туда кнопку слева от текстового поля).

+0

'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

+0

@MadProgrammer Я не говорю об обертке. Я говорю о том, когда вы вводите предел текстового поля с заданным размером. По мере ввода текста текст перед кареткой, как представляется, перемещается влево внутри поля. – snickers10m

ответ

2

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

JFrame frame = new JFrame(); 
JPanel panel = new JPanel(new GridBagLayout()); 
JScrollPane scrollPane = new JScrollPane(panel); 
frame.add(scrollPane); 

GridBagConstraints gbc = new GridBagConstraints(); 
gbc.weightx = 1; 
gbc.fill = gbc.HORIZONTAL; 
JTextField textField = new JTextField(10); 
panel.add(textField, gbc); 

frame.setSize(500, 200); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

frame.setVisible(true); 
+0

* стон * Ненавижу GridBag. – snickers10m

+0

Я говорю то же самое о 'BoxLayout' – MadProgrammer

0

Простое решение состоит в установке предпочтительный ширину текстового поля до минимума ширина.

textField.setPreferredSize(new Dimension(textField.getMinimumSize().width, textField.getPreferredSize().height)); 

В текстовом поле будет выполнять поведение «внутренняя прокрутка», а также вызвать полосу прокрутки появится, если окно сжимается ниже минимального размера (как описано в итоговом заявлении оригинального вопроса на уровне ниже)

Лучшее решение по-прежнему будет использовать горизонтальную полосу прокрутки, если объединенный минимальный размер компонентов на панели (по горизонтальной оси) был больше ширины окна (скажем, если бы я добавил туда кнопку слева от текстового поля).

+1

[Следует избегать использования методов Set (Preferred | Maximum | Minimum) в Java Swing?] (Http://stackoverflow.com/questions/7229226/should-i- избегать-на-использование-на-setpreferredmaximumminimumsize-методов-в-Java-SWI) – MadProgrammer

 Смежные вопросы

  • Нет связанных вопросов^_^