Перемещение Grid.Row = "1" из StackPanel в ScrollViewer полностью разрешило его для меня.
У меня был длинный список из примерно 40 предметов, которые можно было бы показать в StackPanel, но показывали только первые 20 .
<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Auto">
<StackPanel x:Name="ContentPanel" Margin="12,0,12,0">
<TextBlock Text="{Binding Line1}" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
<TextBlock Text="" Margin="10,-2,10,0" Style="{StaticResource PhoneTextNormalStyle}" />
...
</StackPanel>
</ScrollViewer>
Я столкнулся с той же проблемой с моим заявлением. У меня была кнопка «Выполнить» моего приложения, которая выполняла некоторые действия и выводила результаты в JTextArea. Я должен был вызвать метод из потока. Вот что я сделал.
У меня есть несколько переключателей действий, которые можно выполнить, и затем одна кнопка «Выполнить», чтобы выполнить это конкретное действие. У меня есть действие под названием Validate. Поэтому, когда я проверяю этот переключатель и нажимаю кнопку «Выполнить», он вызывает метод validate (). Поэтому я сначала поместил этот метод во внутренний класс, который реализовал Runnable
class ValidateThread implements Runnable {
public void run() {
validate();
}
}
. Затем я вызвал этот поток в ActionListener кнопки «Выполнить» следующим образом
runButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
// Some code checked on some radio buttons
if(radioButton.isSelected()) {
if(radioButton.getText().equals("VALIDATE")) {
Runnable runnable = new ValidateThread();
Thread thread = new Thread(runnable);
thread.start();
}
}
}
});
Вуаля! Вывод теперь отправляется в JTextArea.
Теперь вы заметите, что JTextArea не будет прокручиваться вниз с текстом. Поэтому вам нужно установить позицию каретки, как
textArea.setCaretPosition(textArea.getText().length() - 1);
Теперь, когда данные добавляются в JTextArea, они всегда будут прокручиваться вниз.
Как уже говорили другие, это требует многопоточности. Взгляните на Параллельность в Swing .
Одним из решений было бы реализовать обработку с использованием SwingWorker. Метод doInBackground реализует обработку, и вы вызываете метод publish со строкой, которая будет добавлена в качестве аргумента. Затем ваш SwingWorker переопределит метод процесса, чтобы получить аргумент String и добавить его в текстовую область.
Для этого вам понадобится многопоточность. Готовы окунуться?
Если это - многопоточность, Вы должны попробовать это! http://www.devarticles.com/c/a/Java/Multithreading-in-Java/
Попробуйте следующее:
jTextArea.update(jTextArea.getGraphics());