VenomBlet
VenomBlet

Reputation: 1

Tabbedpane change tabs position Java Swing

I have i situation when my Tabbedpane have 3 tabs and then I choose someone of them, it sets in first position and move whole tabs.

before click

clicked on Store

I couldn't find in Internet anything like that, everyone has fixed positions of their tabs. How to fix tabs?

//EDITED

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

public class Main {
    public static void main(String[] args) {
        
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (UnsupportedLookAndFeelException | ClassNotFoundException | InstantiationException |
                 IllegalAccessException e) {
            throw new RuntimeException(e);
        }

        JFrame frame = new JFrame("Somest");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200, 200);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        JPanel UpperPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.RIGHT, JTabbedPane.WRAP_TAB_LAYOUT);
        tabbedPane.addTab("Calculation", new JLabel());
        tabbedPane.addTab("Store", new JLabel());
        tabbedPane.addTab("Settings", new JLabel());
        UpperPanel.add(tabbedPane);
        frame.add(UpperPanel);
    }

}

Find out that try {...} "enable" this problem. Used try {...} to change JChooser from standard to more-or-less Windows chooser view. What I have to do?

Upvotes: 0

Views: 131

Answers (1)

Michael
Michael

Reputation: 721

The reason is that this is implemented differently in various Look and Feel implementations (See here, section 6.2.1):

[...] selecting a tab that is not in the frontmost row or column moves that row or column to the front. This does not occur in a JTabbedPane using the default Metal L&F as can be seen in the TabbedPaneDemo example above. However, this does occur when using the Windows, Motif, and Basic L&Fs. This feature was purposefully disabled in the Metal L&F [...]

The responsible method is shouldRotateTabRuns(...) and returns true or false in various TabbedUI implementations (see Metal L&F vs. Basic L&F).

To prevent tab rotation, you could overwrite like this:

public class TabExample extends JFrame {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (UnsupportedLookAndFeelException e) {
                    e.printStackTrace();
                }

                TabExample app = new TabExample();
                app.setVisible(true);
            }
        });
    }

    private TabExample() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(800, 500);
        setLocationRelativeTo(null);
        setVisible(true);

        JPanel UpperPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.RIGHT, JTabbedPane.WRAP_TAB_LAYOUT);

        // Check if TabbedPaneUI is instance of WindowsTabbedPaneUI
        // You may add checks for other L&F
        if (tabbedPane.getUI() instanceof com.sun.java.swing.plaf.windows.WindowsTabbedPaneUI) {
            tabbedPane.setUI(new MyWindowsTabbedPaneUI());
        }

        tabbedPane.addTab("Calculation", new JLabel());
        tabbedPane.addTab("Store", new JLabel());
        tabbedPane.addTab("Settings", new JLabel());
        UpperPanel.add(tabbedPane);
        add(tabbedPane, BorderLayout.NORTH);
    }

    // Class that overwrites WindowsTabbedPaneUI and returns false
    class MyWindowsTabbedPaneUI extends com.sun.java.swing.plaf.windows.WindowsTabbedPaneUI{

        @Override
        protected boolean shouldRotateTabRuns(int tabPlacement) {
            return false;
        }

    }

}

Upvotes: 1

Related Questions