如何 link JCheckBoxMenuItem 到由复选框控制的 JInternalFrames

How to link JCheckBoxMenuItem to JInternalFrames controlled by the checkbox

我有一个 JFrame,它创建一个 JInternalFrame,后者又在其内部创建 JInternalFrames。 'outer' JIF 有一个带有复选框菜单的 'Add Frames' 按钮,因此每个 'inner' JIF 类型只能创建一次。最多可能有 6 'inner' 个 JIF(代码示例限制为 2,FRAME A 和 B)。

创建内部 JIF 工作正常,但是当用户取消选择复选框时,我如何找到正确的内部 JIF 来关闭? 如果用户关闭内部 JIF,我如何 link 返回取消选中正确的复选框?

我尝试过的方法最终会关闭所有内部 JIF,或者如果我尝试搜索打开的 JIF 列表并将其标题与复选框字段匹配,编译器会说此时信息不可用。

创建外部和内部 JIF 的简化代码如图所示。不要告诉我我需要布局管理器 - JIF 必须 user-movable 并且可以不受限制地调整大小。

    class OUTJIF extends JInternalFrame {
OUTJIF() {
    JInternalFrame outerJIF = new JInternalFrame("Outer JInternalFrame", true, true, true, true);
    outerJIF.setBounds(50, 50, 600, 400);  
    outerJIF.getContentPane().setLayout(null);

    JButton btnAddFrames = new JButton("Add Frames");
    btnAddFrames.setBounds(10, 11, 125, 23);
    outerJIF.getContentPane().add(btnAddFrames);

    JPopupMenu popMenu = new JPopupMenu();
    JCheckBoxMenuItem boxFrameA = new JCheckBoxMenuItem("Frame A");
    JCheckBoxMenuItem boxFrameB = new JCheckBoxMenuItem("Frame B");
    popMenu.add(boxFrameA);
    popMenu.add(boxFrameB);
    btnAddFrames.addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent e) {
               popMenu.show(e.getComponent(), e.getX(), e.getY());
            }
    });
    Demo.mainPane.add(outerJIF);  // add to invoking JFrame
    outerJIF.setVisible(true); 

   // Class for internal JIF 
class intJIF extends JInternalFrame {
intJIF(String intType, int x, int y, int h, int w) {
    JInternalFrame innerJIF = new JInternalFrame(intType, true, true, true, true) ;
    innerJIF.setBounds(new Rectangle(x, y, h, w));
    outerJIF.getContentPane().add(innerJIF);
    innerJIF.setVisible(true);  
    // ISSUE #2 - IF USER CLOSES ONE OF THESE, HOW TO CHANGE CHECKBOX MENU?
    }       
};

    // LISTENERS FOR outerJIF MENU ITEMS 
    ActionListener listFrameA = new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            AbstractButton boxFrameA = (AbstractButton) event.getSource();
            boolean selected = boxFrameA.getModel().isSelected();
            if (selected) { new intJIF("Inner Frame A", 0, 100, 250, 250); }
            else {      // ISSUE #1 - HOW TO FIND THE RIGHT INTERNAL JIF TO CLOSE?
                }
            }   };
    boxFrameA.addActionListener(listFrameA);

    ActionListener listFrameB = new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            AbstractButton boxFrameB = (AbstractButton) event.getSource();
            boolean selected = boxFrameB.getModel().isSelected();
            if (selected) { new intJIF("Inner Frame B", 50, 50, 250, 250); }
            else {      // ISSUE #1 - HOW TO FIND THE RIGHT INTERNAL JIF TO CLOSE?
                }
            }   };
    boxFrameB.addActionListener(listFrameB);
    }
}

当我需要向它们添加侦听器时,我将 GUI 组件定义为 class 成员。因此,如果我将 JInternalFrameJCheckBox 设为 class 成员,那么在 JCheckBoxActionListener 中我可以关闭 JInternalFrame。同样,我可以将 InternalFrameListener 添加到 JInternalFrame 并在 internalFrameClosing() 方法中更新 JCheckBox。从您 post 编写的代码看来,您不熟悉 InternalFrameListener。如果是这样,那么我建议阅读How to Write an Internal Frame Listener。如果您需要更具体的帮助,那么对我来说,您需要 post 更多代码,以便我可以下载它并 运行 它。