setPreferredScrollableViewportSize () против setFillsViewportHeight () в JTable

Может ли кто-нибудь сказать мне в Java Swing разницу между использованием setPreferredScrollableViewportSize () после помещения моей JTable в JScrollPane и вызовом setFillsViewportHeight (true) для экземпляра JTable? Я хочу знать, какая из них является хорошей практикой. Герберт Шильдт предлагает использовать setPreferredScrollableViewportSize (), а Хорстманн и Корнелл предлагают setFillsViewportHeight (). Вот краткий пример того, с чем я дурачусь.

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class TableDemo {
    JTable jtabEmail;
    String[] headings = {"From", "Address", "Subject", "Size"};
    Object[][] data = {
            { "Wendy", "[email protected]", 
                "Hello Herb", new Integer(287) }, 
                { "Alex", "[email protected]", 
                    "Check this out!", new Integer(308) }, 
                    { "Hale", "[email protected]", 
                        "Found a bug", new Integer(887) }, 
                        { "Todd", "[email protected]", 
                            "Did you see this?", new Integer(223) }, 
                            { "Steve", "[email protected]", 
                                "I'm back", new Integer(357) }, 
                                { "Ken", "[email protected]", 
                                    "Arrival time change", new Integer(512) }   
    };
    JLabel jl;
    public TableDemo() {
        JFrame jfrm = new JFrame("Table Demo");
        jfrm.setSize(500, 160);
        jfrm.getContentPane().setLayout(new FlowLayout());
        jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        jl = new JLabel("");

        jtabEmail = new JTable(data, headings);
        jtabEmail.setFillsViewportHeight(true);
        JScrollPane jsp = new JScrollPane(jtabEmail);
        //jtabEmail.setPreferredScrollableViewportSize(new Dimension(450, 80));

        jtabEmail.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent e) {
                StringBuilder sb = new StringBuilder("Selected Rows: ");
                int[] rowsArray = jtabEmail.getSelectedRows();
                for (int i = 0; i < rowsArray.length; i++) {
                    sb.append((rowsArray[i]+1) + " ");
                }
                jl.setText(sb.toString());
            }
        });

        jfrm.getContentPane().add(jsp);
        jfrm.getContentPane().add(jl);

        //jfrm.pack();
        jfrm.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TableDemo();
            }
        });
    }
}

Ответы на вопрос(2)

Ваш ответ на вопрос