1

我有一个带有三个选项卡的 JTabPanel,其中两个开始禁用。我希望在获得内容后启用它们(否则某些字段和框是空白和/或无意义的)。

似乎设置选项卡是启用还是禁用的唯一方法是setEnabledAt为选项卡索引和布尔值传递一个 int。我能找到将选项卡的索引传递给某些东西的唯一方法是使用indexOfTabComponent并传入面板以交换到....这看起来很可怕,而且不起作用。java.lang.ArrayIndexOutOfBoundsException: -1当我尝试切换到索引 1 处的选项卡时,我得到了。

还有比这更好的方法吗?

public void swapView(JPanel paneToSelect) {
    myContainerPane.getMyPaneTab().setSelectedComponent(paneToSelect);
    myContainerPane.getMyPaneTab().setEnabledAt(myContainerPane.getMyPaneTab().indexOfTabComponent(paneToSelect), true);
}

我能想到的唯一解决方案是在索引号上加 2……但感觉应该有更好的方法来做到这一点。

4

3 回答 3

2

要使用的正确代码是:

public void swapView(JPanel paneToSelect) {
    int index = myContainerPane.getMyPaneTab().indexOfComponent(paneToSelect);
    myContainerPane.getMyPaneTab().setSelectedIndex(index);
    myContainerPane.getMyPaneTab().setEnabledAt(index, true);
}

不同之处在于,无论出于何种原因indexOfTabComponent,不适用于我的设置。

于 2012-07-27T13:47:01.180 回答
1

订购从零开始:-)

在此处输入图像描述 ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 在此处输入图像描述

例如 :-)

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class TabbedPane {

    private static final long serialVersionUID = 1L;

    public TabbedPane() {
        JPanel jp = new JPanel();
        jp.setLayout(new BorderLayout());
        final JTabbedPane tb = new JTabbedPane();
        //tb.setUI(new CustomTabbedPaneUI());
        JButton btn = new JButton("push me !!!");
        btn.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                tb.setEnabledAt(1, true);
                tb.setEnabledAt(2, true);
                tb.setEnabledAt(3, true);
                tb.setEnabledAt(4, true);
            }
        });
        JPanel pnl = new JPanel();
        pnl.add(btn);
        tb.add("Tab1", pnl);
        tb.add("Tab2", new JTextArea(10, 20));
        tb.add("Tab3", new JTextArea(10, 20));
        tb.add("Tab4", new JTextArea(10, 20));
        tb.add("Tab5", new JTextArea(10, 20));
        jp.add(tb, BorderLayout.CENTER);
        //add(jp, BorderLayout.CENTER);
        tb.setEnabledAt(1, false);
        tb.setEnabledAt(2, false);
        tb.setEnabledAt(3, false);
        tb.setEnabledAt(4, false);
        JFrame frame = new JFrame();
        frame.setLayout(new BorderLayout());
        frame.add(jp, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        try {
            for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (Exception system) {
            system.printStackTrace();
        }
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                TabbedPane tP = new TabbedPane();
            }
        });
    }
}
于 2012-07-27T12:51:12.497 回答
1

选择后,您可以getSelectedIndex改用。

或者您可以使用标签标题,但这意味着您知道它并将您与命名联系起来。

int index = myContainerPane.getMyPaneTab().indexOfTabComponent(paneToSelect);
myContainerPane.getMyPaneTab().setSelectedIndex(index);
myContainerPane.getMyPaneTab().setEnabledAt(index, true);

想到的唯一其他选择是扩展基类并实现您的方法以实现确保的结果

于 2012-07-27T13:00:25.610 回答