将组件添加到jscrollpane中的面板后,如何从底部向上滚动

时间:2014-04-08 13:47:07

标签: java swing jscrollpane

我有一个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();
            }
        });
    }

}

2 个答案:

答案 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的末尾,因此它应该在所有组件都经过验证和绘制后执行。