Question

I'm using a border layout which seems to be hiding a JScrollPane holding a JTextPane, which is in the Center. How can I force the Center JScrollPane to display?

package net.bounceme.dur.usenet.swing;

import java.util.Observable;
import java.util.Observer;
import java.util.logging.Logger;
import javax.mail.Folder;
import javax.swing.ListModel;
import net.bounceme.dur.usenet.controller.Controller;
import net.bounceme.dur.usenet.controller.MessageBean;
import net.bounceme.dur.usenet.controller.MessagesDefaultListModel;

public class MessageSelect extends javax.swing.JPanel implements Observer {

    private static final Logger LOG = Logger.getLogger(MessageSelect.class.getName());
    private Controller controller = Controller.getInstance();
    private ListModel messages = new MessagesDefaultListModel();
    private MessageBean messageBean = new MessageBean();

    public MessageSelect() {
        controller.addObserver(this);
        initComponents();
        messageContent.setText("hello world");
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        center = new javax.swing.JScrollPane();
        messageContent = new javax.swing.JTextPane();
        south = new javax.swing.JPanel();
        commentJButton = new javax.swing.JButton();
        west = new javax.swing.JScrollPane();
        messagesJList = new javax.swing.JList();

        setLayout(new java.awt.BorderLayout());

        messageContent.setContentType("text/html"); // NOI18N
        center.setViewportView(messageContent);

        add(center, java.awt.BorderLayout.CENTER);

        south.setLayout(new java.awt.BorderLayout());

        commentJButton.setText("comment");
        commentJButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                commentJButtonActionPerformed(evt);
            }
        });
        south.add(commentJButton, java.awt.BorderLayout.CENTER);

        add(south, java.awt.BorderLayout.SOUTH);

        messagesJList.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });
        messagesJList.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                messagesJListMouseReleased(evt);
            }
        });
        messagesJList.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                messagesJListKeyReleased(evt);
            }
        });
        west.setViewportView(messagesJList);

        add(west, java.awt.BorderLayout.WEST);
    }// </editor-fold>

    private void commentJButtonActionPerformed(java.awt.event.ActionEvent evt) {                                               
        LOG.fine("button clicked" + messageBean);
    }                                              

    private void messagesJListKeyReleased(java.awt.event.KeyEvent evt) {                                          
        userSelectedRow();
    }                                         

    private void messagesJListMouseReleased(java.awt.event.MouseEvent evt) {                                            
        userSelectedRow();
    }                                           
    // Variables declaration - do not modify
    private javax.swing.JScrollPane center;
    private javax.swing.JButton commentJButton;
    private javax.swing.JTextPane messageContent;
    private javax.swing.JList messagesJList;
    private javax.swing.JPanel south;
    private javax.swing.JScrollPane west;
    // End of variables declaration

    @Override
    @SuppressWarnings("unchecked")
    public void update(Observable o, Object arg) {
        LOG.fine("trying folder:  " + arg);
        //Folder folder = null;
        try {
            Folder folder = (Folder) arg;
            messages = new MessagesDefaultListModel(folder);
            LOG.fine("how many messages? " + messages.getSize());
            messagesJList.setModel(messages);
            LOG.fine("loaded messages..");
        } catch (Exception e) {  //err, class cast exception?
            LOG.fine("not a valid folder " + arg);
        }
    }

    private void userSelectedRow() {
        messageBean = (MessageBean) messagesJList.getSelectedValue();
        LOG.fine(messageBean.toString());
        messageContent.setText(messageBean.getContent());
        LOG.fine("..gotMessageBean: " + messageBean);
    }
}

The first tab below allows selection of a USENET group, some groups are better behaved then others. The android group is unique in that the regular sized window doesn't display the CENTER JScrollPane:

enter image description here

but maximizing the window allows the CENTER JSCrollPane to display correctly:

enter image description here

Was it helpful?

Solution

I think it's that the JList is sizing itself to the longest row. Try

messageList.setPrototypeCellValue("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");

to establish the width. You can also experiment with setting a preferred width for the JScrollPane that holds the JList and enabling horizontal scrolling.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top