2012-05-10 5 views
5

Ho un pulsante J e premendo apre una finestra di dialogo modale. Quando chiudo la finestra di dialogo, il pulsante sembra ancora in uno stato premuto fino a quando non muovo il mouse. Penso che questo stia accadendo perché JDialog è aperto su un componente AWT (è un componente di terze parti che usa una tela AWT e non posso cambiarlo). Se apro la finestra di dialogo e la chiudo sopra un componente mobile, funziona correttamente.pulsante di oscillazione java non ridisegna correttamente dopo la finestra di dialogo chiusa

Ho provato ad aggiungere un listener di finestre alla finestra di dialogo e ridisegnare l'intero fotogramma (utilizzando il ridisegno e la pittura immediatamente) quando la finestra di dialogo si chiude, ma questo non funziona. Qualche suggerimento su come risolvere questo problema?

Ecco un esempio di SSCCE. Premere il pulsante e quindi chiudere la finestra di dialogo. Notare che il bordo della messa a fuoco è ancora intorno al pulsante fino a quando si sposta il mouse sulla sezione verde.

import java.awt.BorderLayout; 
import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 

import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class DialogExample 
{ 

    public static void main(String[] args) throws Exception 
    { 

     final JFrame jf = new JFrame("AWT/Swing Dialog Test"); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JButton button = new JButton("show dialog"); 
     final Canvas canvas = new Canvas() { 
      @Override 
      public void paint(Graphics g) 
      { 
       g.setColor(Color.RED); 
       g.fillRect(0, 0, getWidth(), getHeight()); 
      } 
     }; 
     canvas.setPreferredSize(new Dimension(200,200)); 

     button.setAction(new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       JDialog dlg = new JDialog(jf,"modal"); 
       dlg.add(new JLabel("hello")); 
       dlg.setModal(true); 
       dlg.pack(); 
       dlg.setLocationRelativeTo(canvas); 
       dlg.setVisible(true); 
      }    
     }); 
     button.setText("press me"); 
     button.setFocusable(false); 
     JPanel panel = new JPanel(); 
     panel.setBackground(Color.GREEN);   
     panel.setPreferredSize(new Dimension(200, 200)); 
     jf.setLayout(new BorderLayout()); 
     panel.add(button); 
     jf.add(panel, BorderLayout.NORTH); 
     jf.add(canvas, BorderLayout.SOUTH); 
     jf.setSize(new Dimension(400,400)); 
     jf.setVisible(true); 
    }  
} 
+1

* "Credo che questo sta accadendo perché la JDialog si apre sulla parte superiore di un componente AWT" * Perché non provare a riprodurlo in un [SSCCE] (http://sscce.org/)? –

+1

Non ho usato componenti AWT da molto, molto tempo. Tutto quello che ricordo è che ti metti nei guai quando lo mescoli con Swing. Ma suggerirei di portare un [SSCCE] (http://sscce.org) –

+1

@Guillaume Questo è vero, sebbene di solito si applica solo agli elementi mobili di Swing come il menu a discesa di un 'JComboBox' o un suggerimento . Non ho mai saputo che succedesse quando i componenti AWT sono in una finestra e Swing in un'altra. Java 7 offre apparentemente un flag che consente di mixare liberamente i componenti AWT e Swing. –

risposta

5

Come un espediente, è possibile cancellare lo stato di rollover quando i rendimenti di dialogo in actionPerformed():

@Override 
public void actionPerformed(ActionEvent e) { 
    JDialog dlg = new JDialog(jf, "modal"); 
    dlg.add(new JLabel("hello")); 
    dlg.setModal(true); 
    dlg.pack(); 
    dlg.setLocationRelativeTo(canvas); 
    dlg.setVisible(true); 
    button.getModel().setRollover(false); 
} 
+0

Grazie, proverò a provare e postare sui risultati. –

+1

sembra fare il trucco, grazie –

+0

+1. Soluzione semplice –

Problemi correlati