Java 在JTabbedPane中的选项卡之间切换组件

Java 在JTabbedPane中的选项卡之间切换组件,java,jtabbedpane,Java,Jtabbedpane,是否有一种方法可以在JTabbedPane中的选项卡之间切换组件,而无需创建这些对象的新实例?或者有没有切换标签的方法 当通过.remove(idx)或.removeTabAt(idx)方法从JTabbedPane中删除组件时,该组件将被销毁。也许有办法防止破坏这个物体 我正在寻找一种方法来删除包含该组件的选项卡,以便在最近的将来将其添加回,但使用一些其他索引 换句话说,我只需要更改选项卡顺序。但对我来说,重要的是不要创建组件的新实例。如果不想删除组件,可以隐藏它们 或者您可以使用jtpan.s

是否有一种方法可以在
JTabbedPane
中的选项卡之间切换组件,而无需创建这些对象的新实例?或者有没有切换标签的方法

当通过
.remove(idx)
.removeTabAt(idx)
方法从
JTabbedPane
中删除组件时,该组件将被销毁。也许有办法防止破坏这个物体

我正在寻找一种方法来删除包含该组件的选项卡,以便在最近的将来将其添加回,但使用一些其他索引


换句话说,我只需要更改选项卡顺序。但对我来说,重要的是不要创建组件的新实例。

如果不想删除组件,可以隐藏它们

或者您可以使用
jtpan.setEnabledAt(int tab_index,boolean enabled)
切换选项卡

要设置索引,请使用
setSelectedIndex(int-index)


要隐藏组件,请使用
componen.setVisible(false)

如果不想删除组件,可以隐藏组件

或者您可以使用
jtpan.setEnabledAt(int tab_index,boolean enabled)
切换选项卡

要设置索引,请使用
setSelectedIndex(int-index)


要隐藏组件,请使用
componen.setVisible(false)

这个肮脏的黑客怎么办

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 ();
            }
        });
    }
}
publicstaticvoidmain(字符串[]args)引发异常
{
最终JTabbedPane选项卡bedpane=新JTabbedPane();
tabbedPane.addTab(“A”,新的JButton(“A”);
tabbedPane.addTab(“B”,新的JButton(“B”);
tabbedPane.addTab(“C”,新的JButton(“C”);
tabbedPane.addTab(“D”,新的JButton(“D”);
JFrame=newjframe();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(新的BorderLayout());
frame.getContentPane().add(tabbedPane,BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
字段页面Field=JTabbedPane.class.getDeclaredField(“页面”);
pagesField.setAccessible(true);
最终列表页面=(列表)页面字段.get(选项卡窗格);
while(true)
{
睡眠(1000);
SwingUtilities.invokeLater(新的Runnable()
{
@凌驾
公开作废运行()
{
对象o=pages.get(0);
对于(inti=1;i
这个肮脏的黑客怎么办

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 ();
            }
        });
    }
}
publicstaticvoidmain(字符串[]args)引发异常
{
最终JTabbedPane选项卡bedpane=新JTabbedPane();
tabbedPane.addTab(“A”,新的JButton(“A”);
tabbedPane.addTab(“B”,新的JButton(“B”);
tabbedPane.addTab(“C”,新的JButton(“C”);
tabbedPane.addTab(“D”,新的JButton(“D”);
JFrame=newjframe();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(新的BorderLayout());
frame.getContentPane().add(tabbedPane,BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
字段页面Field=JTabbedPane.class.getDeclaredField(“页面”);
pagesField.setAccessible(true);
最终列表页面=(列表)页面字段.get(选项卡窗格);
while(true)
{
睡眠(1000);
SwingUtilities.invokeLater(新的Runnable()
{
@凌驾
公开作废运行()
{
对象o=pages.get(0);
对于(inti=1;i
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);
            }
        });
    }
}
导入java.awt.BorderLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JTabbedPane;
导入javax.swing.SwingUtilities;
公共类重新排序选项卡{
私有静态void addTab(最终JTabbedPane选项卡bedpane,最终字符串标题){
最终JPanel面板=新JPanel(新的BorderLayout());
JLabel content=新的JLabel(标题+“-content”,JLabel.CENTER);
添加(内容、边框布局、中心);
JButton toFrontButton=新JButton(“| |”);
toBackButton.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
//从选项卡中删除该组件。该组件将不会被销毁。。。
int index=tabbedPane.indexOfComponent(面板);
选项卡窗格。移除选项卡(索引);
//…并且可以再次添加(或使用insertTab在任意索引处插入)。
tabbedPane.addTab(标题,面板);
}
});
添加面板(toBackButton,BorderLayout.EAST);
tabbedPane.addTab(标题,面板);
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
JTabbedPane tabbedPane=新的JTabbedPane();
添加选项卡(选项卡窗格,“选项卡