3

JTabbedPaneは、私が自分の目的に必要なものです。水平方向のスペースが非常に限られているため、タブが積み重ねられます。これはまったく問題ありません。

ただし、デフォルトの動作では、ユーザーがタブをクリックすると、*タブが再ソートされ、アクティブなタブが下位の*tになります。理論的には非常に直感的で論理的に見えるのは、ユーザーが「どちらがどちらであったか」を見失ってしまうため、実際の使用では悪夢です。それは単に紛らわしいだけで、私は何度も何度も言われます。

この動作を回避するために、UIのいくつかのメソッドをオーバーライドすることが可能であると思います(そして、これが紙のカードで物理的に可能かどうかは気にしません:-)。

誰かが私がそれをする必要がある場所について何か考えがありますか?私はニンバスLAFを使用していますが、それは簡単ではないようです。

(radiobuttons / cardLayoutを使用することを考えましたが、タブのタイトルにカスタムパネルを配置する必要があり、ラジオボタンには文字列またはアイコンしか含めることができません。JToggleButtonについても同じです...)

ヒントは大歓迎です!

ありがとう&親切よろしく、フィリップ

4

3 に答える 3

3

Containers#Sizeがタブを2つ以上にパックした場合、Nimbus L&fの潜在的な回答者のsscce(別のL&fを使用してこの面白い問題を再現することはできません)Linesここに画像の説明を入力してくださいここに画像の説明を入力してください

私が知っているように、aephyrによる可能な解決策は( NimbusTabbedPaneUIをオーバーライドせずに) 1つだけです。

sscceから

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

public class TabbedPane {

    private static final long serialVersionUID = 1L;

    public TabbedPane() {
        JPanel jp = new JPanel();
        jp.setLayout(new BorderLayout());
        JTabbedPane tb = new JTabbedPane();
        //tb.setUI(new CustomTabbedPaneUI());
        tb.add("Tab1", new JTextArea(10, 20));
        tb.add("Tab2", new JTextArea(10, 20));
        tb.add("Tab3", new JTextArea(10, 20));
        tb.add("Tab4", new JTextArea(10, 20));
        tb.add("Tab5", new JTextArea(10, 20));
        jp.add(tb, BorderLayout.CENTER);
        //add(jp, BorderLayout.CENTER);
        //tb.setEnabledAt(1, false);
        //tb.setEnabledAt(3, false);
        JFrame frame = new JFrame();
        frame.setLayout(new BorderLayout());
        frame.add(jp, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        try {
            for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (Exception system) {
            system.printStackTrace();
        }
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                TabbedPane tP = new TabbedPane();
            }
        });
    }
}
于 2011-09-20T08:55:35.850 に答える
2

さて、私は問題を見つけました。の

package javax.swing.plaf.basic.BasicTabbedPaneUI;

こんな感じ

// Rotate run array so that selected run is first
            if (shouldRotateTabRuns(tabPlacement)) {
                rotateTabRuns(tabPlacement, selectedRun);
            }

簡単な旗を立てる方法がないように思われるのは残念ですが、それを変えるのは残念です。

呼び出しを省略しrotateTabRuns(tabPlacement, selectedRun);たり、変更shouldRotateTabRuns(tabPlacement)したりしても問題ないはずですが、そうするには、使用するプラフに応じて、多数のクラス全体をオーバーライドする必要があります。

このように受け継ぐ

Basic > Synth > Nimbus

そして、各L&Fレベルには、カスタマイズするいくつかのクラスがあります...私は数えませんでした。

それが役に立てば幸い!:D

編集 そうそう...@mkorbelはすでにこのaephyrである種の解決策を提供しているので、それを使用してみませんか?

于 2011-11-21T10:01:05.103 に答える
1

これはちょっとしたハックですが、Nimbusのデフォルトをオーバーライドして、他のすべてを同じに保ちながら、タブ付きペインのプレーンな古いJavaルックアンドフィールを使用できます。タブ付きペインのプレーンJavaルックアンドフィールは、煩わしい並べ替えを行いません。ルックアンドフィールを設定する前にデフォルトを保存してから、元に戻します。

// get the defaults to keep
HashMap<Object, Object> defaultsToKeep = new HashMap<>();
for (Map.Entry<Object, Object> entry : UIManager.getDefaults().entrySet()) {
    boolean isStringKey = entry.getKey().getClass() == String.class ;
    String key = isStringKey ? ((String) entry.getKey()):"";    
    if (key.startsWith("TabbedPane")) {
        defaultsToKeep.put(entry.getKey(), entry.getValue());
    }
}

// set nimbus look and feel
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
    if ("Nimbus".equals(info.getName())) {
        UIManager.setLookAndFeel(info.getClassName());
        break;
    }
}

// set back your originals
for (Map.Entry<Object, Object> entry : defaultsToKeep.entrySet()) {
    UIManager.getDefaults().put(entry.getKey(), entry.getValue());
}

JFrame.setDefaultLookAndFeelDecorated(true);
于 2015-09-18T09:00:23.230 に答える