作为一个自己的项目我决定创建一个文本编辑器,并在一些关于代码结构和用户设计的建议上,当用户单击“新建”菜单项时,我放弃了创建编辑器的新实例。相反,我决定使用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;
}
}
答案 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)
接受任何类型的Container
。 The tutorial提供了几个例子(尽管这些例子可能不适合您的需求)。
每次添加新标签时,我可能会创建一个新实例(JPanel
,JScrollPane
或其他容器,因此相同的内容不会显示在多个标签上。< / p>