在JTabbedPane中“自动”更改选定的选项卡

时间:2015-02-12 07:34:29

标签: java swing jtabbedpane

我第一次使用Java swing,我遇到了一个无法解决的问题。

我有一个带有3个标签的JTabbedPane,我需要更改为下一个标签"自动"在计算结束时,从JButton中的单击开始(在其中一个选项卡中)。 我曾尝试使用setSelectedIndex(),但无法正常工作。 在JButton的ActionEvent之后,所选标签(在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);
}

我将添加到JTabbedPane的JPanel示例

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)
    }
}

我的听众

我希望你理解我的问题。 请帮助我,我真的不知道我做了什么让它成功,我需要这样做。

3 个答案:

答案 0 :(得分: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);
        }
    }

}

答案 1 :(得分:0)

感谢您的回答。

我检查了我的代码,但我发现了一个实例问题。我正在更改窗口的另一个实例,而不是可见的。所以,当我修复它时,更新有效。

再次感谢。

答案 2 :(得分:0)

变更监听器类似于属性变更监听器。更改侦听器注册在一个对象(通常是组件)上,但它可以是另一个对象(例如模型),并且在对象发生更改时会通知侦听器。与属性更改侦听器的最大区别在于,不会向更改侦听器通知发生了什么更改,而只是通知源对象已更改。因此,当仅需要知道对象何时以任何方式发生更改时,更改侦听器最为有用。

类似地,您需要在按钮(或带有状态的切换按钮)上注册一个更改侦听器,以便在计算停止并且按钮的值更改时得到通知。

//use some flag to determine when calculation process is actually finished
volatile boolean isCalculationEnds = true;  

button.addChangeListener((ChangeEvent e) -> {
 if (tabbedPane.getSelectedComponent() instanceof CustomPanel && isCalculationEnds) {
     //do something 
     }

 if (tabbedPane.getSelectedIndex()==1 && isCalculationEnds){
   //do something
 });