Выполнение этого кода вызывает очень странное поведение. При запуске попробуйте изменить размер и ввести текст, чтобы увидеть, что я имею в виду.Добавление компонента в JScrollPane имеет странное поведение
import java.awt.BorderLayout;
import javax.swing.*;
public class FrameWithScrollPanel extends JFrame {
public static void main(String[] args) {
FrameWithScrollPanel myFrame = new FrameWithScrollPanel();
}
public FrameWithScrollPanel()
{
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
JTextArea textArea1 = new JTextArea(5, 30);
JTextArea textArea2 = new JTextArea(5, 30);
JPanel jPanel = new JPanel();
jPanel.setSize(400,400);
jPanel.setLayout(new BorderLayout());
jPanel.add(textArea1, BorderLayout.NORTH);
jPanel.add(textArea2, BorderLayout.SOUTH);
JScrollPane scrollPane = new JScrollPane();
scrollPane.add(jPanel);
getContentPane().add(scrollPane, BorderLayout.CENTER);
pack();
setVisible(true);
}
}
Теперь замените эти 2 строки:
JScrollPane scrollPane = new JScrollPane();
scrollPane.add(jPanel);
С этой одной линии и поведение, как и ожидалось.
JScrollPane scrollPane = new JScrollPane(jPanel);
На основе документации конструктор JScrollPane принимает компонент, а также добавляет(). Почему разница в поведении?
Спасибо. Я действительно читал эту ссылку о JScrollPane API, но она просто не утонула. Поскольку большинство компонентов, кажется, добавлены к различным панелям с помощью add(), это JScrollPane - единственный уникальный, в котором add() вместо окна просмотра добавляет к нему? –
@UnhandledException: JScrollPane - это сложный компонент, состоящий из нескольких подкомпонентов, ключевой (как вы узнаете), являющийся видовым окном. Другие компоненты компонентов, с которыми вы должны быть осторожны, включая окна верхнего уровня, такие как JFrames, которые также состоят из нескольких компонентов. Например, если вы вызываете 'setBackground (Цвет c)' на JFrame, вы не увидите изменения цвета фона. Чтобы получить желаемый эффект, вы должны вызвать метод на панели содержимого JFrame. А при вызове 'add (Component comp)' на JFrame вы фактически добавляете в contentPane. –