我已经环顾了一段时间,也尝试将多个面板添加到JTabbedPane。
我的问题是:是否可以将相同的 Jpanel 添加到多个选项卡式窗格中。我尝试过的所有方式,它似乎都无法正常工作。这就是它的工作原理。
public MainGUI() {
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
getContentPane().add(tabbedPane, BorderLayout.CENTER);
JEditorPane instructionalEditorPane = new JEditorPane();
tabbedPane.addTab("Instructional", instructionalEditorPane);
JPanel codePanel = new JPanel();
JPanel drawPanel = new JPanel();
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, codePanel, drawPanel);
splitPane.setResizeWeight(0.75);
tabbedPane.addTab("Code Panel", splitPane);
JEditorPane unifiedInstPane = new JEditorPane();
JPanel unifiedCodePanel = new JPanel();
JPanel unifiedDrawPanel = new JPanel();
JSplitPane unifiedSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, unifiedCodePanel, unifiedDrawPanel);
unifiedSplitPane.setResizeWeight(0.75);
JSplitPane unifiedPanel = new JSplitPane(JSplitPane.VERTICAL_SPLIT,unifiedInstPane, unifiedSplitPane);
unifiedPanel.setResizeWeight(0.40);
tabbedPane.addTab("Unified Tab", unifiedPanel);
}
我想做的只是将说明编辑器窗格和拆分窗格添加到多个选项卡式窗格中,但是当我这样做时,我会丢失原始的单个选项卡式窗格。如果我必须这样做,我可以这样做,但我必须写信给统一的InstPane和DirectivealEditorPane以保持更新。我还必须为嵌入了代码面板和绘图面板的 2 个拆分窗格执行此操作。这将使保持所有面板同步变得更加困难。
有什么建议吗?
"Is it possible to add the same Jpanel to multiple TabbedPanes."
-- no.一次只能将组件添加到一个容器。您的 JPanels 应该共享模型,但使用唯一的组件。该模型可能是您创建的非 GUI 类。
例如,以下是我的建议的一个非常简单的呈现:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
public class MainGui2 extends JPanel {
private static final int TAB_COUNT = 3;
private JTabbedPane tabbedPane = new JTabbedPane();
private PlainDocument doc = new PlainDocument();
private Action btnAction = new ButtonAction("Button");
public MainGui2() {
for (int i = 0; i < TAB_COUNT; i++) {
tabbedPane.add("Tab " + (i + 1), createPanel(doc, btnAction));
}
setLayout(new BorderLayout());
add(tabbedPane);
}
private JPanel createPanel(PlainDocument doc, Action action) {
JTextArea textArea = new JTextArea(doc);
textArea.setColumns(40);
textArea.setRows(20);
JPanel panel = new JPanel();
panel.add(new JScrollPane(textArea));
panel.add(new JButton(action));
return panel;
}
private class ButtonAction extends AbstractAction {
public ButtonAction(String title) {
super(title);
}
@Override
public void actionPerformed(ActionEvent evt) {
try {
String text = "Button Pressed!n";
doc.insertString(doc.getLength(), text, null);
} catch (BadLocationException e) {
e.printStackTrace();
}
}
}
private static void createAndShowGui() {
JFrame frame = new JFrame("MainGui2");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new MainGui2());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
最好创建一个正式的模型类,该模型类被注入到每个视图,每个选项卡式窗格的各个窗格中。
编辑
您在评论中指出:
是的,我可以通过调用实例是来解决这个问题,但随后我又回到了必须调用每个实例以影响所有面板更改的原始问题。例如,假设我有一个绘图面板,我需要调用 repaint(),我必须调用 2 个不同的实例才能更新两个选项卡式窗格。有什么办法吗?
的,解决方案是使用 MVC 或模型-视图-控件结构。模型包含整个程序逻辑,视图是用户看到的内容,控件在两者之间进行交互。
考虑让模型通知控件或视图它已更改,然后这会刺激重新绘制所有观察者视图。