2012-05-10 9 views
5

मेरे पास एक जेबटन है और इसे दबाने से एक मोडल संवाद खुलता है। जब मैं संवाद बंद करता हूं, बटन तब भी दिखता है जब तक कि मैं माउस को नहीं ले जाता तब तक यह एक दबाए गए राज्य में है। मुझे लगता है कि यह हो रहा है क्योंकि जेडियलॉग एडब्ल्यूटी घटक के शीर्ष पर खोला गया है (यह एक तृतीय पक्ष घटक है जो एडब्ल्यूटी कैनवास का उपयोग करता है, और मैं इसे बदल नहीं सकता)। यदि मैं संवाद खोलता हूं और इसे स्विंग घटक पर बंद करता हूं, तो यह ठीक से काम करता है।जावा स्विंग बटन संवाद बंद होने के बाद ठीक से पेंट नहीं करता

संवाद में बंद होने पर मैंने संवाद में एक विंडो श्रोता जोड़ने और पूरे फ्रेम को पुनर्निर्मित करने की कोशिश की है (पुनर्निर्मित और पेंट का उपयोग करके), लेकिन यह काम नहीं करता है। इसे ठीक करने के लिए कोई सुझाव?

यहां एक एसएससीसीई उदाहरण है। बटन दबाएं और फिर संवाद बंद करें। नोटिस फोकस सीमा अभी भी बटन के चारों ओर है जब तक कि माउस को हरे रंग के खंड में नहीं ले जाया जाता है।

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

* "मुझे लगता है कि क्योंकि JDialog एक AWT घटक के शीर्ष पर खोला जाता है यह हो रहा है" * इसे [एसएससीसीई] (http://sscce.org/) में पुन: पेश करने का प्रयास क्यों न करें? –

+1

मैंने लंबे समय तक एडब्ल्यूटी घटकों का उपयोग नहीं किया है। मुझे याद है कि जब आप स्विंग के साथ मिश्रण करते हैं तो आपको परेशानी होती है। लेकिन मैं एक [एसएससीसीई] लाने के लिए सुझाव दूंगा (http://sscce.org) –

+1

@ गुइलाइम यह सच है, हालांकि यह आमतौर पर केवल 'JComboBox' के ड्रॉप-डाउन या टूल-टिप जैसे स्विंग फ़्लोटिंग तत्वों पर लागू होता है । मैंने कभी ऐसा नहीं किया है जब एडब्ल्यूटी घटक एक खिड़की में हैं और दूसरे में स्विंग करते हैं। जावा 7 स्पष्ट रूप से एक ध्वज प्रदान करता है जिसका उद्देश्य एडब्ल्यूटी और स्विंग घटकों को स्वतंत्र रूप से मिश्रित करने की अनुमति देना है। –

उत्तर

5

एक समीचीन रूप में, आप घुमाने की स्थिति साफ कर सकते हैं 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

धन्यवाद, मैं इसे कोशिश करता हूं और परिणामों पर वापस पोस्ट करता हूं। –

+1

ऐसा लगता है चाल, धन्यवाद –

+0

+1। सरल समाधान –

संबंधित मुद्दे