5

タブと SCROLL に設定された Nimbus L&F TabbedPane のコンテンツとの間の青い水平の仕切りがありません (他の L&F (デフォルト & ウィンドウ) がそれらを提供します)。

ここに画像の説明を入力

ご覧のとおり、問題はnew JTabbedPane(JTabbedPane.TOP, JTabbedPane.SCROLL_TAB_LAYOUT)(写真の上) に限定されていますが、WRAP のデフォルトではこの動作は見られません (写真の下)。

の一部をオーバーライドすることで、このような変更が可能になるはずNimbusDefaults.classです。ここに抜粋があります:

//Initialize TabbedPane
    d.put("TabbedPane.contentMargins", new InsetsUIResource(0, 0, 0, 0));
    d.put("TabbedPane.tabAreaStatesMatchSelectedTab", Boolean.TRUE);
    d.put("TabbedPane.nudgeSelectedLabel", Boolean.FALSE);
    d.put("TabbedPane.tabRunOverlay", new Integer(2));
    d.put("TabbedPane.tabOverlap", new Integer(-1));
    d.put("TabbedPane.extendTabsToBase", Boolean.TRUE);
    d.put("TabbedPane.useBasicArrows", Boolean.TRUE);
    addColor(d, "TabbedPane.shadow", "nimbusDisabledText", 0.0f, 0.0f, 0.0f, 0);
    addColor(d, "TabbedPane.darkShadow", "text", 0.0f, 0.0f, 0.0f, 0);
    ... more ...

Nimbus が WRAP と SCROLL をどこでどのように区別しているかがわかりません。.put()そこにたどり着くために必要な魔法を教えてください。

前もって感謝します!

4

1 に答える 1

2

ご担当者様:

同僚が問題の原因を発見しました。の:

package javax.swing.plaf.synth.SynthTabbedPaneUI;

それは言います:

protected void paint(SynthContext context, Graphics g) {
    int selectedIndex = tabPane.getSelectedIndex();
    int tabPlacement = tabPane.getTabPlacement();

    ensureCurrentLayout();

// Paint tab area
// If scrollable tabs are enabled, the tab area will be
// painted by the scrollable tab panel instead.
//
if (!scrollableTabLayoutEnabled()) { // WRAP_TAB_LAYOUT

        [...]

        // Here is code calculating the content border

        [...]

    }

    // Paint content border
    paintContentBorder(tabContentContext, g, tabPlacement, selectedIndex);
}

ご覧のとおり、 scrollableTabLayout は、仕切りのサイズが計算される次のコードから除外されています。ブラケットをたどると、後で表示されますが、後でペイントされますが、パラメーターが間違っています。これにより、タブがコンテンツの TOP または LEFT に設定されている場合、仕切りが省略されるという動作が発生します。RIGHT または BOTTOM に設定すると、実際には分割線が表示されますが、壊れています (コンテンツへの境界線が太すぎ、全体的に十分な長さではありません。

Synth から Nimbus までのすべてをオーバーライドするには、かなりの労力が必要になります。

したがって、より簡単なルートを使用することをお勧めします。

uiDefaults.put("TabbedPane:TabbedPaneTabArea.contentMargins", new InsetsUIResource(3, 10, 0, 10));    

これにより、下部のギャップがタブに取り除かれ、コンテンツ パネルの上部の縁に「偽の」仕切りを配置できます。しかし、それが私たちがそれを処理する方法です。

それが役に立てば幸い。楽しみ!

于 2011-11-21T11:52:28.697 に答える