2015-02-12 5 views
1

Я использую Java swing в первый раз, и у меня есть проблема, которую я не могу решить.изменить выбранную вкладку в JTabbedPane «автоматически»

У меня есть JTabbedPane с 3 вкладками, и мне нужно перейти на следующую вкладку «автоматически» в конце вычислений, которая начинается щелчком в JButton (на одной из вкладок). Я пытался использовать setSelectedIndex(), но не работает. После того, как выбранная вкладка JButton (напечатанная в консоли eclipse) изменилась, но в GUI не действует.

Да, я попробовал validate(), revalidate() методы, даже метод repaint(), но не работает

Вот пример моего кода

public class Tab1 extends JPanel { 
    //when click on this button the computing starts 
    JButton btn = new JButton("Compute..."); 
    btn.addActionListener(new BtnListener()); 
    add(btn); 
} 

Пример из JPanel который я добавлю в мой JTabbedPane

public class Window() { 

    private JFrame frame; 

    public Window() { 
     init(); 
    } 

    private void init() { 
     frame = new JFrame(); 
     JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP); 

     JPanel tab1 = new Tab1(); 
     JPanel tab2 = new Tab2(); 
     JPanel tab3 = new Tab3(); 

     tabbedPane.addTab("tab 1", null, tab1, "tab1"); 
     tabbedPane.addTab("tab2", null, tab2, "tab2"); 
     tabbedPane.addTab("tab3", null, tab3, "tab3"); 

     //add() all components 
    } 
} 

Пример моего окна

public class BtnListener implements ActionListener { 
    public void actionPerformed(ActionEvent event) { 
     //make the computing 
     //then I need to change to next tab (tab2) 
    } 
} 

И мой Слушатель

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

+2

Подробнее о multithreadin в swing здесь: http://docs.oracle.com/javase/tutorial/uiswing/concurrency/ –

+0

Отправьте справку [MCVE] (http://stackoverflow.com/help/mcve). – alex2410

ответ

1

При переключении вкладок вам не нужно использовать revalidate()/repaint() только setSelectedIndex().

Вот пример перехода на следующую вкладку:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTabbedPane; 

public class TestFrame extends JFrame { 

    public static void main(String... s) { 
     new TestFrame(); 
    } 

    private JTabbedPane tabs; 

    public TestFrame() { 
     init(); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    private void init() { 
     tabs = new JTabbedPane(); 

     tabs.addTab("1", new Tab(1)); 
     tabs.addTab("2", new Tab(2)); 
     tabs.addTab("3", new Tab(3)); 
     add(tabs); 
    } 

    private class Tab extends JPanel { 

     public Tab(int i) { 
      JButton next = new JButton("next"); 
      next.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        int selectedIndex = tabs.getSelectedIndex(); 
        int nextIndex = selectedIndex == tabs.getTabCount()-1 ? 0 : selectedIndex+1; 
        tabs.setSelectedIndex(nextIndex); 
       } 
      }); 
      add(new JLabel("tab " + i)); 
      add(next); 
     } 
    } 

} 
+0

Я думаю, автор делает огромные вычисления в EDT. Это его/ее ошибка. –

+0

@ СергийМедвинский может быть, вы правы. Но, как написано в слушателе 'BtnListener', вычисляется, а затем переключается, это должно работать с некоторой задержкой. – alex2410

0

Спасибо за ответы.

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

Еще раз спасибо.

Смежные вопросы