У меня есть ScrollPane с JPanel в моей программе Java, которая получает много добавленного текста. Мне нужно, чтобы ScrollPane прокручивалась до самого нижнего уровня после каждого добавления. Моя проблема со следующим кодом заключается в том, что он прокручивает «почти» до нижней, но не полностью. Любые идеи относительно того, что я делаю неправильно?Java JScrollPane прокручивает вниз ... почти
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
public class Sample extends JFrame{
JTextField input = new JTextField();
JPanel log = new JPanel();
JScrollPane scrollPane = new JScrollPane(log);
JScrollBar scrollBar = scrollPane.getVerticalScrollBar();
public Sample(){
input.setBorder(new TitledBorder("Message"));
input.setToolTipText("Type a message here.");
log.setBorder(new TitledBorder("Log"));
log.setLayout(new BoxLayout(log, BoxLayout.Y_AXIS));
log.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
// Add the panels to the frame
setLayout(new BorderLayout(10, 10));
add(input, BorderLayout.NORTH);
add(scrollPane, BorderLayout.CENTER);
setTitle("Chat Window");
setSize(400, 300);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
// Register Key listener
input.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
log.add(new ServerBubble(input.getText()));
log.add(Box.createRigidArea(new Dimension(0, 10)));
input.setText(null);
scrollPane.revalidate();
scrollBar.setValue(scrollBar.getMaximum());
}
}
});
}
public static void main(String[] args) {
JFrame frame = new Exercise33_9Server();
}
private class ServerBubble extends JLabel{
private final Color LIGHT_GREEN = new Color(204, 255, 229);
private final Color DARK_GREEN = new Color(0, 102, 51);
String message;
public ServerBubble(String label){
message = processText(label);
setOpaque(true);
setForeground(DARK_GREEN);
setBackground(LIGHT_GREEN);
setHorizontalAlignment(LEFT);
setBorder(new LineBorder(DARK_GREEN, 3, true));
setText(label);
setBorder(BorderFactory.createCompoundBorder(getBorder(), BorderFactory.createEmptyBorder(5, 5, 5, 5)));
}
private String processText(String message){
message = "<HTML>" + message;
return message;
}
}
}
1- Использовать API привязки ключей над 'KeyListener'; 2- 'revalidate' view (' log'), прежде чем пытаться перейти к концу панели прокрутки. – MadProgrammer
Я должен использовать keyListener, поскольку это часть целей школьных заданий. –
Тогда ваша школа ПУТЬ позади ... – MadProgrammer