Несколько вкладок в JTabbedPane с использованием одного JPanel? - PullRequest
3 голосов
/ 19 сентября 2011

Можно ли использовать один JPanel для нескольких элементов табуляции в JTabbedPane?

EG:

JTabbedPanel tabs=new JTabbePanel();

JPanel panel=new JPanel();
JButton but=new JButton("TEXT");
but.addActionlistener(this);
panel.add(but)

tabs.add("First",panel);
tabs.add("Second",panel);

ActionListener добавляется к JTabbedPane для уведомления программы об изменениях вкладок (измените cur_tab на номер вкладки)

public void actionPerformed(..)
{ System.out.println("Now in "+cur_tab); }

Ответы [ 6 ]

5 голосов
/ 19 сентября 2011

Один и тот же компонент нельзя использовать для нескольких вкладок

взято из здесь

4 голосов
/ 19 сентября 2011

Похоже, вам нужен подкласс JPanel. Просто создайте абстрактный класс, который обрабатывает сложный макет и подклассы создают необходимые элементы графического интерфейса.

Если вы просто вставляете одно текстовое поле, кнопку и т. Д., Вам может даже не потребоваться подклассы для каждой вкладки. Просто создайте несколько экземпляров базового класса и добавьте нужный вам компонент.

Новые панели и другие элементы графического интерфейса относительно дешевы. Проблемы с производительностью в графическом интерфейсе Swing чаще возникают из-за обработки событий или запуска слишком большого числа событий, а не из-за их сложности и количества компонентов. Сделайте вещи проще в обслуживании и понимании, а затем беспокойтесь о производительности.

2 голосов
/ 19 мая 2015

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

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

Немного хак, но работает нормально.

2 голосов
/ 19 сентября 2011

если вы создадите класс, который возвращает JPanel, тогда да, это возможно

но обратите внимание:

существует долгое время Ошибка, что две Tabs не могут содержать одинаковые схемы компонентов, со схемами, которые я имею в виду, например, одна Tab содержит JPanel + JTextField + JButton, но тогда вторая JPanel должна содержать другую Numbers or Type of JComponents

к сожалению (ничего особенного) BugsDatabase в данный момент недоступен

0 голосов
/ 29 апреля 2016

Следующее позволит вам добавить один и тот же компонент с разными заголовками в JTabbedPane:

JTabbedPane tabbedPane = new JTabbedPane()
    {
      boolean adding = false;
      @Override
      public void removeTabAt(int index)
      {
        if(!adding)
        {
          super.removeTabAt(index);
        }
      }

      @Override
      public void insertTab(String title, Icon icon, Component component, String tip, int index)
      {
        adding = true;
        super.insertTab(title, icon, component, tip, index);
        adding = false;
      }
    };
0 голосов
/ 16 января 2016

Вы не правы. Просто установите панель на первой вкладке в функции initComponents () следующим образом:

 p.add("1", MainPanel);

Тогда используйте:

p.add("2", p.getTabComponentAt(0));

С помощью этого метода у вас будет один и тот же компонент на 2 вкладках.

Вы можете использовать StateChanged Event для изменения действий на этих вкладках. Например:

JTabbedPane p = (JTabbedPane)Tabbar;
int idx = p.getSelectedIndex();
   if(idx==0){
     Do something...
    }
   if(idx==1){
     Do something different...
    }
...