2011-08-07 16 views
5

में टाइमर के अंदर जेएफआरएएम सीमाएं प्राप्त करने में समस्या, मैं अपने कार्यक्रम में एक बटन दबाते समय एक जेएफआरएएम आधा आकार बनना चाहता हूं। मुझे लगता है कि सबसे आसान तरीका जेएफआरएएम की वर्तमान सीमाओं को टाइमर में डाल रहा है और टाइमर चलने पर 1 से 1 की सीमा घटा देता है। लेकिन जब मैं नेटबीन्स आईडीई में एक नया टाइमर घोषित करता हूं तो यह ऐसा दिखाई देगा।नेटबीन्स

 Timer t = new Timer(5,new ActionListener() { 

     public void actionPerformed(ActionEvent e) { 

      //inside this I want to get my Jframe's bounds like this 
      // int width = this.getWidth();---------here,"this" means the Jframe 

      } 

     } 
    }); 

लेकिन समस्या यह है यहाँ में है "इस" JFrame.And की बात कर नहीं भी मैं अपने की एक नई वस्तु बनाने नहीं कर सकते JFrame.Because यह मुझे एक और window.Can किसी को भी मुझे इस समस्या को हल करने में मदद दे देंगे? ।

+1

'frame.getWidth()' कोशिश करें जहां 'फ्रेम' जेएफआरएएम है जिसका आप उल्लेख कर रहे हैं। – fireshadow52

उत्तर

5

int width = Foo.this.getWidth(); 

प्रयास करें जहां Foo उपवर्गों JFrame

+0

लॉल ... आपके समर्थन के लिए धन्यवाद ... लेकिन यह काम नहीं कर रहा है ....:/ – Thusitha

+0

@ थुसिता, कक्षा के नाम से 'जेएफआरएएम' को बदलें जो 'जेएफआरएएम' उप-वर्ग है। – mre

+2

यह काम करना चाहिए यदि टाइमर कोड मुख्य वर्ग में आंतरिक है, और यदि मुख्य वर्ग जेएफआरएएम (इसलिए इस उत्तर के लिए 1+ अपवॉट) उप-वर्ग है, लेकिन कैमिकर की सिफारिश इन प्रतिबंधों के बावजूद काम करेगी (इसलिए कैमरे के उत्तर में 1+)। –

5

मैं एक JFrame चेतन करने के लिए आधे आकार बनने के लिए जब मैं अपने कार्यक्रम में एक बटन दबाएँ

तो जब आप बटन पर क्लिक करें आप बटन तक पहुंच नहीं है। फिर आप इसका उपयोग कर सकते हैं:

SwingUtilities.windowForComponent(theButton); 

फ्रेम का संदर्भ प्राप्त करने के लिए।

तो अब जब आप टाइमर के लिए एक्शनलिस्टर बनाते हैं तो आप विंडो में एक्शनलिस्टर के लिए तर्क के रूप में पास कर सकते हैं।

संपादित करें:

सुझाव MRE से सरल और सीधे आगे और कई मामलों में उपयोग करने के लिए आसान है (और शायद इस मामले में बेहतर समाधान)।

मेरा सुझाव थोड़ा अधिक जटिल है लेकिन यह आपको स्विंग यूटिलिटीज विधि के साथ पेश कर रहा था जो अंततः आपको अधिक पुन: प्रयोज्य कोड लिखने की अनुमति देगा जो संभावित रूप से किसी भी फ्रेम या संवाद द्वारा उपयोग किया जा सकता है।

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class AnimationSSCCE extends JPanel 
{ 
    public AnimationSSCCE() 
    { 
     JButton button = new JButton("Start Animation"); 
     button.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       JButton button = (JButton)e.getSource(); 
       WindowAnimation wa = new WindowAnimation(
        SwingUtilities.windowForComponent(button)); 
      } 
     }); 

     add(button); 
    } 


    class WindowAnimation implements ActionListener 
    { 
     private Window window; 
     private Timer timer; 

     public WindowAnimation(Window window) 
     { 
      this.window = window; 
      timer = new Timer(20, this); 
      timer.start(); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      window.setSize(window.getWidth() - 5, window.getHeight() - 5); 
//   System.out.println(window.getBounds()); 
     } 
    } 


    private static void createAndShowUI() 
    { 
     JFrame frame = new JFrame("AnimationSSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new AnimationSSCCE()); 
     frame.setSize(500, 400); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 

बेशक आप टाइमर को रोकने के लिए जब winow एक निश्चित न्यूनतम आकार तक पहुँच जाता है चाहेगा का:

एक साधारण उदाहरण की तरह कुछ होगा। मैं उस कोड को आपके पास छोड़ दूंगा।

+0

कृपया आप इसे आगे समझा सकते हैं ... मैं जावा के लिए काफी नया हूं। – Thusitha

+0

स्पष्ट और सही +1 – mKorbel

+0

@ थूसिथा, संपादित देखें। – camickr