2016-06-10 12 views
1

Ausführen dieses Codes führt zu sehr seltsames Verhalten. Wenn Sie laufen, versuchen Sie, die Größe zu ändern und zu tippen, um zu sehen, was ich meine. JetztHinzufügen von Komponente zu JScrollPane hat seltsames Verhalten

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); 
} 
} 

, ersetzen Sie diese 2 Zeilen:

JScrollPane scrollPane = new JScrollPane(); 
    scrollPane.add(jPanel); 

Mit dieser einer Zeile und das Verhalten wird als erwartet.

JScrollPane scrollPane = new JScrollPane(jPanel); 

Basierend auf der Dokumentation der JScrollPane Konstruktor akzeptiert eine Komponente und damit auch die add(). Warum der Unterschied im Verhalten?

Antwort

2

Das ist falsch:

scrollPane.add(jPanel); 

Da Sie alle wichtigen Darstellungsfeld mit diesem Add des JScrollPane ersetzen, es von dem Funktionieren verhindert. Sie sollten stattdessen dieses Ansichtsfensters auf die JScrollPane werden, indem nach dem JScrollPane tutorial und JScrollPane API:

scrollPane.setViewportView(jPanel); 

oder

scrollPane.getViewport().add(jPanel); 

Moral der Geschichte: im Zweifelsfall die Dokumentation lesen.

Beachten Sie, dass, wenn Sie die JPanel in die JScrollPane Konstruktor übergeben,

JScrollPane scrollPane = new JScrollPane(jPanel); 

es automatisch die Komponente in das Ansichtsfenster für Sie platziert.

Per der API:

public JScrollPane (Component Ansicht)
eine JScrollPane erstellt, die den Inhalt der spezifizierten Komponente zeigt, wobei die horizontale und vertikale Bildlaufleisten, wann immer die Komponente Inhalt größer als der Ansicht erscheinen .
Parameter:
Ansicht - die Komponente in der scrollpane des Darstellungs

+0

Dank anzuzeigen. Ich habe tatsächlich diesen Link über die JScrollPane-API gelesen, aber es ist einfach nicht untergegangen. Da die meisten Komponenten scheinbar mit add() zu den verschiedenen Panels hinzugefügt werden, ist JScrollPane die einzige, in der add() stattdessen das Viewport ersetzt von Zusätzen dazu? –

+0

@UnhandledException: JScrollPane ist eine komplexe Komponente, die aus mehreren Unterkomponenten besteht. Eine Schlüsselkomponente ist (wie Sie herausfinden) das Ansichtsfenster. Andere Komponentenkomponenten, mit denen Sie vorsichtig sein müssen, einschließlich Fenstern der obersten Ebene wie JFrames, die ebenfalls aus mehreren Komponenten bestehen. Wenn Sie zum Beispiel 'setBackground (Color c)' auf einem JFrame aufrufen, sehen Sie keine Änderung der Hintergrundfarbe. Um den gewünschten Effekt zu erzielen, müssen Sie die Methode im contentPane des JFrames aufrufen. Und wenn Sie 'add (Component comp)' auf einem JFrame aufrufen, fügen Sie dem contentPane tatsächlich hinzu. –