2015-10-30 2 views
3

Так что эта проблема давно искала меня, и она эффективно делает мою игру неиграбельной, если она запущена. Ситуация такова, что у меня есть четыре элемента в моей GUI:Автоматическая прокрутка Java JTextPane перестает работать после выбора текста

private JPanel panel; 
private JTextPane content; 
private JScrollPane scroll; 
private JTextField input; 

Все это установка в BorderLayout, с политикой обновления, которая автоматически каретки прокручивает экран всякий раз, когда текст достигает дна. Однако, если я выберу любой текст в JTextPane, внезапно автопрокрутка перестанет работать, и любой новый текст, добавленный в панель, останется невидимым, пока пользователь не будет вручную прокручивать полосу прокрутки. Я пытаюсь повторно применить политику обновления каретки каждый раз, когда текст добавляется, но это не сработало. Я не знаю, как это исправить, и попытки google проблема была бесплодной. Для справки, здесь соответствующий код из конструктора:

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
setSize(width, height); 
setResizable(false); 
panel = new JPanel(); 

input = new JTextField(30); 
input.setBackground(Color.BLACK); 
input.setForeground(Color.GREEN); 
input.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, width/40)); 
input.addActionListener(this); 

content = new JTextPane(); 
scroll = new JScrollPane(content); 
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
scroll.setPreferredSize(new Dimension(width, height - 80)); 
scroll.setMinimumSize(new Dimension(640, 480)); 
scroll.setBorder(null); 

content.setBackground(Color.BLACK); 
content.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, width/40)); 
content.setEditable(false); 

DefaultCaret caret = (DefaultCaret) content.getCaret(); 
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE); 

panel.setLayout(new BorderLayout()); 
panel.add(scroll, BorderLayout.NORTH); 
panel.add(input, BorderLayout.SOUTH); 
panel.setBackground(Color.BLACK); 

getContentPane().add(panel); 

setVisible(true); 

Есть ли возможное решение этой проблемы, или это ограничение Java AWT?

+0

1) Для лучшей помощи рано, оставить [MCVE] или [Short, самодостаточной Правильный пример] (HTTP : //www.sscce.org/). 2) См. [Я должен избегать использования методов Set (Preferred | Maximum | Minimum) в Java Swing?] (Http://stackoverflow.com/q/7229226/418556) (Да.) –

+0

Я новичок в это, поэтому я не совсем знаю правила, и смущающе я бы не назвал себя особенно сильным программистом, несмотря на то, что это моя будущая профессия. Когда я меняю setPreferredSize на просто setSize, он полностью прерывает мою программу, поскольку полоса прокрутки остается фиксированным размером, который составляет около 30 пикселей, независимо от параметров, которые я передаю методу. –

ответ

5

Я попытался повторно применить политику обновления каретки при добавлении текста, но это не сработало.

Кроме того, необходимо сбросить каретку до конца документа:

textPane.getDocument().insertString(...); 
textPane.setCaretPosition(textArea.getDocument().getLength()); 
+0

В моем текстовом методе добавления я добавил: content.setCaretPosition (doc.getLength()); Мои попытки сломать это были бесплодны, что является отличной новостью. Он кажется очень надежным, и я попытался по-разному вызвать проблему типа Alt-Tabbing, выбрав области текста, перемещая полосу прокрутки, и никто из них, похоже, больше не работает. Спасибо за вашу помощь, это удивительно, что исправление было настолько простым! –

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