2016-07-10 7 views
0

Ich habe eine Java-Desktop-Anwendung mit einem Swing GUI. In der Menüleiste gibt es einen "About" Eintrag. Wenn Sie auf diesen "Über" -Menü klicken, wird ein JDialog mit JOptionPane.showMessageDialog (...) mit einem Icon, einem Text über mein Programm und einem "OK" -Button angezeigt, um den Dialog zu schließen.Java JOptionPane benutzerdefinierte zeichnen auf Hintergrund

Ich möchte einen Effekt von einer oder mehreren Kugeln (Kreise) zeichnen, die sich im Hintergrund des Dialogs bewegen und ihre Farben ändern.

AKTUALISIERT Code mit der Lösung von @Titus:

Individuelle JOptionPane Klasse:

class MyEffectPane extends JOptionPane { 

    public MyEffectPane(String message, int type){ 
     super(message, type); 

     makeOpa(this); 
    } 

    // needed to make the drawings visible 
    void makeOpa(JComponent comp){ 
     for(Component c : comp.getComponents()){ 
      if(c instanceof JPanel){ 
       JPanel p = (JPanel)c; 
       p.setOpaque(false); 
       makeOpa(p); 
      } 
     } 
    } 


    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     int width = getWidth(); 
     int height = getHeight(); 

     g.setColor(Color.BLACK); 

     g.fillOval(width/2-50, height/2-50, 50, 50); 
    } 
} 

Call/Show-Dialog:

MyEffectPane pane = new MyEffectPane("message....", JOptionPane.INFORMATION_MESSAGE); 
    JDialog dialog = pane.createDialog(this, "About"); 
    //dialog.setIconImage(icon.getImage()); 
    dialog.setVisible(true); 
    dialog.dispose(); 
+1

Die 'showMessageDialog' Methode ist' static' (Sie können sie nicht überschreiben) und sie erstellt ihr eigenes 'JOptionPane' Objekt. – Titus

+0

@Titus Danke, kennst du eine Lösung für mein Problem? – trinity420

+1

Verwenden Sie für Ihre Debugging-Anweisungen nicht 'System.out.println()'. Es wird nicht unbedingt bei jeder Ausführung eine Zeile gedruckt, da 'System.out' ein gepufferter Stream ist. Verwenden Sie stattdessen "System.err.println()" für die sofortige garantierte Ausgabe. –

Antwort

3

Die showMessageDialog Methode ist static (können Sie Überschreiben Sie es nicht und es erstellt sein eigenes Objekt JOptionPane.

Sie können reproduzieren, was die showMessageDialog tut, das ist:

/** 
* This method shows an INFORMATION_MESSAGE type message dialog. 
* 
* @param parentComponent The component to find a frame in. 
* @param message The message displayed. 
*/ 
public static void showMessageDialog(Component parentComponent, Object message){ 
    JOptionPane pane = new JOptionPane(message, INFORMATION_MESSAGE); 
    JDialog dialog = pane.createDialog(parentComponent, null); 
    dialog.show(); 
} 

Und man kann es so etwas ändern:

MyEffectPane pane = new MyEffectPane("message....", JOptionPane.INFORMATION_MESSAGE); 
JDialog dialog = pane.createDialog(this, null); 
dialog.show(); 

Außerdem werden Sie diesen Konstruktor hinzufügen müssen Ihre MyEffectPane Klasse:

MyEffectPane(String message, int type){ 
    super(message, type); 
} 
+0

Danke !!!! Das funktioniert perfekt !! Ich musste nur etwas Code hinzufügen, damit die Komponenten des JDialogs meine Drawins nicht mit 'setOpaque (false)' verstecken. Ich werde den Post mit dem Arbeitscode aktualisieren. – trinity420

2

Ich möchte einen Effekt von einer oder mehreren Kugeln (Kreise) zeichnen, die sich im Hintergrund des Dialogs bewegen und ihre Farben ändern.

Keine JOptionPane verwenden.

Stattdessen können Sie Ihre benutzerdefinierte JDialog erstellen. Dann würden Sie Ihrem Dialog, der benutzerdefinierte Bilder erstellt, ein JPanel hinzufügen.

Lesen Sie den Abschnitt aus dem Swing-Tutorial auf Custom Painting für weitere Informationen.

Hinweis, wenn Sie benutzerdefinierte Übermalung paintComponent(..) malen, nicht malen (...).

Oder wenn Sie möchten, können Sie einfach das benutzerdefinierte JPanel zum JOptionPane hinzufügen. In jedem Fall ist der Schlüssel, die benutzerdefinierte Malerei auf einem JPanel zu tun.

+0

Danke auch, aber die Methode von @Titus funktioniert einwandfrei. Ich habe das versucht, aber das Problem ist, dass Sie Anpassungen für Ihren Text, Icon und die OK-Taste im JDialog vornehmen müssen, um gut auszusehen. Das Hinzufügen eines Panels funktioniert, aber Sie haben nur einen kleinen Bereich, in dem Sie zeichnen können. In diesem Bereich befindet sich der Text eines normalen JDialogs. – trinity420

1

Sie können JOptionPane nicht überschreiben. Es ist statisch und wird meist nur zum einfachen Erstellen von Bestätigungsoptionen verwendet.

Für was Sie wollen, können Sie JDialog verwenden. JDialog erleichtert es Ihnen, ein Popup-Fenster mit angepassten Inhalten zu erstellen.

Da Sie bereits versuchen, ein JOptionPane zu verwenden, nehme ich an, dass Sie ein enthaltenes Panel haben, das das JOptionPane auslöst.Alles, was Sie tun müssen, ist folgendes:

  1. Verwenden Sie SwingUtilities.getWindowAncestor(panel), um das enthaltene Fenster aus Ihrem übergeordneten Panel zu extrahieren.
  2. Verwenden Sie das extrahierte Fenster, um den JDialog zu erstellen: JDialog dialog = new JDialog(containerWindow)
  3. Passen Sie die JDialog-Funktionen nach Ihren Wünschen.

Teil des Codes sollte ähnlich aussehen:

Window containerWindow = SwingUtilities.getWindowAncestor(panel); 
JDialog dialog = new JDialog(containerWindow); 
dialog.setLayout(new BorderLayout()); 
dialog.setLocationRelativeTo(containerWindow); 
dialog.setResizeable(false); 
dialog.add(effectPanel, BorderLayout.CENTER); 

In diesem Fall effectPanel ist Ihre eigene Panel mit den Grafiken und alles, was Sie tun wollen. Dies ist nicht der beste Weg, um den Code zu schreiben, aber ich schreibe es nur als ein Beispiel für Sie. Sie können mehr sehen, was JDialog hier kann: JDialog

+0

Danke! Das sieht sehr interessant aus! Ich denke, es könnte ein Problem sein, dass der resultierende JDialog aufgrund der Verwendung von BorderLayout nicht so gut aussieht, so dass zum Beispiel der OK-Button die volle Breite unten erhält. Oder denke ich falsch? Die @ Titus Methode funktioniert jedoch einwandfrei. – trinity420

+1

Ich habe BorderLayout nur als Beispiel benutzt. Sie können das Layout verwenden, das Sie benötigen. Wenn Sie eine einfachere Lösung gefunden haben, ist das großartig! Wenn das, was Sie mit dem Optionsfeld tun müssen, etwas komplizierter wird, dann ist JDialog vielleicht nützlicher. – Migsarmiento

+0

Sie haben recht, wenn es komplizierter wird, ist vielleicht Ihre Lösung besser. – trinity420

Verwandte Themen