簡體   English   中英

JScrollPane未顯示JSplitPane內部的滾動條

[英]JScrollPane not showing the scroll bars inside a JSplitPane

我有這段代碼,基本上是一個JFrame,其中包含一個JSplitPane,該JSplitPane在左側包含一個JScrollPane,該JScrollPane包含一個JPanel。 我期望看到滾動條,因為JScrollPane內的JPanel大於JScrollPane本身。 為什么滾動條不顯示? 如果我將setSize()替換為setPreferredSize(),則可以使用,但我想使用setSize()。 有什么方法可以使用setSize()並顯示滾動條嗎?

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

public class Test {

    public static void main( String[] args ) {
        JFrame frame = new JFrame();
        frame.setLayout( new BorderLayout() );
        JSplitPane splitPane = new JSplitPane();
        frame.add( splitPane, BorderLayout.CENTER );
        JPanel panel = new JPanel();
        panel.setBackground( Color.red );
        panel.setSize( 1920, 1200 );
        //panel.setPreferredSize( new Dimension( 1920, 1200 ) );
        JScrollPane scrollPane = new JScrollPane( panel );
        splitPane.setLeftComponent( scrollPane );
        splitPane.setRightComponent( new JPanel() );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible( true );
        frame.setSize( 960, 600 );
    }
}

編輯:我添加了一個修改后的版本,其中使用了setPreferredSize()。 是否有更好的解決方案來動態更改大小?

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Test {

    public static void main( String[] args ) {
        JFrame frame = new JFrame();
        frame.setLayout( new BorderLayout() );
        JSplitPane splitPane = new JSplitPane();
        frame.add( splitPane, BorderLayout.CENTER );
        final JPanel panel = new JPanel();
        panel.setBackground( Color.red );
        panel.setPreferredSize( new Dimension( 1920, 1200 ) );
        JScrollPane scrollPane = new JScrollPane( panel );
        splitPane.setLeftComponent( scrollPane );
        JButton button = new JButton();
        button.addActionListener( new ActionListener() {

            @Override
            public void actionPerformed( ActionEvent e ) {
                panel.setPreferredSize( new Dimension( 3840, 2400 ) );
                panel.revalidate();
            }
        });
        splitPane.setRightComponent( button );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible( true );
        frame.setSize( 960, 600 );
    }
}

您的setSize將被JSplitPane忽略,因為左/右組件的布局不為null ,並且它嘗試將內部組件放入可用空間中。

JSplitPane的左/右組件的布局管理器將使用preferredSize屬性(而不是size屬性),並且如果尚未設置,它只會嘗試將內部組件放入該組件的左/右區域的可用空間內。 JSplitPane

改用setPreferredSize或按注釋中所述的camickr覆蓋面板的getPreferredSize方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM