2013-02-24 2 views
2

Я расширяю JScrollPane и добавляю к нему несколько компонентов. Когда я добавляю панель прокрутки в JFrame, компоненты не отображаются. В случае, когда мой класс расширяет, например, JPanel, а затем я добавляю его в автономный JScrollPane, все работает нормально. Я не понимаю этого поведения. Может ли кто-нибудь объяснить мне, почему это происходит?JScrollPane не добавляет компоненты

Вот оба варианта (тот, который работает, и тот, который не делает):

Этот вариант не работает:

public class MainScrollPanel extends JScrollPane { 

    private JPanel verticalPanel; 

    public MainScrollPanel() throws IOException, ParseException { 
     initGUI(); 
     readData(); 
    } 

    private void initGUI() { 
     verticalPanel = new JPanel(); 
     verticalPanel.setLayout(new BoxLayout(verticalPanel, BoxLayout.Y_AXIS)); 

     add(verticalPanel); 
     setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
     setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
    } 

    private void readData() throws IOException, ParseException { 
     //read data 
     //... 
     for(NewData message : messages) { 
      verticalPanel.add(new JLabel(message.getMessage())); 
     } 
    } 
} 

public class MainGUI extends JFrame { 
    private MainScrollPanel mainPanel; 

    public MainGUI() throws IOException, ParseException { 
     super("Scroll app"); 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

     mainPanel = new MainScrollPanel(); 
     getContentPane().add(mainPanel); 

     setSize(200, 200); 
     setVisible(true); 
    } 

    public static void main(String[] args) throws IOException, ParseException { 
     new MainGUI(); 
    } 
} 

Это один работает отлично:

public class MainScrollPanel extends JPanel { 

    public MainScrollPanel() throws IOException, ParseException { 
     initGUI(); 
     readData(); 
    } 

    private void initGUI() { 
     setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 
    } 

    private void readData() throws IOException, ParseException { 
     //The same as in previous example 
    } 
} 

public class MainGUI extends JFrame { 
    private MainScrollPanel mainPanel; 

    public MainGUI() throws IOException, ParseException { 
     //... 
     JScrollPane scrollPane = new JScrollPane(mainPanel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
     getContentPane().add(scrollPane); 
     //... 
    } 
} 
+1

* "Я выражаю JScrollPane .." "* Почему –

+0

Это, вероятно, потому, что вы пропустите' супер (...);?. 'В классе, который расширяет' JScrollPane' – Sorceror

+0

Расширение JScrollPane не требуется, в большинстве случаев. Swing был сделан для использования как есть, редко расширяется. – Aubin

ответ

5

Вам, вероятно, не нужно или нужно расширять JScrollPane, но независимо от того, вы почти никогда не добавляете компоненты непосредственно в JScrollPane, а скорее в свой Viewport. Кроме того, вы теряете Viewport и его функциональность.

Это можно сделать с помощью метода JScrollPane: setViewportView(Component comp) Другого способа передать компонент в конструктор JScrollPane (или здесь его супер конструктора), так как это автоматически перейдет компонент для просмотра. Это немного синтаксический сахар.

например,

private void initGUI() { 
    verticalPanel = new JPanel(); 
    verticalPanel.setLayout(new BoxLayout(verticalPanel, BoxLayout.Y_AXIS)); 

    setViewportView(verticalPanel); // ********** changed ******* 

    setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
    setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
} 
+0

+1: Расширение JPanel, которое добавлено в ViewPort JScrollPane, является правильным способом. – Aubin

+0

@HovercraftFullOfEels, oh, Я забыл о видовом экране ... моя ошибка. Да, установка JPanel в область просмотра вместо добавления JPanel в JScrollPane отлично работает. Спасибо, что указали на такой нюанс. – Dragon

+0

@Dragon: вы очень желанны! –

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