2016-06-10 7 views
1

Выполнение этого кода вызывает очень странное поведение. При запуске попробуйте изменить размер и ввести текст, чтобы увидеть, что я имею в виду.Добавление компонента в 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 принимает компонент, а также добавляет(). Почему разница в поведении?

ответ

2

Это неправильно:

scrollPane.add(jPanel); 

Поскольку вы заменяете все важные иллюминатор JScrollPane с этим дополнением, препятствуя его нормальному функционированию. Вы должны вместо этого добавлять это в иллюминатор JScrollPane как согласно JScrollPane tutorial и JScrollPane API:

scrollPane.setViewportView(jPanel); 

или

scrollPane.getViewport().add(jPanel); 

Мораль: если вы сомневаетесь, прочитайте документацию.

Обратите внимание, что если вы передаете JPanel в конструктор в JScrollPane, в

JScrollPane scrollPane = new JScrollPane(jPanel); 

автоматически помещает компонент в окно просмотра для вас.

согласно API:

общественных JScrollPane (компонент просмотра)
создает JScrollPane, который отображает содержимое указанного компонента, в котором отображаются как горизонтальные и вертикальные полосы прокрутки, когда содержание компонента больше, чем вид ,
Параметры:
вид - компонент для отображения в области просмотра ScrollPane в

+0

Спасибо. Я действительно читал эту ссылку о JScrollPane API, но она просто не утонула. Поскольку большинство компонентов, кажется, добавлены к различным панелям с помощью add(), это JScrollPane - единственный уникальный, в котором add() вместо окна просмотра добавляет к нему? –

+0

@UnhandledException: JScrollPane - это сложный компонент, состоящий из нескольких подкомпонентов, ключевой (как вы узнаете), являющийся видовым окном. Другие компоненты компонентов, с которыми вы должны быть осторожны, включая окна верхнего уровня, такие как JFrames, которые также состоят из нескольких компонентов. Например, если вы вызываете 'setBackground (Цвет c)' на JFrame, вы не увидите изменения цвета фона. Чтобы получить желаемый эффект, вы должны вызвать метод на панели содержимого JFrame. А при вызове 'add (Component comp)' на JFrame вы фактически добавляете в contentPane. –

Смежные вопросы