0

JTabbedPaneこれらのオブジェクトの新しいインスタンスを作成せずにタブ間でコンポーネントを切り替える方法はありますか? またはタブを切り替える方法はありますか?

JTabbedPaneコンポーネントが経由.remove(idx)またはメソッドから削除される.removeTabAt(idx)と、コンポーネントは破棄されます。たぶん、オブジェクトの破壊を防ぐ方法はありますか?

コンポーネントを含むタブを削除して、近い将来に別のインデックスで追加する方法を探しています。

つまり、タブ オーダーを変更するだけです。ただし、コンポーネントの新しいインスタンスを作成しないことが重要です。

4

3 に答える 3

3

JTabbedPane.removeTabAtタブのみを削除しますが、タブ内に配置したコンポーネントは削除しません。したがって、特定のコンポーネントのタブを移動するには、コンポーネントの新しいタブを で新しい位置に挿入するだけでJTabbedPane.insertTab、古いタブが暗黙的に削除されます。または、自分で削除して、後で再度追加することもできます。どちらの方法も問題なく機能します。

import java.awt.BorderLayout;
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;
import javax.swing.SwingUtilities;

public class ReorderTabs {
    private static void addTab(final JTabbedPane tabbedPane, final String title) {
        final JPanel panel = new JPanel(new BorderLayout());

        JLabel content = new JLabel(title + " - content", JLabel.CENTER); 
        panel.add(content, BorderLayout.CENTER);

        JButton toFrontButton = new JButton("|<");
        toFrontButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                // Re-insert the component in a new tab at the front. The tabbed pane will remove the old tab.
                tabbedPane.insertTab(title, null, panel, null, 0);
            }
        });
        panel.add(toFrontButton, BorderLayout.WEST);

        JButton toBackButton = new JButton(">|");
        toBackButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // Remove the component from the tab. The component will not be destroyed ...
                int index = tabbedPane.indexOfComponent(panel);
                tabbedPane.removeTabAt(index);

                // ... and can be added again (or inserted at an arbitrary index with insertTab).
                tabbedPane.addTab(title, panel);
            }
        });
        panel.add(toBackButton, BorderLayout.EAST);

        tabbedPane.addTab(title, panel);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JTabbedPane tabbedPane = new JTabbedPane();
                addTab(tabbedPane, "Tab #1");
                addTab(tabbedPane, "Tab #2");
                addTab(tabbedPane, "Tab #3");
                addTab(tabbedPane, "Tab #4");

                JFrame frame = new JFrame("Reorder Tabs Demo");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(tabbedPane, BorderLayout.CENTER);
                frame.setSize(400, 200);
                frame.setVisible(true);
            }
        });
    }
}
于 2013-02-07T18:51:42.197 に答える
0

この汚いハックはどうですか?

public static void main (String [] args) throws Exception
{
    final JTabbedPane tabbedPane = new JTabbedPane ();
    tabbedPane.addTab ("A", new JButton ("A"));
    tabbedPane.addTab ("B", new JButton ("B"));
    tabbedPane.addTab ("C", new JButton ("C"));
    tabbedPane.addTab ("D", new JButton ("D"));
    JFrame frame = new JFrame ();
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    frame.getContentPane ().setLayout (new BorderLayout ());
    frame.getContentPane ().add (tabbedPane, BorderLayout.CENTER);
    frame.pack ();
    frame.setVisible (true);

    Field pagesField = JTabbedPane.class.getDeclaredField ("pages");
    pagesField.setAccessible (true);
    final List <Object> pages = (List <Object>)pagesField.get (tabbedPane);

    while (true)
    {
        Thread.sleep (1000);

        SwingUtilities.invokeLater (new Runnable()
        {
            @Override
            public void run ()
            {
                Object o = pages.get (0);

                for (int i = 1; i < pages.size (); i++)
                    pages.set (i - 1, pages.get (i));

                pages.set (pages.size () - 1, o);

                tabbedPane.setSelectedIndex ((tabbedPane.getSelectedIndex () + pages.size () - 1) % pages.size ());

                tabbedPane.invalidate ();
                tabbedPane.repaint ();
            }
        });
    }
}
于 2013-02-07T18:17:37.007 に答える
0

それらを削除したくない場合は、コンポーネントを非表示にすることができます。

または、 を使用してタブを切り替えることができますjtpan.setEnabledAt(int tab_index, boolean enabled)

インデックスの使用を設定するにはsetSelectedIndex(int index)

コンポーネントの使用を非表示にするcomponen.setVisible(false)

于 2013-02-07T17:32:25.537 に答える