单击按钮时,如何动态添加带有文本区域的新选项卡?

时间:2014-05-28 21:36:44

标签: java swing jtabbedpane

作为一个自己的项目我决定创建一个文本编辑器,并在一些关于代码结构和用户设计的建议上,当用户单击“新建”菜单项时,我放弃了创建编辑器的新实例。相反,我决定使用JTabbedPane使用“标签”。我可以设置第一个选项卡,但我似乎无法弄清楚如何动态地创建一个新的选项卡旁边已经存在的选项卡。有没有人对JTabbedPane有任何经验,或有任何关于如何实现这一点的想法。

以下是代码:

public class Editor extends JFrame implements ActionListener {

//===============================================
// FIELDS
//===============================================

    // Menus
    private JMenu fileMenu, editMenu;

    // Menu Items
    private JMenuItem newFile, openFile, saveFile, saveAsFile, pageSetup, printFile, exit;
    private JMenuItem undo, redo, cut, copy, paste, selectAll;

    // Menu Bar
    private JMenuBar menuBar;

    // New tab
    private JTabbedPane tab;
    private NewTab newTab;

    // Text Area
    private JScrollPane scroll;
    private JTextArea textArea;

//===============================================
// CONSTRUCTOR
//===============================================

    public Editor() {
        super("SchongeEdit");

        // Set initial size of the window
        setSize(800, 600);
        setLocationRelativeTo(null);

        // Set the default close operation (exit when it gets closed)
        setDefaultCloseOperation(EXIT_ON_CLOSE);        

        getContentPane().setLayout(new BorderLayout(0, 5));
        newTab = new NewTab();
        tab = newTab.createTab(createTextArea());
        getContentPane().add(tab);

        add(createMenuBar(), BorderLayout.NORTH);
    }

//===============================================
// METHODS
//===============================================

    // Creates the menu bar for holding the menus
    private JMenuBar createMenuBar() {
        menuBar = new JMenuBar();
        menuBar.add(fileMenu());
        menuBar.add(editMenu());

        return menuBar;
    }

    // Creates the text area in a scroll pane
    private JScrollPane createTextArea() {
        // Set text area and default font
        textArea = new JTextArea("", 0, 0);
        textArea.setEditable(true);
        textArea.setBorder(BorderFactory.createEmptyBorder(5, 10, 0, 0));
        textArea.setFont(new Font("Verdana", Font.PLAIN, 14));
        scroll = new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        return scroll;
    }
}

我遗漏了fileMenu()editMenu()方法,因为它们不是必需的,只会堵塞空间

这是我的NewTab()类:

public class NewTab {

    // Tabs
    private JTabbedPane tab;
    private String newTabName = "New Tab";

// Creates a new tabbed pane with a text area
    protected JTabbedPane createTab(JScrollPane scroll) {
        tab = new JTabbedPane(JTabbedPane.TOP);
        tab.addTab(newTabName, scroll);

        return tab;
    }

}

2 个答案:

答案 0 :(得分:1)

您的基本问题是,您正在向现有的JTabbedPane添加新的JTabbedPane

您应该让它返回用作选项卡视图和标签名称的组件,而不是NewTab返回新的JTabbedPane,而不是...... {/ p >

public class NewTab {

    private String tabName = "New Tab";

    // Creates a new tabbed pane with a text area
    protected JComponent createTab() {
        JTextArea ta = new JTextArea(10, 20);
        JScrollPane sp = new JScrollPane(ta);

        return ta;
    }

    public String getTabName() {
        // Could be used to hold the file name, for example
        return tabName;
    }

}

然后,您可以使用此功能将视图添加到现有JTabbedPane

答案 1 :(得分:0)

我的理解是,您通常会将Panel添加到JTabbedPane的标签中,但我认为JTabbedPane.addTab(Container)接受任何类型的ContainerThe tutorial提供了几个例子(尽管这些例子可能不适合您的需求)。

每次添加新标签时,我可能会创建一个新实例(JPanelJScrollPane或其他容器,因此相同的内容不会显示在多个标签上。< / p>