如何在不同 类 中设置两个具有相同 JPanel 内容的 JScrollPanes

How to set two JScrollPanes in different classes with same JPanel content

我正在研究 GUI,其中传感器需要添加到两个 JScrollPanes 中的两个不同 class。有一个 UIManager class 发送当前连接到 UI class 的传感器的 ArrayList,然后将这些传感器设置在 JPanel 然后将其设置为两个 JScrollPanes 的视口:

来自UI经理class

private static void updateSensorsConnectedSmallEntries() {
    UserInterface.setSensorEntriesSmall(sensorEntriesSmall);
}

用户界面内部 class

    public static void setSensorEntriesSmall(ArrayList<SensorEntrySmall> sesList) {
        setSensorEntriesSmall(tabDataLogging.getConnectedSensorsScrollList(), sesList);
        setSensorEntriesSmall(tabLiveChart.getConnectedSensorsScrollList(), sesList);
    }

    private static void setSensorEntriesSmall(JScrollPane pane, ArrayList<SensorEntrySmall> sesList) {
        javax.swing.JPanel scrollList = new javax.swing.JPanel();
        scrollList.setBackground(Color.WHITE);
        pane.setBackground(Color.WHITE);
        javax.swing.GroupLayout paneLayout = new javax.swing.GroupLayout(scrollList);
        scrollList.setLayout(paneLayout);

        GroupLayout.ParallelGroup hor = paneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING);
        GroupLayout.ParallelGroup ver = paneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING);
        GroupLayout.SequentialGroup horSeq = paneLayout.createSequentialGroup();
        GroupLayout.SequentialGroup verSeq = paneLayout.createSequentialGroup();
        GroupLayout.ParallelGroup horSeqPlaceHolder = paneLayout.createParallelGroup();

        horSeq.addContainerGap();
        verSeq.addContainerGap();
        for (SensorEntrySmall ses : sesList) {
            horSeqPlaceHolder.addComponent(ses.getSensorEntrySmall());
            verSeq.addComponent(ses.getSensorEntrySmall(), javax.swing.GroupLayout.PREFERRED_SIZE, 
                    javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE);
            verSeq.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED);
        }
        horSeq.addGroup(horSeqPlaceHolder);
        horSeq.addContainerGap();
        verSeq.addContainerGap();

        hor.addGroup(horSeq);
        paneLayout.setHorizontalGroup(hor);
        ver.addGroup(verSeq);
        paneLayout.setVerticalGroup(ver);

        pane.setViewportView(scrollList);
    }

问题似乎出在将列表分配给不同选项卡的顺序上。如果我先将它们分配给 tabDataLogging,然后分配给 tabLiveChart,则传感器仅显示在 tabLiveChart 中,反之亦然。

我希望传感器显示在两个选项卡中。有人对这里出了什么问题有任何建议吗?

where sensors need to be added to two JScrollPanes in two different classes.

Swing 组件只能有一个父组件,因此您不能共享面板。

但是,您可以共享数据。大多数 Swing 组件都有一个 Model。模型可以分享。

例如,如果您的传感器显示在 JTable 中,您可以共享 TableModel。您需要创建两个 JTable,但可以将相同的模型添加到每个 table.