I'm writing my own class for notifications (don't mind the code, it was generated by IntelliJ GUI Designer)
public class NotificationWindow extends JWindow {
private JLabel icon;
private JTextArea message;
private JLabel title;
private JPanel mainPanel;
private Spacer spacer1;
private Spacer spacer2;
public NotificationWindow(String ttl, String msg) {
mainPanel = new JPanel();
mainPanel.setLayout(new GridLayoutManager(3, 3, new Insets(5, 5, 5, 5), -1, -1));
icon = new JLabel();
icon.setIcon(new ImageIcon(getClass().getResource("/resources/employee 64.png")));
title = new JLabel(ttl);
title.setFont(
new Font(title.getFont().getName(), Font.BOLD, title.getFont().getSize()));
message = new JTextArea(3, 44);
message.setText(msg);
message.setOpaque(false);
message.setFont(message.getFont().deriveFont(12f));
message.setLineWrap(true);
message.setWrapStyleWord(true);
spacer1 = new Spacer();
spacer2 = new Spacer();
this.pack();
this.setSize(400, 80);
this.setAlwaysOnTop(true);
this.setVisible(true);
this.getRootPane().setBorder(
BorderFactory.createMatteBorder(1, 1, 1, 1, Color.DARK_GRAY));
Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();
Insets toolHeight = Toolkit.getDefaultToolkit()
.getScreenInsets(this.getGraphicsConfiguration());
this.setLocation(
scrSize.width - this.getWidth() - 20,
scrSize.height - toolHeight.bottom - this.getHeight() - 20);
this.initUI();
}
private void initUI() {
mainPanel.add(icon,
new GridConstraints(0, 0, 3, 1,
GridConstraints.ANCHOR_CENTER,
GridConstraints.FILL_NONE,
GridConstraints.SIZEPOLICY_FIXED,
GridConstraints.SIZEPOLICY_FIXED,
null, null, null, 0, false));
mainPanel.add(title,
new GridConstraints(0, 1, 1, 2,
GridConstraints.ANCHOR_WEST,
GridConstraints.FILL_NONE,
GridConstraints.SIZEPOLICY_FIXED,
GridConstraints.SIZEPOLICY_FIXED,
null, null, null, 0, false));
mainPanel.add(message,
new GridConstraints(1, 1, 1, 2,
GridConstraints.ANCHOR_WEST,
GridConstraints.FILL_NONE,
GridConstraints.SIZEPOLICY_FIXED,
GridConstraints.SIZEPOLICY_FIXED,
null, null, null, 0, false));
mainPanel.add(spacer1,
new GridConstraints(2, 1, 1, 1,
GridConstraints.ANCHOR_CENTER,
GridConstraints.FILL_VERTICAL,
1,
GridConstraints.SIZEPOLICY_WANT_GROW,
null, null, null, 0, false));
mainPanel.add(spacer2,
new GridConstraints(2, 2, 1, 1,
GridConstraints.ANCHOR_CENTER,
GridConstraints.FILL_HORIZONTAL,
GridConstraints.SIZEPOLICY_WANT_GROW,
1, null, null, null, 0, false));
this.setContentPane(mainPanel);
this.repaint();
// time after which notification will be disappeared
new Thread(() -> {
try {
Thread.sleep(6000);
dispose();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
The idea is that the program will show notification every hour as a reminder to users. For this purposes, I am using ScheduledExecutorService
class. I am calling Notification this way (for testing notification called every 20 seconds):
ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
ses.scheduleAtFixedRate(new Runnable() {
private int i = 1;
@Override
public void run() {
NotificationWindow notificationWindow =
new NotificationWindow(
"blah blah",
"Please, " +
"specify the details of the task you're currently working on.");
}
}, 10, 20, TimeUnit.SECONDS);
The problem is that notification window sometimes does not render properly. Sometimes it's just frame the same size as notification window should be only with white background without any elements. Where is my mistake?