Java / Swing - >创建通知JFrame,并且错误“框架是可显示的” [英] Java / Swing -> Creating a notification JFrame, and the error "The frame is displayable"

查看:229
本文介绍了Java / Swing - >创建通知JFrame,并且错误“框架是可显示的”的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

好吧,我不是那么精通Java / Swing,而且我遇到了一个问题。我的应用程序抛出此错误:线程中的异常AWT-EventQueue-0java.awt.IllegalComponentStateException:框架是可显示的。谷歌没有提供有关此错误的大量信息,并且快速搜索StackOverflow还没有显示任何内容。

Ok, I am not that versed in Java / Swing, and I am running into a problem. My application is throwing this error: "Exception in thread "AWT-EventQueue-0" java.awt.IllegalComponentStateException: The frame is displayable." Google isn't turning up much information on this error, and a quick search of StackOverflow is not showing anything yet.

我要做的是:使用教程中的代码实现半透明窗口。而已。我计划将此作为显示通知的常规窗口,例如此程序尚未在30天内运行,靠近系统托盘。

What I am trying to do: just implement translucent windows using the code from the tutorials. That's it. I plan to use this as a general window for displaying notifications, such as "This program has not been run in 30 days" down near the system tray.

是否有任何通知经验丰富的Java / Swing大师谁可以发现我的初学者的错误?

Are there any experienced Java / Swing gurus out there who can spot my beginner's mistake?

谢谢。

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package energizingemerald;

/**
 *
 */
import java.awt.*;
import javax.swing.*;
import static java.awt.GraphicsDevice.WindowTranslucency.*;

public class NotificationFrame extends javax.swing.JFrame {

    /**
     * Creates new form NotificationFrame
     */
    public NotificationFrame() {
        initComponents();

        this.setLayout(new GridBagLayout());
        this.setUndecorated(true);
        this.setSize(300,200);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        this.setOpacity(0.50f);


    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>                        

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(NotificationFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(NotificationFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(NotificationFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(NotificationFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new NotificationFrame().setVisible(true);
            }
        });
    }




    // Variables declaration - do not modify                     
    // End of variables declaration                   
}


推荐答案


  • +1谢谢对于这个主题,你的代码解决了非常正确的未修饰的conatiner,一切都是关于方法的正确排序(wooolaaa我们回到Java_1.4.2边缘)

    但是bug仍然存在,是不可能的根据方法的正确排序创建具有更改外观的装饰JFrame

    but bug still is there, isn't possible to create decorated JFrame with changed Look And Feel

    import java.awt.*;
    import javax.swing.*;
    
    public class TranslucentWindow extends JFrame {
    
        private static final long serialVersionUID = 1L;
    
        public TranslucentWindow() {
            super("Test translucent window");
            setLayout(new FlowLayout());
            add(new JButton("test"));
            add(new JCheckBox("test"));
            add(new JRadioButton("test"));
            add(new JProgressBar(0, 100));
            JPanel panel = new JPanel() {
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(400, 300);
                }
                private static final long serialVersionUID = 1L;
    
                @Override
                protected void paintComponent(Graphics g) {
                    super.paintComponent(g);
                    g.setColor(Color.red);
                    g.fillRect(0, 0, getWidth(), getHeight());
                }
            };
            panel.add(new JLabel("Very long textxxxxxxxxxxxxxxxxxxxxx "));
            add(panel);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setUndecorated(true);
            pack();
            setLocationRelativeTo(null);
            setOpacity(0.70f);
        }
    
        public static void main(String[] args) {
            try {
                for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                    if ("Nimbus".equals(info.getName())) {
                        UIManager.setLookAndFeel(info.getClassName());
                        break;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            //JFrame.setDefaultLookAndFeelDecorated(true);
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    Window w = new TranslucentWindow();
                    w.setVisible(true);
                }
            });
        }
    } 
    

    这篇关于Java / Swing - &gt;创建通知JFrame,并且错误“框架是可显示的”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆