Проблема изменения размеров JScrollPane и JTabbedPane - PullRequest
3 голосов
/ 04 марта 2010

У меня проблема с изменением размера некоторых моих компонентов в Java-приложении. Когда я изменяю размер моего основного JFrame, они сохраняют свой прежний размер вместо заполнения окружающего компонента.

Например, у меня в программе есть JTabbedPane на вкладке другого JTabbedPane (который находится внутри основного JFrame). Я делаю вкладки, добавленные во внутреннюю JTabbedPane, заполняем все окружающее пространство с помощью различных .setPreferredSize (). И затем, когда я изменяю размер JFrame, перетаскивая угол окна, вкладки из внешнего JTabbedPane изменяют размеры очень хорошо, но расположенное в нем JTabbedPane остается прежним.

То же самое происходит, когда я тестирую его с помощью JScrollPane: внешнее изменение размера JTabbedPane с помощью JScrollPane остается неизменным.

Здесь ниже приведен код для создания панелей с вкладками на случай, если вы увидите что-то очевидное, которое я пропустил. Это объекты tabPane / jsp в createEndGamePane (), которые не изменят размер при изменении размера JFrame. mainTabPane изменяет размеры, как и должно.

class MyFrame extends JFrame {
   private JTabbedPane mainTabPane;
   private JPanel endGameInfo;
   //....

   private void createTabbedCenterPane(){
       this.mainTabPane = new JTabbedPane();

       this.endGameInfo = new JPanel();

       this.createEndGamePane();

       this.mainTabPane.addTab("Turneringschema", null, this.scheduleHolder, "Spelschemat för turneringen");
       this.mainTabPane.addTab("Grupper & Pooler", null, this.poolInfo, "Information om grupper, lag och pooler");
       this.mainTabPane.addTab("Slutspelsträd", null, this.endGameInfo, "Information om slutspelen");

       this.add(this.mainTabPane, BorderLayout.CENTER);
    }

    private void createEndGamePane(){
        JTabbedPane tabPane = new JTabbedPane();
        tabPane.setPreferredSize(this.endGameInfo.getSize());

        for (int i = 0; i < this.tournament.data.getGroups().size(); i++) {
            EndGame e = this.tournament.data.getEndGames().get(i);;

            //Create the gameTree
            EndGameTreeCanvas gameTree = new EndGameTreeCanvas(e, this.endGameInfo.getSize());

            //Create the ScrollPane
            JScrollPane jsp = new JScrollPane(gameTree);
            jsp.setPreferredSize(tabPane.getSize());
            jsp.setBorder(BorderFactory.createEmptyBorder());


            //Add to the endGameIndo panel
            tabPane.addTab(this.tournament.data.getGroups().get(i).getName(), jsp);
        }

        this.endGameInfo.add(tabPane);
    }

}

Ответы [ 3 ]

1 голос
/ 04 марта 2010

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

JTabbedPane tabs = new JTabbedPane();
JScrollPane inner1 = new JScrollPane(myOtherComponent);
tabs.add("Scroll", inner1);
JTabbedPane inner2 = new JTabbedPane();
tabs.add("Tabs", inner2);

И это все. Нет setPreferredSize().

0 голосов
/ 05 марта 2010

Как уже говорили другие, вам нужно использовать менеджеры по расположению для обработки требований к вашему графическому интерфейсу.

Однако я рекомендую, чтобы ваш основной менеджер компоновки был макетом на основе таблицы, например MatrixLayout , MigLayout , TableLayout или любым из ряда других бесплатных из них.

Использование макета на основе таблицы упростит кодирование GUI примерно на порядок, потому что это значительно сократит объем вложенности макета. Я считаю, что 90% моего GUI выполняется с помощью одного менеджера компоновки, а остальные 10% основаны на более простых менеджерах компоновки, предоставляемых в Java.

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

0 голосов
/ 04 марта 2010

Вы должны прочитать учебник по разметке свинга: http://java.sun.com/docs/books/tutorial/uiswing/layout/index.html

Менеджер раскладки, который я предпочитаю, это gridbaglayout, который обеспечивает максимальную гибкость (http://java.sun.com/docs/books/tutorial/uiswing/layout/gridbag.html).вам не следует использовать BorderLayout.CENTER, если вы хотите, чтобы компонент заполнил все доступное пространство вокруг него.

пример с менеджером gridbaglayout:

this.add(this.mainTabPane,
  new GridBagConstraints(
    0,0, // position
    1,1, // size
    1.0,1.0, // fill ratio
    GridBagConstraints.CENTER, GridBagConstraints.BOTH, // position inside the cell
    new Insets(2,2,2,2),0,0)); // margins
...