【问题标题】:How to set two JScrollPanes in different classes with same JPanel content如何在具有相同 JPanel 内容的不同类中设置两个 JScrollPanes
【发布时间】:2019-09-24 22:41:28
【问题描述】:

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

来自 UIManager 类

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

在 UserInterface 类中

    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 中,反之亦然。

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

【问题讨论】:

  • 你不能这样做,因为 Swing 有组件树但没有图表。所以当你将一个组件添加到容器中时,它会从之前的容器中移除。
  • "在不同的类中设置两个 JScrollPanes 具有相同的 JPanel 内容" .. 为什么?
  • @AndrewThompson 我想这样做是为了能够从不同的选项卡中选择传感器
  • @SergiyMedvynskyy 例如,我们无法克隆此列表?
  • 如果元素对两者都是通用的,请将其放在 外部 选项卡式窗格中。

标签: java swing jpanel jscrollpane


【解决方案1】:

传感器需要添加到两个不同类中的两个 JScrollPanes。

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

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

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

【讨论】:

    猜你喜欢
    • 2012-05-30
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多