JTabbedPane: избегать автоматического переупорядочивания вкладок, если они сложены / Nimbus - PullRequest
3 голосов
/ 20 сентября 2011

JTabbedPane - это как раз то, что мне нужно для моих целей. У меня очень ограниченное горизонтальное пространство, поэтому мои вкладки складываются, что совершенно нормально.

Но поведение по умолчанию состоит в том, что если пользователь нажимает на вкладку, вкладки * пересортируются, так что активная вкладка становится более низкой * t. То, что выглядит очень интуитивно и логично в теории, является практическим кошмаром, потому что пользователи теряют «что было». Мне просто повторяют снова и снова.

Я полагаю, что должна быть возможность переопределить какой-либо метод пользовательского интерфейса, чтобы избежать такого поведения (и мне все равно, будет ли это физически возможно с бумажными карточками :-).

Кто-нибудь знает, где мне нужно это сделать? Я использую Nimbus LAF, который, кажется, не облегчает.

(Я думал об использовании radiobuttons / cardLayout, но мне нужно поместить пользовательскую панель в заголовок вкладки, а у radiobuttons может быть только строка или значок. То же самое для JToggleButton ...)

Любые советы приветствуются!

Спасибо и всего наилучшего, Philipp

Ответы [ 3 ]

3 голосов
/ 20 сентября 2011

sscce для потенциального ответчика (ей) для Nimbus L & f (при использовании другого L & f невозможно воспроизвести эту смешную проблему), в случае, если Контейнеры # Размер упакованы Вкладки для двух или более Lines, enter image description hereenter image description here

как я знаю, есть только одно возможных решений (без переопределения NimbusTabbedPaneUI) с помощью aephyr

от 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();
            }
        });
    }
}
2 голосов
/ 21 ноября 2011

Хорошо, я нашел проблему.В

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 почему бы не использовать это?

1 голос
/ 18 сентября 2015

Это что-то вроде хака, но вы можете переопределить настройки 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);
...