Java / Swing - >创建通知JFrame,并且错误“框架是可显示的” [英] Java / Swing -> Creating a notification JFrame, and the error "The frame is displayable"
问题描述
好吧,我不是那么精通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 - >创建通知JFrame,并且错误“框架是可显示的”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!