我创建了一个JTabbedPane
,它有五个标签 - MainPanel,EditAppointmentPanel,EditClientPanel等。每个标签都是自己的包裹JPanel
的类。
在这三个标签中的第一个标签上,我添加了SearchPanel
,另一个我编写的包裹JPanel
的课程。此SearchPanel
有JTextFields
和JList
。我希望此SearchPanel
出现在我的三个标签中。我不能把它变成单身,因为如果我尝试在几个地方添加它,它只适用于其中一个 - 将它添加到不同的容器会改变所有权。所以我需要三个单独的SearchPanel
实例。
问题是,我希望搜索面板的每个实例与其他两个实例同步。也就是说,如果我在一个中键入内容并进行搜索,则结果会显示在JList
中,无论我在哪个标签中(也就是我看到的SearchPanel
的哪个实例)。我试图制作SearchPanel
变量,例如JList
静态变量,认为每个对象的变量都是一样的,无论我搜索哪个对象,我都应该看到在任何情况下都会得到相同唉,事实并非如此。有什么建议或见解吗?
答案 0 :(得分:2)
我希望此SearchPanel出现在我的三个标签中。
您无法执行此操作,因为组件只能添加到一个容器中。如果添加到多个容器中,则只有最新添加的内容可见且有效。
例如:
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));
}
}