【问题标题】:How to completely remove an icon from JDialog?如何从 JDialog 中完全删除图标?
【发布时间】:2011-12-14 12:46:51
【问题描述】:

我正在创建一个显示文件复制进度的对话框。我想要做的是完全删除对话框的图标图像。

在提供应用程序的FrameView 实例作为JDialog 的构造函数的参数之前,我创建了此类对话框,如下所示:

public class MyAppView extends FrameView {

    // ...

    @Action
    public void showOptionsDialog() {

        // Creating modal options' dialog
        JDialog optionsDialog = new JDialog(this, true);

        // ...
    }
}

所以,正如我所见,我需要一个父组件来制作没有图标的对话框。在我目前的情况下(当我没有父框架视图时)我尝试了以下 hack 方法设置一个透明图标,但它没有按我预期的那样工作 - 我仍然在对话框的标题栏中看到一个图标的空白区域和(什么是最糟糕)当我点击这个区域时,我仍然有一个弹出窗口。

JFrame dummyFrame = new JFrame();
Image icon = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB_PRE);
dummyFrame.setIconImage(icon);
JDialog myDialog = new JDialog(dummyFrame, true);

无论如何,必须可以删除图标。工作示例是JOptionPane:

JOptionPane.showMessage(null, "My message");

查看JOptionPane的源码可以发现,当父组件设置为null时,静态Frame JOptionPane.getRootFrame()用于获取调用的父:

public static Frame getRootFrame() throws HeadlessException {
    Frame sharedFrame = 
        (Frame)SwingUtilities.appContextGet(sharedFrameKey);
    if (sharedFrame == null) {
        sharedFrame = SwingUtilities.getSharedOwnerFrame();
        SwingUtilities.appContextPut(sharedFrameKey, sharedFrame);
    }
    return sharedFrame;
}

所以我也尝试按如下方式创建我的对话框:

JDialog myDialog = new JDialog(JOptionPane.getRootFrame(), true);

但仍然没有成功。当我尝试应用此代码 sn-p 时,我有一个标准 Java 图标。

我的问题是:我做错了什么? 如何完全删除JDialog的图标,因为它是由JOptionPane完成的?

附:我用的是JDK6。

【问题讨论】:

    标签: java icons jdialog


    【解决方案1】:

    解决方案是使对话框不可调整大小,然后它将没有任何父窗口的图标。

    JDialog myDialog = new JDialog(new Frame(), true);
    myDialog.setResizable(false);
    myDialog.setVisible(true);
    

    不幸的是,如果您的对话框要调整大小,除了设置透明图标外,没有其他方法可以删除图标。

    【讨论】:

    • 这个解决方案对我不起作用。也许是因为我使用的是无主对话框。我使用了JDialog(Window, String, ModalityType) 构造函数。
    【解决方案2】:

    也许以下内容更符合您的要求。

                JProgressBar pb = new JProgressBar();
                JOptionPane op = new JOptionPane(pb, JOptionPane.PLAIN_MESSAGE,
                        JOptionPane.DEFAULT_OPTION);
                JDialog dlg = op.createDialog(MyJFrame.this, "Progress");
                dlg.setVisible(true);
    

    【讨论】:

      【解决方案3】:

      在带有设计选项的 netbeans 中:

      initComponents();
      Image img = new BufferedImage(1, 1,BufferedImage.TYPE_INT_ARGB_PRE);
      this.setIconImage(img);
      

      【讨论】:

      • 这在很大程度上重复了几年前的现有答案。你能解释一下这有什么不同吗?
      • @NathanTuggy 这正是 OP 尝试但没有成功的方法。我将其标记为删除,但版主拒绝了我的标记。
      【解决方案4】:

      我对图标没有任何问题(尽管 WindowsXP 上的 JDK7)。 我在对话框中使用 setFocusableWindowState(false) 抑制的图标上的弹出菜单。

      JFrame 就像你的代码:

      public MyJFrame() {
          //URL url = this.getClass().getResource("transparent.gif");
          //if (url != null) {
          //    ImageIcon icon = new ImageIcon(url);
          //    if (icon != null)
          //        setIconImage(icon.getImage());
          //}
          BufferedImage icon = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB_PRE);
          //icon.setRGB(0, 0, 0x00000000);
          setIconImage(icon);
      }
      

          JFrame dummyFrame = new MyJFrame();
          JDialog myDialog = new JDialog(dummyFrame, true);
          myDialog.setIconImage(dummyFrame.getIconImage()); // Not needed.
          myDialog.setFocusableWindowState(false);
          myDialog.setVisible(true);
      

      【讨论】:

      • 您的对话框的标题是否与标题栏的左侧对齐?我看到左边有一个透明的 16x16 图标,所以标题似乎向右移动了图标的宽度。 setFocusableWindowState(false) 绘制一个标题栏,就像它处于非活动状态一样,这也是不希望的行为。请查看JOptionPane 的对话框 - 它们看起来就像我想要的那样。
      • 那我的回答是没有帮助。除了 setDecorated(false) 和自己绘制标题栏之外,我认为答案在另一行。
      猜你喜欢
      • 1970-01-01
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 2014-09-25
      • 2017-03-07
      • 2014-01-09
      相关资源
      最近更新 更多