静态Swing元素不更新

时间:2013-07-26 19:10:20

标签: java swing static

我创建了一个JTabbedPane,它有五个标签 - MainPanel,EditAppointmentPanel,EditClientPanel等。每个标签都是自己的包裹JPanel的类。

在这三个标签中的第一个标签上,我添加了SearchPanel,另一个我编写的包裹JPanel的课程。此SearchPanelJTextFieldsJList。我希望此SearchPanel出现在我的三个标签中。我不能把它变成单身,因为如果我尝试在几个地方添加它,它只适用于其中一个 - 将它添加到不同的容器会改变所有权。所以我需要三个单独的SearchPanel实例。

问题是,我希望搜索面板的每个实例与其他两个实例同步。也就是说,如果我在一个中键入内容并进行搜索,则结果会显示在JList中,无论我在哪个标签中(也就是我看到的SearchPanel的哪个实例)。我试图制作SearchPanel变量,例如JList静态变量,认为每个对象的变量都是一样的,无论我搜索哪个对象,我都应该看到在任何情况下都会得到相同唉,事实并非如此。有什么建议或见解吗?

1 个答案:

答案 0 :(得分:2)

  

我希望此SearchPanel出现在我的三个标签中。

您无法执行此操作,因为组件只能添加到一个容器中。如果添加到多个容器中,则只有最新添加的内容可见且有效。

  • 尝试使用静态字段绝不是解决此类问题的方法。
  • 考虑将搜索面板从JTabbedPane所持有的组件中拉出来,使其始终可见,最有可能在显示JTabbedPane的同一容器中。
  • 或者,如果您必须在某些但不是所有选项卡中都具有此功能,那么您将不得不重构您的代码和MVC,创建一个“模型”类,其中包含搜索窗格显示的数据模型(视图),然后创建此模型的一个实例,并创建多个搜索窗格,每个窗格通过MVC再次共享此模型。

例如:

import javax.swing.*;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;

public class SharedPanelMain extends JPanel {
   private static final int PANEL_COUNT = 5;
   private SharedPanelModel sharedModel = new SharedPanelModel();
   private SharedPanel[] panels = new SharedPanel[PANEL_COUNT];

   public SharedPanelMain() {
      JTabbedPane tabbedPane = new JTabbedPane();
      for (int i = 0; i < panels.length; i++) {
         panels[i] = new SharedPanel(sharedModel);
         String title = "Panel " + (i + 1);
         tabbedPane.add(title, panels[i]);
      }

      add(tabbedPane);
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("SharedPanel");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new SharedPanelMain());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class SharedPanelModel {
   public static final String[] MODEL_DATA = { "one", "two", "three", "four",
         "five" };
   private DefaultListModel listModel = new DefaultListModel();
   private PlainDocument textAreaDocument = new PlainDocument();
   private ListSelectionModel listSelectionModel = new DefaultListSelectionModel();

   public SharedPanelModel() {
      for (String datum : MODEL_DATA) {
         listModel.addElement(datum);
      }
   }

   public ListModel getListModel() {
      return this.listModel;
   }

   public Document getTextAreaDocument() {
      return textAreaDocument;
   }

   public ListSelectionModel getListSelectionModel() {
      return listSelectionModel;
   }

}

@SuppressWarnings("serial")
class SharedPanel extends JPanel {
   private SharedPanelModel model;
   private JList list = new JList();
   private JTextArea textArea = new JTextArea(20, 50);

   public SharedPanel(SharedPanelModel model) {
      this.model = model;

      list.setModel(model.getListModel());
      list.setSelectionModel(model.getListSelectionModel());
      textArea.setDocument(model.getTextAreaDocument());

      add(new JScrollPane(list));
      add(new JScrollPane(textArea));
   }

}