【问题标题】:How to link JCheckBoxMenuItem to JInternalFrames controlled by the checkbox如何将 JCheckBoxMenuItem 链接到由复选框控制的 JInternalFrames
【发布时间】:2019-07-10 03:55:00
【问题描述】:

我有一个 JFrame,它创建了一个 JInternalFrame,而 JInternalFrame 又在其内部创建了 JInternalFrames。 “外部”JIF 有一个“添加框架”按钮和一个复选框菜单,因此每个“内部”JIF 类型只能创建一次。最多可以有 6 个“内部”JIF(代码示例限制为 2 个,FRAME A 和 B)。

创建内部 JIF 工作正常,但是当用户取消选中复选框时,我如何找到要关闭的正确内部 JIF? 如果用户关闭内部 JIF,我如何将其链接回取消选中正确的复选框?

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

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

    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);
    }
}

【问题讨论】:

    标签: java swing jcheckbox jinternalframe


    【解决方案1】:

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

    【讨论】:

    • 啊!是的,我明白你的意思。如果每个内部 JIF 都是它自己的类,那么它将把事情联系在一起。实际上,我通过将内部 JIF 创建一个单独的类来欺骗自己。我对听众很熟悉,但可能为了把它放在这里而过度简化了代码。我最初在 innerJIF 类中有一个监听器,这造成了我的第一个问题,即一次关闭所有打开的帧。
    猜你喜欢
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 2015-11-01
    • 2013-06-18
    • 2015-03-18
    • 2016-03-20
    • 2017-09-13
    • 2018-09-18
    相关资源
    最近更新 更多