我有一个jscrollpane,我已经添加了面板,然后在面板中我动态添加jlabel和textarea。 在动态向面板添加组件后,垂直滚动到底部。 我想要的是将verticall滚动到顶部。这是我的问题,我怎么能解决这个问题,非常感谢。
这是我的代码
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class MyGui1 extends JPanel implements ActionListener {
/**
*
*/
protected JPanel panel;
protected JTextArea textarea;
static JFrame frame;
JLabel Jlabel = null;
public MyGui1() {
// to lay out the container's components in a rectangular grid
super(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.gridwidth = GridBagConstraints.REMAINDER;
c.fill = GridBagConstraints.HORIZONTAL;
JButton jbutton = new JButton("button");
jbutton.setActionCommand("button");
jbutton.addActionListener(this);
add(jbutton, c);
c.gridy = 1;
c.gridwidth = GridBagConstraints.REMAINDER;
c.fill = GridBagConstraints.BOTH;
c.weightx = 1.0;
c.weighty = 1.0;
setBackground(Color.cyan);
panel = new JPanel(new GridLayout(0, 1));
JScrollPane jsp = new JScrollPane(panel);
jsp.setPreferredSize(new Dimension(300, 300));
add(jsp, c);
setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
}
public void actionPerformed(ActionEvent evt) {
if ("button".equals(evt.getActionCommand())) {
execute();
}
}
synchronized public void execute() {
// to remove all the content of panel
panel.removeAll();
// to refresh the window
repaint();
for (int i = 0; i < 20; i++) {
Jlabel = new JLabel("Labe1l" + i);
Jlabel.setVerticalAlignment(SwingConstants.TOP);
panel.add(Jlabel);
textarea = new JTextArea(3, 3);
textarea.setText("sample text ");
textarea.append("\n");
textarea.setEditable(false);
// in order to wrap up the data in text area
textarea.setLineWrap(true);
panel.add(textarea, BorderLayout.CENTER);
}
frame.revalidate();
}
@SuppressWarnings("static-access")
private static void createAndShowGUI() {
// Create and set up the window.
frame = new JFrame("DesktopSearchEngine");
frame.setLayout(new BorderLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// adding window listener for exit operation
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
JFrame frame = (JFrame) e.getSource();
int result = JOptionPane.showConfirmDialog(frame,
"Are you sure you want to exit the application?",
"Exit Application", JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION) {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} else if (result == JOptionPane.NO_OPTION) {
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
}
}
});
// Add contents to the window GUI part and to perform all operations
frame.add(new MyGui1());
// Display the window.
frame.pack();
// to keep the frame visible
frame.setVisible(true);
}
public static void main(String[] args) {
// Schedule a job for the event dispatch thread:
// creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
答案 0 :(得分:1)
myScrollPane.getVerticalScrollBar().setValue(0);
如果您希望在动态添加组件之前保持在某个位置,可以保存滚动条值,然后重复使用它,如下所示:
int myScrollPanesOldPosition = myScrollPane.getVerticalScrollBar().getValue();
// dynamically add components
myScrollPane.getVerticalScrollBar().setValue(myScrollPanesOldPosition );
答案 1 :(得分:1)
尝试将代码包装在SwingUtilities.invokeLater(...)中:
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
myScrollPane.getVerticalScrollBar().setValue(0);
}
});
这会将代码添加到Event Dispatch Thread的末尾,因此它应该在所有组件都经过验证和绘制后执行。