簡體   English   中英

如何使JTabbedPane自動調整大小以適應頁面尺寸?

[英]How to make JTabbedPane autoresize to fit page dimensions?

我在JFrame中只有JTabbedPane。 JTabbedPane將其尺寸設置為最大頁面寬度/高度。 由於頁面大小不同,是否可以在選擇其他頁面時強制JTabbedPane更改其尺寸?

http://grab.by/3hIg

最重要的一個是它現在的行為,最底層的是我希望它如何表現(我手工調整大小)

這很簡單。 它涉及動態計算頁面尺寸之間的差異,並使用它們來強制JTabbedPane上的首選大小。 我做了一個快速的實驗並且有效。 所以不是在這里放置大量文本 - 這里是代碼。 這不完美,但你應該有個主意。 當然,歡迎提出問題。

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Test {

    private static int maxW = 0;
    private static int maxH = 0;

    public static void main(String[] args) {


        final JFrame f = new JFrame();

        final JTabbedPane tabs = new JTabbedPane();

        tabs.add( createPanel(Color.RED, 100, 100), "Red");
        tabs.add( createPanel(Color.GREEN, 200, 200), "Green");
        tabs.add( createPanel(Color.BLUE, 300, 300), "Blue");

        final Dimension originalTabsDim = tabs.getPreferredSize();

        tabs.addChangeListener(new ChangeListener() {

            @Override
            public void stateChanged(ChangeEvent e) {

                Component p =   ((JTabbedPane) e.getSource()).getSelectedComponent();
                Dimension panelDim = p.getPreferredSize();

                Dimension nd = new Dimension(
                        originalTabsDim.width - ( maxW - panelDim.width),
                        originalTabsDim.height - ( maxH - panelDim.height) );

                tabs.setPreferredSize(nd);

                f.pack();
            }

        });

        f.setContentPane(tabs);
        f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        f.pack();
        f.setLocationRelativeTo(null);

        f.setVisible(true);


    }

    private static final JPanel createPanel( Color color, int w, int h ) {

        JPanel p = new JPanel();
        p.setBackground(color);
        p.setPreferredSize( new Dimension(w, h));

        maxW = Math.max(w, maxW);
        maxH = Math.max(h, maxH);

        return p;

    }

}

我認為另一種選擇是在選擇選項卡時動態更改每個選項卡的面板:

  1. JTabbedPane選擇上安裝一個監聽器
  2. 默認情況下,在每個選項卡上安裝一個空面板,但選中的選項卡(包含該選項卡的實際面板)
  3. 在選擇監聽器中:
    • 從先前選定的選項卡中刪除面板(即,將其替換為空面板)
    • 通過新選擇的選項卡中的實際面板更改空面板
    • 在包含JTabbedPane的窗口/對話框上調用pack()

免責聲明 :我沒有測試過這種方法,但我相信它應該按照你想要的方式工作。

另請注意,從純GUI角度來看,基於所選選項卡動態更改對話框的大小不是非常用戶友好。

這個怎么樣?

tabbedPane.addChangeListener(new ChangeListener(){

    @Override
    public void stateChanged(ChangeEvent arg0) {
        Component mCompo=tabbedPane.getSelectedComponent();
        tabbedPane.setPreferredSize(mCompo.getPreferredSize());
        BasicFrame.this.pack();
    }   
});

暫無
暫無

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

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