【问题标题】:Java - setVisible(true)Java - setVisible(真)
【发布时间】:2017-02-09 10:58:15
【问题描述】:

我制作了一个简单的 JDialog,其中包含一个标签和一个按钮,它基本上相当于信息对话框。所以在对话框中,有一个方法 display(),我在其中调用了 setVisible(true) 五次。

据我所知,调用此显示方法时,它应该只显示一次对话框,但实际上创建了5个对话框,为什么它会创建5个对话框?

Edit1:我的问题与此更相似:

import java.awt.event.*;import java.awt.*;import javax.swing.*;
class Demo implements ActionListener
{
JFrame f;
JButton b;  
DisplayDialog dialog;
public Demo() 
{
    f = new JFrame();
    f.setSize(200,200);

    b = new JButton("Click me");

    f.add(b);
    dialog = new DisplayDialog();

    b.addActionListener(this);
    f.setVisible(true);
}

public void actionPerformed(ActionEvent e)
{
    Object o = e.getSource();

    if(o==b)
    {
        dialog.display("Hello");
        dialog.display("Hello");
        dialog.display("Hello");
        dialog.display("Hello");
        dialog.display("Hello5");
    }
}

public static void main(String args[])
{
    Demo d = new Demo();
}

class DisplayDialog implements ActionListener
{
        JDialog dg;
        JLabel l;
        JButton b;
        Font myfont;

        public DisplayDialog()
        {
            dg = new JDialog(f,"Alert!",true);
            dg.setSize(300,150);
            l = new JLabel("Message");
            b = new JButton("OK");

            myfont = new Font("Serif",Font.BOLD,12);
            l.setFont(myfont);

            dg.add(l);
            dg.add(b,"South");

            dg.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

            b.addActionListener(this);
        }

        public void actionPerformed(ActionEvent e)
        {
            Object o = e.getSource();
            if(o==b)
            {
                dg.setVisible(false);
            }
        }

        public void display(String str)
        {
            l.setText(str);
            dg.setVisible(true);

        }
  } 
}

Edit2:现在我的程序中发生了这样的情况,我希望它显示最后一个对话框,而不是显示对话框 5 次,我该怎么做才能做到这一点?

【问题讨论】:

  • 你在哪里打电话display(String str) ??
  • @Antoniossss 只需创建一个对象并使用您选择的字符串调用它。在我的程序中,我刚刚添加了一个新的 JMenuItem 并在单击时调用 display(String str)。
  • 但是您的示例不起作用,因此请特别提供您的代码,这取决于 f 变量(可能是 JFrame),所以谁知道您可以在那里突破。
  • 为什么要打五次setVisible()?你希望这能做什么?

标签: java swing


【解决方案1】:

好的,基本上它不会一次显示 5 次,只会显示 连续显示 5 次

JDialog.setVisible(true) 是一个阻塞操作,在对话框关闭之前一直阻塞。

所以当您关闭它时会弹出一个对话框并在setVisible(true) 上阻止应用程序,然后调用另一个serVisible(true),依此类推。

【讨论】:

  • 好的,我明白你在说什么。现在我陷入了与此更相似的情况:
  • @KaranNagpal 您没有粘贴链接。无论如何,当这满足您的问题时,请将其标记为已接受并发布另一个问题。我会尽力在那边帮忙。
  • 我编辑了更好地解释我的情况的问题@Antoniossss
【解决方案2】:

你只创建一个对话框实例

dg = new JDialog(f,"Alert!",true);

然后,您会在多次调用setVisible(true) 时显示五次相同的对话框。

【讨论】:

    【解决方案3】:

    至于您的编辑:那您的问题是什么?

    改变

    if (o == b) {
        dialog.display("Hello");
        dialog.display("Hello");
        dialog.display("Hello");
        dialog.display("Hello");
        dialog.display("Hello5");
    }
    

        if (o == b) {
            dialog.display("Hello");
        }
    

    【讨论】:

    • 在我的主程序中,有 4 个内部框架,每个框架都包含此信息对话框 4 次以上。这些内部框架是相互关联的,因此有时会发生此函数被调用 8 次以上的情况。所以我希望它只出现一次而不是 8 个对话框。 @Antoniossss
    • 要么发布实际反映您的情况并帮助您寻求解决方案的代码,要么在此处停止寻求帮助。您提供的问题的解决方案(即使使用演示代码!)是不要一一调用display。这个例子和你的应用有什么关系,没人知道,我想你也不知道。您只认为这与您的问题相同,但 99% 的情况并非如此。
    • 应用程序代码有 1000 行,这种情况发生在非常特定的输入处。我只需要知道我应该怎么做,这样每当调用 display(String str) 时,如果已经打开了一个对话框,它就会关闭。
    • if(dialog.isVisible) dialog.setVisible(false) ??这不是您在问题中所问的。再次接受并发布新的、更准确的问题。
    • 将方法更改为此 public void display(String str) { if(dg.isVisible()) dg.setVisible(false); l.setText(str); dg.setVisible(true); } 但仍然出现 5 个对话框
    猜你喜欢
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 2011-05-23
    • 1970-01-01
    相关资源
    最近更新 更多