JScrollPane-Problem

Status
Nicht offen für weitere Antworten.
S

scooterJava

Gast
Ich habe eine Klasse, die mir sicherstellt, dass ich in einem FlowLayout auch vertikal scrollen kann:

Code:
import java.awt.*;
import javax.swing.*;


public class ScrollableFlowPanel
    extends JPanel
    implements Scrollable
{
    // ========================================================================
    // FIELDS
    // ========================================================================

    private static final long serialVersionUID = 1L;

    // ========================================================================
    // CONSTRUCTORS
    // ========================================================================

    /* none */

    // ========================================================================
    // METHODS
    // ========================================================================
    // ------------------------------------------------------------------------
    private int getPreferredHeight()
    {
        int iPrefWidth = 0;
        for( int i = 0, j = getComponentCount(); i < j; i++ )
        {
            Component oComponent = getComponent( i );
            Rectangle oRectangle = oComponent.getBounds();
            int iHeight = oRectangle.y + oRectangle.height;
            if( iHeight > iPrefWidth )
            {
                iPrefWidth = iHeight;
            }
        }
        iPrefWidth += ( (FlowLayout)getLayout() ).getVgap();
        return iPrefWidth;
    }

    // ------------------------------------------------------------------------
    public Dimension getPreferredScrollableViewportSize()
    {
        return( super.getPreferredSize() );
    }

    // ------------------------------------------------------------------------
    @Override
    public Dimension getPreferredSize()
    {
        return( new Dimension( getWidth(), getPreferredHeight() ) );
    }

    // ------------------------------------------------------------------------
    public int getScrollableBlockIncrement( final Rectangle oVisibleRect, final int iOrientation, final int iDirection )
    {
        return( iOrientation == SwingConstants.VERTICAL ? getParent().getHeight() : getParent().getWidth() );
    }

    // ------------------------------------------------------------------------
    public boolean getScrollableTracksViewportHeight()
    {
        return false;
    }

    // ------------------------------------------------------------------------
    public boolean getScrollableTracksViewportWidth()
    {
        return true;
    }

    // ------------------------------------------------------------------------
    public int getScrollableUnitIncrement( final Rectangle oVisibleRect, final int iOrientation, final int iDirection )
    {
        int iHundredth = ( iOrientation == SwingConstants.VERTICAL ? getParent().getHeight() : getParent().getWidth() ) / 100;
        return( iHundredth == 0 ? 1 : iHundredth );
    }

    // ------------------------------------------------------------------------
    @Override
    public void setBounds( final int iX, final int iY, final int iWidth, final int iHeight )
    {
        super.setBounds( iX, iY, getParent().getWidth(), iHeight );
    }
}

Soweit alles prima. Im Code der Hautpklasse nutze ich sie wie folgt (Auszug):

Code:
        // Use PicturePanel with the new method setBackgroundImage() for setting a wallpaper.
        PicturePanel panApps = new PicturePanel( new BorderLayout() );
        // The image must have this size: Width is the width of the window minus the width of the task pane, height is the height of the window.
        panApps.setBackgroundImage( sBackgroundImage );
        JLabel labChoose = new JLabel( "blabla", SwingConstants.CENTER );


        ScrollableFlowPanel panScrollFlow = new ScrollableFlowPanel();
        for( int i = 0; i < sApps.length; i++ )
        {
                butApps[ i ] = new JButton( sApps[ i ] );
                butApps[ i ].setPreferredSize( new Dimension( 150, 50 ) );
                butApps[ i ].setText( sApps[ i ] );
                butApps[ i ].setFont( new Font( Font.SANS_SERIF, Font.BOLD, 14 ) );
                panScrollFlow.add( butApps[ i ] );
        }

        // Add subpanels to the panels.
        JScrollPane panScroll = new JScrollPane( panScrollFlow, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
            ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER );
        panApps.add( labChoose, BorderLayout.NORTH );
        panApps.add( panScroll, BorderLayout.CENTER );

Auch hier: alles klappt -- bis auf eines. Die Klasse PicturePanel stellt sicher, dass ich in einem Panel ein Hintergrundbild zu sehen bekomme:

Code:
import java.awt.*;
import javax.swing.JPanel;


public class PicturePanel
    extends JPanel
{
    // ========================================================================
    // FIELDS
    // ========================================================================

    private static final long serialVersionUID = 1L;
    private Image oImage;

    // ========================================================================
    // CONSTRUCTORS
    // ========================================================================

    // ------------------------------------------------------------------------
    public PicturePanel()
    {
        super();
    }

    // ------------------------------------------------------------------------
    public PicturePanel( final boolean bIsDoubleBuffered )
    {
        super( bIsDoubleBuffered );
    }

    // ------------------------------------------------------------------------
    public PicturePanel( final LayoutManager oLayout )
    {
        super( oLayout );
    }

    // ------------------------------------------------------------------------
    public PicturePanel( final LayoutManager oLayout, final boolean bIsDoubleBuffered )
    {
        super( oLayout, bIsDoubleBuffered );
    }

    // ========================================================================
    // METHODS
    // ========================================================================

    // ------------------------------------------------------------------------
    @Override
    protected void paintComponent( final Graphics oGrahpics )
    {
        super.paintComponent( oGrahpics );
        if( oImage != null )
        {
            oGrahpics.drawImage( oImage, 0, 0, this );
        }
    }

    // ------------------------------------------------------------------------
    /**
     * Sets the background image of the panel.
     * 
     * @param sImage - The name of the image. Relative path or none is sufficient. Use PNG as image format for best results.
     */
    public void setBackgroundImage( final String sImage )
    {
        Image oImage = Toolkit.getDefaultToolkit().getImage( sImage );
        this.oImage = oImage;
        repaint();
    }

}

Jetzt kommt der Haken: Das Hintergrundbild wird nur zum Teil angezeigt, nämlich nur im oberen Bereich. Ein Aufruf mit setOpaque() hat in einer Vorversion schon geholfen, leider aber nicht, als ich die beiden eigenen Klassen nutzte -- oder ich habe das setOpaque() an die falsche Stelle gesetzt.

Muss ich vielleicht die Methode getPreferredHeight() aus ScrollableFlowPanel ändern? (Hier wird zu einem FlowLayout gecastet). Wenn ja, wie genau muss das aussehen?
 

André Uhres

Top Contributor
Versuch's mal so:
Code:
panScrollFlow.setOpaque(false);
panScroll.setOpaque(false);
panScroll.getViewport().setOpaque(false);
 
S

scooterJava

Gast
Vielen Dank, das war's! Hab den Eindruck, dass man manchmal Java prügeln muss, damit es funktioniert ...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Problem mit Add JScrollPane AWT, Swing, JavaFX & SWT 25
N Swing Problem beim Scrollen mit JScrollPane AWT, Swing, JavaFX & SWT 6
A Swing JScrollPane Problem AWT, Swing, JavaFX & SWT 6
D Swing JScrollPane in JScrollPane - Problem AWT, Swing, JavaFX & SWT 3
B JScrollPane Problem AWT, Swing, JavaFX & SWT 2
M JScrollPane Problem AWT, Swing, JavaFX & SWT 6
RELAXccc Swing JTree + JScrollPane, refresh Problem AWT, Swing, JavaFX & SWT 17
A Problem mit JScrollPane in einer JScrollpane AWT, Swing, JavaFX & SWT 4
B JScrollPane Problem AWT, Swing, JavaFX & SWT 25
T Swing JScrollPane- und Tabelle-Header Problem AWT, Swing, JavaFX & SWT 25
G Swing JScrollPane/Layoutmanger Problem bei dynamischer Größenänderung AWT, Swing, JavaFX & SWT 7
S Swing Problem mit JCheckBox auf JPanel in JScrollPane AWT, Swing, JavaFX & SWT 8
O JDialog-JScrollPane-JTable Problem AWT, Swing, JavaFX & SWT 3
C JScrollPane - Problem AWT, Swing, JavaFX & SWT 8
T Problem mit JScrollPane AWT, Swing, JavaFX & SWT 12
S JScrollpane Problem bei ChildFrame AWT, Swing, JavaFX & SWT 2
J Problem mit JTextPane & JScrollPane (horizontal) AWT, Swing, JavaFX & SWT 3
W JList JScrollPane Problem AWT, Swing, JavaFX & SWT 3
H Scroll-Problem bei JScrollPane+JTextPane AWT, Swing, JavaFX & SWT 2
E Problem mit JScrollPane und JList AWT, Swing, JavaFX & SWT 4
M JTextArea in JScrollPane, Problem mit Thread.sleep() AWT, Swing, JavaFX & SWT 5
R JScrollPane Problem AWT, Swing, JavaFX & SWT 2
G JList und JScrollPane Problem AWT, Swing, JavaFX & SWT 2
G JScrollPane problem mit aktualisierung der daten AWT, Swing, JavaFX & SWT 3
N Problem mit JScrollPane und JPane(FlowLayout) AWT, Swing, JavaFX & SWT 4
N Layout-Problem (JScrollPane, GridBagLayout) AWT, Swing, JavaFX & SWT 3
B Problem mit JScrollPane AWT, Swing, JavaFX & SWT 4
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
E JScrollPane mit JPanel verbinden AWT, Swing, JavaFX & SWT 1
B Swing JScrollPane scrollt nicht AWT, Swing, JavaFX & SWT 10
P JTextarea (in JScrollPane) zeigt nur die beiden letzten Einträge an? AWT, Swing, JavaFX & SWT 0
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5
E Komponenten von JScrollPane werden nicht richtig ermittelt AWT, Swing, JavaFX & SWT 2
E wie in JScrollPane auf JTextArea zugreifen AWT, Swing, JavaFX & SWT 12
N Swing JScrollPane mit Tastatur bedienen? AWT, Swing, JavaFX & SWT 0
F JScrollPane anzeige AWT, Swing, JavaFX & SWT 7
K Swing JScrollPane wird nicht angezeigt wenn man Components darstellt. AWT, Swing, JavaFX & SWT 2
M Swing JPanel in JScrollPane AWT, Swing, JavaFX & SWT 3
P Swing JEditorPane in Kombination mit JScrollPane AWT, Swing, JavaFX & SWT 29
S Swing jScrollPane - pro Eintrag der Liste, die jCheckBoxes Speichern die in dem Eintrag aktiviert wurden AWT, Swing, JavaFX & SWT 2
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
D JScrollPane in JTabbedPane AWT, Swing, JavaFX & SWT 3
MaxG. Swing JScrollPane AWT, Swing, JavaFX & SWT 10
Soloeco Swing JScrollPane AWT, Swing, JavaFX & SWT 6
A Swing Probleme mit dem adden von JButtons zur JScrollPane AWT, Swing, JavaFX & SWT 2
A JScrollPane soll JPanel mit JButtons enthalten und eine Scollbar anzeigen AWT, Swing, JavaFX & SWT 1
J JScrollPane funktioniert nicht AWT, Swing, JavaFX & SWT 5
B LayoutManager GridBagLayout und JScrollPane AWT, Swing, JavaFX & SWT 5
Thallius JScrollPane Scrollpos setzen nach Neuzeichnen AWT, Swing, JavaFX & SWT 3
P MalProgramm mit JScrollPane und Canvas AWT, Swing, JavaFX & SWT 2
D Swing JScrollPane Tabelle ändern (2 Tabellen) AWT, Swing, JavaFX & SWT 7
U JScrollPane -> JTabbedPane u.A. AWT, Swing, JavaFX & SWT 3
A Layout-Manager, JScrollPane, ... Chaos AWT, Swing, JavaFX & SWT 5
V JScrollPane im zur Laufzeit verändernden JFrame AWT, Swing, JavaFX & SWT 0
W Swing Größenänderung vom JPanel im JScrollPane und anschließendes positionieren AWT, Swing, JavaFX & SWT 2
X Swing JButton's zum JScrollPane hinzufügen geht nicht. Bitte um Hilfe. AWT, Swing, JavaFX & SWT 9
G JTextArea mit JScrollPane wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
K Swing JScrollPane - JScrollBar anzeigen, wenn Frame verkleinert wird AWT, Swing, JavaFX & SWT 3
Bluedaishi JScrollpane AWT, Swing, JavaFX & SWT 0
L JScrollPane scrollt nicht !! AWT, Swing, JavaFX & SWT 3
F JScrollPane Position setzen (x=0, y=0) AWT, Swing, JavaFX & SWT 2
R JScrollPane überdeckt JPanel? AWT, Swing, JavaFX & SWT 7
H JTree in JScrollPane passt sich nicht an Größe von JPanel an AWT, Swing, JavaFX & SWT 2
S JScrollPane und BorderLayout AWT, Swing, JavaFX & SWT 1
M Mehrere Jpanel in einem JScrollPane (Layout) AWT, Swing, JavaFX & SWT 2
W Swing JScrollPane für mein Fenster AWT, Swing, JavaFX & SWT 4
A Swing Probleme mit JScrollPane AWT, Swing, JavaFX & SWT 6
F JTable mit JScrollPane AWT, Swing, JavaFX & SWT 4
I JPanel in JScrollPane verkleinert sich leider nicht .... AWT, Swing, JavaFX & SWT 2
G JScrollPane bricht am Ende der Anzeige nicht um AWT, Swing, JavaFX & SWT 2
J Swing JTextPane mit JScrollPane auf JPanel scrollen nicht AWT, Swing, JavaFX & SWT 6
W Sichtbarer Bereich JScrollPane vs. JList AWT, Swing, JavaFX & SWT 3
B Swing JPanel in JScrollPane einfügen AWT, Swing, JavaFX & SWT 2
S 2D-Grafik Transparentes JScrollPane AWT, Swing, JavaFX & SWT 0
S 3D-Grafik 3d Grafik auf einem JPanel oder im JScrollPane AWT, Swing, JavaFX & SWT 1
R Ändern Default-Verhalten von JScrollpane in einer JScrollpane AWT, Swing, JavaFX & SWT 1
S JScrollPane --> Programm hängt sich beim scrollen auf AWT, Swing, JavaFX & SWT 2
A JScrollPane - ScrollBar Buttongröße verändern AWT, Swing, JavaFX & SWT 1
J Bilder auf JPanel (im JScrollPane) nacheinander laden AWT, Swing, JavaFX & SWT 0
H Swing JScrollPane mit "viel Inhalt" scrollt zu langsam (inkl. See-For-Yourself.jar :D) AWT, Swing, JavaFX & SWT 2
T Swing JScrollPane in JPanel - Breite dynamisch, Höhe fix - wie? AWT, Swing, JavaFX & SWT 2
K Bug in JScrollPane? AWT, Swing, JavaFX & SWT 4
T Swing JScrollPane Farbe der Scrollbar AWT, Swing, JavaFX & SWT 3
M JScrollPane Header AWT, Swing, JavaFX & SWT 3
G JScrollPane über JScrollPane AWT, Swing, JavaFX & SWT 2
V LayoutManager JScrollPane verwirft Elementanordnung AWT, Swing, JavaFX & SWT 3
D Swing JScrollPane AWT, Swing, JavaFX & SWT 7
H cardlayout und jscrollpane AWT, Swing, JavaFX & SWT 14
F 2D-Grafik Skalieren der Scrollbars beim Zoomen einer JScrollPane AWT, Swing, JavaFX & SWT 4
B JScrollPane Horizontal klappt nicht. AWT, Swing, JavaFX & SWT 4
G JScrollPane reagiert nicht auf Änderung der JPanel-Größe AWT, Swing, JavaFX & SWT 4
C jPanel auf jScrollPane zentrieren AWT, Swing, JavaFX & SWT 3
M Swing JScrollPane (Parent JTextArea) aktualisieren + neue Zeile AWT, Swing, JavaFX & SWT 5
U Swing JPane und JScrollpane in JSplitpane-Seite: Scrollen funktioniert nicht AWT, Swing, JavaFX & SWT 3
A Swing Korrekte JTable.rowAt(point) für JTable in JScrollPane AWT, Swing, JavaFX & SWT 5
D Label über JScrollPane AWT, Swing, JavaFX & SWT 3
S JScrollPane reagiert nicht AWT, Swing, JavaFX & SWT 3
X JScrollPane zu JTable hinzufügen AWT, Swing, JavaFX & SWT 16
H JScrollPane - JEditorPane und HTML-Tabelle AWT, Swing, JavaFX & SWT 2
D LayoutManager JScrollPane mit dynamischem Inhalt AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen


Oben