Как связать JCheckBoxMenuItem с JInternalFrames, контролируемыми флажком - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть JFrame, который создает 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);
    }
}

1 Ответ

0 голосов
/ 16 февраля 2019

Я определяю компоненты GUI как членов класса, когда мне нужно добавить слушателей к ним.Поэтому, если я сделаю JInternalFrame и JCheckBox членов класса, то в ActionListener из JCheckBox я могу закрыть JInternalFrame.Точно так же я могу добавить InternalFrameListener к JInternalFrame и обновить JCheckBox в методе internalFrameClosing().Из кода, который вы опубликовали, выясняется, что вы незнакомы с InternalFrameListener.Если это так, то я предлагаю прочитать Как написать внутренний слушатель фрейма .Если вам нужна более конкретная помощь, тогда для меня вам нужно опубликовать больше кода, чтобы я мог его загрузить и запустить.

...