Добавление класса jinternalframe в jdesktoppane с использованием другого класса jinternalframe - PullRequest
2 голосов
/ 29 июля 2011

Я создаю очень простую программу.Я создал следующие классы: MainJframeClass, JDesktopPaneClass, JinternalFrameClass1 и JinternalFrameClass2.Что я сделал, так это то, что я создал свой jdesktoppaneclass и назвал его desktoppane1, и я добавил его в класс MainJframeclass.я также создал 2 jinternalframes и назвал их internal1 и internal2.Теперь у меня есть кнопка в mainjframeclass, которая, когда я нажимаю, я добавляю inner1 к desktoppane1.Теперь моя проблема заключается в том, как добавить internal2 к desktoppane1 с помощью кнопки, расположенной где-то во internal1.я знаю, почему я мог просто добавить еще одну кнопку на desktoppane1 и добавить внутренние2.но я уже сделал это, я просто хочу решить эту проблему.если вы можете помочь мне, пожалуйста.кстати, извините за мой английский.

Ответы [ 2 ]

3 голосов
/ 29 июля 2011

Это просто вопрос ссылок. Код, который добавляет что-то в JDesktopPane, должен иметь ссылку на него, и поэтому вам нужно будет передать эту ссылку в класс, которому это нужно сказать, с помощью параметра конструктора или параметра метода.

Редактировать 1
Например:

import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;

public class ReferenceExample extends JPanel {
   private JDesktopPane desktop = new JDesktopPane();
   private Random random = new Random();

   public ReferenceExample() {
      JButton addInternalFrameBtn = new JButton("Add Internal Frame");
      addInternalFrameBtn.addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
            addInternalFrame();
         }
      });
      JPanel btnPanel = new JPanel();
      btnPanel.add(addInternalFrameBtn);

      setPreferredSize(new Dimension(600, 450));
      setLayout(new BorderLayout());
      add(new JScrollPane(desktop), BorderLayout.CENTER);
      add(btnPanel, BorderLayout.SOUTH);
   }

   public void addInternalFrame() {
      MyInternalFrame intFrame = new MyInternalFrame(ReferenceExample.this);
      int x = random.nextInt(getWidth() - intFrame.getPreferredSize().width);
      int y = random.nextInt(getHeight() - intFrame.getPreferredSize().height);
      intFrame.setLocation(x, y);
      desktop.add(intFrame);
      intFrame.setVisible(true);
   }

   private static void createAndShowUI() {
      JFrame frame = new JFrame("Reference Eg");
      frame.getContentPane().add(new ReferenceExample());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}

class MyInternalFrame extends JInternalFrame {

   // pass in the reference in the constructor
   public MyInternalFrame(final ReferenceExample refEg) {
      setPreferredSize(new Dimension(200, 200));
      setClosable(true);

      JButton addInternalFrameBtn = new JButton("Add Internal Frame");
      addInternalFrameBtn.addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
            // use the reference here
            refEg.addInternalFrame();
         }
      });
      JPanel panel = new JPanel();
      panel.add(addInternalFrameBtn);
      getContentPane().add(panel);
      pack();
   }
}
1 голос
/ 29 июля 2011

как добавить internal2 к desktoppane1 с помощью кнопки, расположенной где-то во internal1.

В ActionListener, добавленном к вашей кнопке, вы можете использовать код, подобный следующему, чтобы получить ссылку напанель рабочего стола:

Container container = SwingUtilities.getAncestorOfClass(JDesktopPane.class, (Component)event.getSource());

if (container != null)
{
    JDesktopPane desktop = (JDesktopPane)container;
    JInternalFrame frame = new JInternalFrame(...);
    desktop.add( frame );
} 
...