Ruslan
Ruslan

Reputation: 319

JScrollPane component change

i have a JScrollPane. But default it displays JTextArea.

JTextArea jTextArea = new JTextArea();
JScrollPane pane = new JScrollPane(jTextArea);

so here everything is fine. But now i would like to change JScrollPane component by user action:

pane.remove(jTextArea);
pane.add(new JTable(data[][], columns[]));
pane.revalidate();
frame.repaint();

frame in my main Window. JScrollPane is added to main window with GridBagLayout. But this doesn't work. After running action JScrollPane becomes grey.

Upvotes: 2

Views: 8376

Answers (3)

StanislavL
StanislavL

Reputation: 57381

jScrollPane.getViewport().remove/add

Upvotes: 4

nIcE cOw
nIcE cOw

Reputation: 24616

Edited my answer after receiving one valuable suggestion by His Majesty @camickr, setViewportView(componentObject); is used to do such things.

A sample code to help your cause :

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ScrollPaneExample extends JFrame
{
    private JPanel panel;
    private JScrollPane scrollPane;
    private JTextArea tarea;
    private JTextPane tpane;
    private JButton button;
    private int count;

    public ScrollPaneExample()
    {
        count = 0;
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationByPlatform(true);

        panel = new JPanel();
        panel.setLayout(new BorderLayout());

        tarea = new JTextArea();
        tarea.setBackground(Color.BLUE);
        tarea.setForeground(Color.WHITE);
        tarea.setText("TextArea is working");
        scrollPane = new JScrollPane(tarea);

        tpane = new JTextPane();
        tpane.setText("TextPane is working.");

        button = new JButton("Click me to CHANGE COMPONENTS");
        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                if (count == 0)
                {
                    scrollPane.setViewportView(tpane);
                    count++;
                }
                else if (count == 1)
                {
                    scrollPane.setViewportView(tarea);
                    count--;
                }
            }
        });

        setContentPane(panel);
        panel.add(scrollPane, BorderLayout.CENTER);
        panel.add(button, BorderLayout.PAGE_END);

        pack();
        setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new ScrollPaneExample();
            }
        });
    }
}

Hope this might help you in some way.

Regards

Upvotes: 2

Andrew Thompson
Andrew Thompson

Reputation: 168815

One alternative is to put a JPanel with a CardLayout1 into the JScrollPane, add both the components to the panel, then simply flip between the text area and table as needed.

  1. How to Use CardLayout

Given the components might be of vastly different size, it might be better to do it this way:

JPanel with CardLayout contains many JScrollPane instances, each of which contains a single component. That will also work inherently better for a JTable.

Upvotes: 3

Related Questions