1

3 つのタブを持つ JTabPanel があり、そのうちの 2 つが無効になっています。コンテンツが与えられたときにそれらを有効にしたい (そうしないと、フィールドやボックスの一部が空白または無意味になる)。

タブが有効か無効かを設定する唯一の方法はsetEnabledAt、タブ インデックスとブール値に int を渡すことです。タブのインデックスを何かに渡す唯一の方法はindexOfTabComponent、パネルを使用して渡すことです....これは恐ろしいようで、機能しません。インデックス 1 のタブにjava.lang.ArrayIndexOutOfBoundsException: -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 に答える