outerPanel.add(scrollPane, BorderLayout.CENTER);
BoxLayout не принимает ограничений, поэтому BorderLayout.CENTER не нужен.
Проблема в том, что BoxLayout учитывает максимальный размер компонента, который для панели прокрутки установлен очень большим.
Вместо использования BoxLayout просто используйте панель с FlowLayout.
Запустите приведенный ниже пример, чтобы увидеть, что вы делаете в данный момент. Затем закомментируйте оператор setLayout(...) и запустите снова. По умолчанию панель использует FlowLayout, поэтому вы получите то, что хотите.
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
public class SSCCE extends JPanel
{
public SSCCE()
{
setLayout( new BoxLayout(this, BoxLayout.PAGE_AXIS));
JTextArea textArea = new JTextArea(5, 30);
JScrollPane scrollPane = new JScrollPane(textArea);
//scrollPane.setMaximumSize( scrollPane.getPreferredSize() );
add(scrollPane);
}
private static void createAndShowUI()
{
JFrame frame = new JFrame("SSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new SSCCE() );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
Или, если вы действительно хотите сохранить BoxLayout, оставьте оператор setLayout(...) и затем установите максимальный размер, равный предпочтительному размеру. Многие люди скажут, что вы никогда не должны вызывать метод setXXX() напрямую, и вместо этого вы должны переопределить метод setMaximumSize() панели прокрутки, чтобы просто вернуть предпочтительный размер.
Обратите внимание: при тестировании этих двух решений убедитесь, что вы делаете окно меньше, чем область прокрутки, чтобы увидеть, как каждый макет работает по-разному.
person
camickr
schedule
16.02.2013