【问题标题】:How to create internal frames in an overlay style, without modifying the underlying interface?如何在不修改底层接口的情况下以覆盖样式创建内部框架?
【发布时间】:2014-08-30 14:04:50
【问题描述】:

/* JDialog 是答案 */ 正如我所见,有两种方法可以添加额外的窗口,使用 JDialog,但在那些中你不能放置容器。或者将 JInternalFrames 与特定容器(如 JDesktopPane)一起使用,但为此您必须将界面的所有其余部分也转换为内部框架。在对底层布局进行尽可能少的修改的情况下添加类似 JInternalFrame 的窗口的最简单方法是什么?

【问题讨论】:

  • 否则我认为您的问题不够具体,无法回答,因为它有点模糊。修改什么底层布局?如果您想要最好的最快的帮助,您会希望我们快速全面了解您的问题,为此,请考虑创建和发布一个最小的程序,该程序可以编译和运行并向我们展示您拥有的一般结构和您正在尝试的内容要做,MCVE
  • 那你能告诉我如何获取JDialog的“contentPane”吗?我还没有找到将容器放入其中的选项。你已经回答了我的问题。
  • 您在 JDialog 实例上调用 getContentPane(),就像在 JFrame 上一样。 JDialog API 将向您展示 JDialog 可用的所有方法,我强烈建议您看看那里。
  • 谢谢,我现在看到了。我在 Oracle 的教程中低估了 JDialogs。 JDialogs 就是答案,尽管我仍然可以想象 this 和 JInternalFrames 之间的过渡,它保持其覆盖和层次独立的风格,同时能够被图标化。
  • 开枪,如果需要的话,可以将整个 GUI 放入 JOptionPane 中。

标签: java swing jdialog jinternalframe


【解决方案1】:

JDialog 和 JFrame 一样具有 contentPanes,任何可以放入 JFrame 的组件都可以放入 JDialog。例如:

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

public class DialogEg {
   private static void createAndShowGUI() {
      MainPanelGen mainPanelGen = new MainPanelGen();

      JFrame frame = new JFrame("DialogEg");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanelGen.getMainPanel());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGUI();
         }
      });
   }

}

class MainPanelGen {
   private JPanel mainPanel = new JPanel();
   private JTextField field = new JTextField(10);
   private JButton btn = new JButton(new BtnActn());
   private JDialog dialog;
   private DialogPanel dialogPanel = new DialogPanel();

   public MainPanelGen() {
      mainPanel.add(field);
      mainPanel.add(btn);

      field.setEditable(false);
      field.setFocusable(false);
   }

   public JPanel getMainPanel() {
      return mainPanel;
   }

   private class BtnActn extends AbstractAction {
      BtnActn() {
         super("Button");
      }

      @Override
      public void actionPerformed(ActionEvent arg0) {
         if (dialog == null) {
            Window win = SwingUtilities.getWindowAncestor(mainPanel);
            if (win != null) {
               dialog = new JDialog(win, "My Dialog",
                     Dialog.ModalityType.APPLICATION_MODAL);
               dialog.getContentPane().add(dialogPanel);
               dialog.pack();
               dialog.setLocationRelativeTo(null);
            }
         }
         dialog.setVisible(true); // here the modal dialog takes over
         System.out.println   (dialogPanel.getFieldText());
         field.setText(dialogPanel.getFieldText());
      }
   }
}

class DialogPanel extends JPanel {
   private JTextField field = new JTextField(10);
   private JButton exitBtn = new JButton(new ExitBtnAxn("Exit"));

   public DialogPanel() {
      add(field);
      add(exitBtn);
   }

   public String getFieldText() {
      return field.getText();
   }

   private class ExitBtnAxn extends AbstractAction {

      public ExitBtnAxn(String name) {
         super(name);
      }

      @Override
      public void actionPerformed(ActionEvent arg0) {
         Window win = SwingUtilities.getWindowAncestor(DialogPanel.this);
         if (win != null) {
            win.dispose();
         }
      }
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    相关资源
    最近更新 更多