2

我环顾四周,也尝试将多个面板添加到 JTabbedPane 中。

我的问题是:是否可以将相同的 Jpanel 添加到多个 TabbedPanes。我尝试过的所有方法似乎都无法正常工作。这就是它的工作原理。

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);
}

我想做的只是将structualalEditorPane 和splitPane 添加到多个tabbedPanes,但是当我这样做时,我会松开原始的Individual tabbedPanes。如果必须这样做,我可以这样做,但我必须同时写信给统一的 InstPane 和指令编辑器以保持更新。我还必须为嵌入了 codePanel 和 drawPanel 的 2 个 splitPanel 执行此操作。这将使所有面板保持同步变得更加困难。

有什么建议么?

4

1 回答 1

1

"Is it possible to add the same Jpanel to multiple TabbedPanes." - 不。您一次只能将一个组件添加到一个容器中。您的 JPanel 应该共享模型但使用独特的组件。该模型可能是您创建的非 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 个不同的实例来更新两个 tabbedPanes。有没有办法解决?

是的,解决方案是使用 MVC 或模型视图控制结构。您的模型包含您的整体程序逻辑,视图是用户看到的内容,并且控件在两者之间进行交互。

考虑让您的模型通知控件或视图其已更改,然后这会刺激重新绘制所有观察者视图。

于 2013-11-05T23:00:17.097 回答