Две разделенные панели на вкладке

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.JList;
import javax.swing.JSplitPane;
import javax.swing.JLabel;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.event.ListSelectionEvent;


public class MenuPage extends JFrame{

    final static int extraWindowWidth = 100;

    JSplitPane jSplitPane, jSplitPane2,jSplitPane3,jSplitPane4;
    JPanel jPanel2a, jPanel2b, jPanel3;

    public static JFrame frame; 

    public MenuPage(){
    }

    private final JList<String> list1=new JList<>(new String[]{"A","B"});
    private final JList<String> list2 = new JList<>();
    private final List<DefaultListModel> models = new ArrayList<>();



    public void addComponentToPane(Container pane) {
        JTabbedPane tabbedPane = new JTabbedPane();



        // Create the "cards".
        JPanel card1 = new JPanel() {
            // Make the panel wider than it really needs, so
            // the window's wide enough for the tabs to stay
            // in one row.
            public Dimension getPreferredSize() {
                Dimension size = super.getPreferredSize();
                size.width += extraWindowWidth;
                return size;
            }
        };


         DefaultListModel<String> model1 = new DefaultListModel<>();
            model1.addElement("A1");
            model1.addElement("A2");
            model1.addElement("A3");
            models.add(model1);
            DefaultListModel<String> model2 = new DefaultListModel<>();
            model2.addElement("B1");
            model2.addElement("B2");
            models.add(model2);
            list2.setModel(model1);
            list1.addListSelectionListener((ListSelectionEvent e) -> {
                if (!e.getValueIsAdjusting()) {
                    list2.setModel(models.get(list1.getSelectedIndex()));
                }
            });






        jPanel2a = new JPanel();
        jPanel2b = new JPanel();
        jPanel3 = new JPanel();







        jSplitPane2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, jPanel2a, jPanel2b);





        jSplitPane3 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, list1, list2);
        jSplitPane4 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,jSplitPane3,jPanel3);




        // panelin icerisine component eklendi
        JLabel lblHelloWorld = new JLabel("Hello World!");
        jPanel2a.add(lblHelloWorld);

        jSplitPane2.setOneTouchExpandable(true);
        jSplitPane2.setDividerLocation(100);


        jSplitPane3.setOneTouchExpandable(true);
        jSplitPane3.setDividerLocation(150);


        jSplitPane4.setOneTouchExpandable(true);
        jSplitPane4.setDividerLocation(300);



        JPanel card3 = new JPanel();
        JPanel card4 = new JPanel();
        JPanel card5 = new JPanel();
        JPanel card6 = new JPanel();
        JPanel card7 = new JPanel();
        JPanel card8 = new JPanel();



        card3.add(jSplitPane3,jSplitPane4);


        tabbedPane.addTab("Main", jSplitPane2);

        tabbedPane.addTab("Leagues",jSplitPane4);


        tabbedPane.addTab("Teams",card3 );
        tabbedPane.addTab("Ratios", card4);
        tabbedPane.addTab("Competitions", card5);
        tabbedPane.addTab("Analyze", card6);
        tabbedPane.addTab("Help", card7);
        tabbedPane.addTab("About", card8);

        pane.add(tabbedPane, BorderLayout.CENTER);


    }

    /**
     * Create the GUI and show it. For thread safety, this method should be
     * invoked from the event dispatch thread.
     */

    public static void createAndShowGUI() {
        // Create and set up the window.
        frame = new JFrame("BetAnalyzer");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(594, 310);

        // Create and set up the content pane.
        MenuPage demo = new MenuPage();
        demo.addComponentToPane(frame.getContentPane());

        // Display the window.
        frame.pack();
        frame.setVisible(true);
        frame.setBounds(100, 100, 635, 251);

    }
}

Я хочу, чтобы list1, list2 и jpanel3, которые принимают часть 2 JSplitPane, находились на вкладке лиги. В моем коде что-то не так. В макете может отображаться только jSplitPane3 или jSplitPane4.

Кроме того, я попытался добавить два JSplitPane в Box, затем поместил Box в панель вкладок, но это тоже не работает.


person sergen boğa    schedule 07.01.2017    source источник


Ответы (1)


В вашем коде есть несколько проблем.

не наследовать без причины

Ваш класс наследуется от JFrame, но не расширяет его поведение (он не переопределяет общедоступный или защищенный метод JFrame).

Компоненты могут быть добавлены только один раз

В отличие от других пунктов, это не проблема как таковая, а часть вашей проблемы.

 jSplitPane4 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,jSplitPane3,jPanel3);
 // ...     
 card3.add(jSplitPane3,jSplitPane4);

Когда выполняется второй оператор, jSplitPane3 удаляется из jSplitPane4 и отображается только как содержимое card3.

использование стандартных макетов

(Фиктивное) содержимое ваших панелей довольно маленькое, поэтому их preferedSize меньше доступного места в родительском контейнере.

Макет JPanels по умолчанию — FlowLayout, что уменьшает каждый из его компонентов до preferedSize.

Вы должны установить Макет ваших JPanels на BorderLayout, что позволяет его содержимому растягиваться по всему пространству.

В свою очередь, вы больше не можете использовать метод вараг JPanels .add(Component, component).


вот соответствующие изменения:

    jPanel2a = new JPanel(new BorderLayout());
    jPanel2b = new JPanel(new BorderLayout());
    jPanel3 = new JPanel(new BorderLayout());

    jSplitPane2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, jPanel2a, jPanel2b);

    jSplitPane3 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, list1, list2);
    jSplitPane4 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, jSplitPane3, jPanel3);

    // panelin icerisine component eklendi
    JLabel lblHelloWorld = new JLabel("Hello World!");
    jPanel2a.add(lblHelloWorld);

//      jSplitPane2.setOneTouchExpandable(true);
        jSplitPane2.setDividerLocation(100);
//
//      jSplitPane3.setOneTouchExpandable(true);
        jSplitPane3.setDividerLocation(150);
//
//      jSplitPane4.setOneTouchExpandable(true);
        jSplitPane4.setDividerLocation(300);

    JPanel card3 = new JPanel(new BorderLayout());
    JPanel card4 = new JPanel(new BorderLayout());
    JPanel card5 = new JPanel(new BorderLayout());
    JPanel card6 = new JPanel(new BorderLayout());
    JPanel card7 = new JPanel(new BorderLayout());
    JPanel card8 = new JPanel(new BorderLayout());

//      card3.add(jSplitPane3);
    card3.add(jSplitPane4,BorderLayout.SOUTH);

    tabbedPane.addTab("Main", jSplitPane2);
person Timothy Truckle    schedule 07.01.2017