我有一个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);
}
}
答案 0 :(得分:0)
当我需要向它们添加侦听器时,我将GUI组件定义为类成员。因此,如果我成为JInternalFrame
和JCheckBox
类的成员,则可以在ActionListener
的{{1}}中关闭JCheckBox
。同样,我可以在JInternalFrame
中添加InternalFrameListener
,并在JInternalFrame
方法中更新JCheckBox
。从您发布的代码来看,您似乎不熟悉internalFrameClosing()
。如果是这种情况,那么我建议阅读How to Write an Internal Frame Listener。如果您需要更多具体的帮助,那么对我来说,您需要发布更多代码,以便我下载并运行它。