2012-05-06 12 views
18

रोबोट एडब्ल्यूटी लाइब्रेरी का हिस्सा है, लेकिन यह बाकी पुस्तकालय के बाकी हिस्सों से काफी अलग है। मैं एक स्विंग जीयूआई बना रहा हूं जो जावा नेटिव एक्सेस (जेएनए) और रोबोट के साथ स्विंग को मिश्रित करता है ताकि जावा कुछ एमएस विंडोज/साइट्रिक्स वर्क प्रोग्राम्स को ड्राइव कर सके। मेरी आंत महसूस यह है कि चूंकि रोबोट "प्लेटफार्म की मूल इनपुट कतार" पर घटनाओं को कतारबद्ध करेगा क्योंकि आखिरी चीज जो मैं करना चाहता हूं वह इसे ईडीटी पर चलाने के लिए है, लेकिन दूसरी तरफ, एडब्ल्यूटी और स्विंग पुस्तकालयों में अधिकांश कक्षाएं स्विंग इवेंट थ्रेड पर चलाना चाहिए। इसलिए मेरे दिमाग में इसे स्पष्ट करने के लिए मुझे एक प्रश्न के रूप में यथासंभव विशिष्ट प्रश्न पूछने दें:घटना कतार पर रोबोट विधियों को चलाने की आवश्यकता है?

रोबोट विधियों (विशेष कुंजी प्रेस और रिलीज, माउस चाल, माउस प्रेस और रिलीज़) में चलाना चाहिए या बंद होना चाहिए स्विंग घटना प्रेषण धागा (ईडीटी)?

+1

मुझे जवाब नहीं पता, लेकिन सवाल के लिए +1। मैं हमेशा सूर्य/ओरेकल के दावे से उलझन में था कि "** स्विंग ** जीयूआई को ईडीटी पर बनाया और अपडेट किया जाना चाहिए" सोच - यह *** *** *** एडब्ल्यूटी पर क्यों लागू नहीं होता है? –

+1

यहां, मुझे नहीं पता कि यह कितना मदद करेगा, लेकिन यह [उत्तर] (http://groups.google.com/group/jfxtras-dev/browse_thread/thread/d0521de3af5e3ded) स्टीफन द्वारा मदद कर सकता है बिट, पृष्ठभूमि में रोबोट से संबंधित सामान शुरू करना। –

+0

एंड्रयू और दयालु उदार, जानकारी के आपके उपयोगी बिट्स के लिए धन्यवाद। यदि कुछ और आपके पास आता है, तो कृपया साझा करें! –

उत्तर

10

Robot आपके द्वारा वर्णित विधियों को ईडीटी पर चलाना चाहिए। स्रोत कोड पर एक नज़र ले रहा है पता चला है कि इन "घटना" तरीकों में से हर एक में एक बात आम (afterEvent कॉल) है:

public synchronized void keyPress(int keycode) { 
    checkKeycodeArgument(keycode); 
    peer.keyPress(keycode); 
    afterEvent(); 
} 

public synchronized void mousePress(int buttons) { 
    checkButtonsArgument(buttons); 
    peer.mousePress(buttons); 
    afterEvent(); 
} 

// etc 

private void afterEvent() { 
    autoWaitForIdle(); 
    autoDelay(); 
} 

private void autoWaitForIdle() { 
    if (isAutoWaitForIdle) { 
     waitForIdle(); 
    } 
} 

public synchronized void waitForIdle() { 
    checkNotDispatchThread(); 
    /* snip */ 
} 

private void checkNotDispatchThread() { 
    if (EventQueue.isDispatchThread()) { 
     throw new IllegalThreadStateException("Cannot call method from the event dispatcher thread"); 
    } 
} 

आप EDT पर इनमें से किसी भी फोन है, जबकि Robot.isAutoWaitForIdletrue है, एक अपवाद फेंक दिया जाएगा। इसका कारण यह है कि isAutoWaitForIdlefalse है, इन तरीकों को ईडीटी से नहीं कहा जाना चाहिए।

+0

यही वह है! धन्यवाद! –

6
  • एपीआई काफी वास्तव में बात करती है, तो मैं समझता हूँ रहा है कि कि रोबोट अगर या नहीं EDT से शुरू हो जाती है

इनपुट ईवेंट उत्पन्न करने के लिए करने के लिए घटनाओं पोस्टिंग से अलग वर्ग का उपयोग करना उपेक्षा की जानी चाहिए एडब्ल्यूटी घटना कतार या एडब्ल्यूटी घटक जिसमें प्लेटफॉर्म की मूल इनपुट कतार में ईवेंट उत्पन्न होते हैं।

  • मैं rellative जावा में नया, मेरा पहला स्पर्श Java1.6.009 था, तो मैं AWT के लिए परिवर्तन तुलना नहीं कर सकते और Java1.3 में (जब पैदा हुआ) स्विंग और Java1.4
  • में आराम कर रहा हूँ

मेरी उदाहरण

import javax.imageio.*; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.*; 
import java.io.*; 

public class CaptureScreen implements ActionListener { 

    private JFrame f = new JFrame("Screen Capture"); 
    private JPanel pane = new JPanel(); 
    private JButton capture = new JButton("Capture"); 
    private JDialog d = new JDialog(); 
    private JScrollPane scrollPane = new JScrollPane(); 
    private JLabel l = new JLabel(); 
    private Point location; 

    public CaptureScreen() { 
     capture.setActionCommand("CaptureScreen"); 
     capture.setFocusPainted(false); 
     capture.addActionListener(this); 
     capture.setPreferredSize(new Dimension(300, 50)); 
     pane.add(capture); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(pane); 
     f.setLocation(100, 100); 
     f.pack(); 
     f.setVisible(true); 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       createPicContainer(); 
      } 
     }); 
    } 

    private void createPicContainer() { 
     l.setPreferredSize(new Dimension(700, 500)); 
     scrollPane = new JScrollPane(l, 
       ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, 
       ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
     scrollPane.setBackground(Color.white); 
     scrollPane.getViewport().setBackground(Color.white); 
     d.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE); 
     d.add(scrollPane); 
     d.pack(); 
     d.setVisible(false); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (e.getActionCommand().equals("CaptureScreen")) { 
      Dimension d1 = Toolkit.getDefaultToolkit().getScreenSize(); // gets the screen size 
      Robot r; 
      BufferedImage bI; 
      try { 
       r = new Robot(); // creates robot not sure exactly how it works 
       Thread.sleep(1000); // waits 1 second before capture 
       bI = r.createScreenCapture(new Rectangle(d1)); // tells robot to capture the screen 
       showPic(bI); 
       saveImage(bI); 
      } catch (AWTException e1) { 
       e1.printStackTrace(); 
      } catch (InterruptedException e2) { 
       e2.printStackTrace(); 
      } 
     } 
    } 

    private void saveImage(BufferedImage bI) { 
     try { 
      ImageIO.write(bI, "JPG", new File("screenShot.jpg")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private void showPic(BufferedImage bI) { 
     ImageIcon pic = new ImageIcon(bI); 
     l.setIcon(pic); 
     l.revalidate(); 
     l.repaint(); 
     d.setVisible(false); 
     location = f.getLocationOnScreen(); 
     int x = location.x; 
     int y = location.y; 
     d.setLocation(x, y + f.getHeight()); 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       d.setVisible(true); 
      } 
     }); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       CaptureScreen cs = new CaptureScreen(); 
      } 
     }); 
    } 
} 
+0

हमेशा mkorbel के रूप में धन्यवाद (जिस तरह से आपका पहला नाम है?)। मुझे बाद में इसका अध्ययन करने दें और आपको वापस आएं। –

+0

मिरोस्लाव, माइक अंग्रेजी होना चाहिए ..., मेरा सवाल यह कंसोल साइट्रिक्स फार्म के माध्यम से दूरस्थ सत्र है ??? – mKorbel

+0

(मिरोस्लाव): प्रेरित अनुप्रयोग की प्रकृति (जिसे मेरे जावा प्रोग्राम द्वारा संचालित किया जा रहा है) स्थान पर निर्भर करेगा। अगर मैं कार्यालय में हूं, तो यह एक स्टैंडअलोन एप्लीकेशन होगा। अगर मैं घर पर हूं और कंप्यूटर के माध्यम से कार्यालय से जुड़ा हूं, तो यह एक साइट्रिक्स क्लाइंट होगा (जो इस बात से काफी सीमित है कि मैं इसके साथ कैसे बातचीत कर सकता हूं)। –

6

@ mKorbel के विचारशील जवाब पर वृस्त्रण, और उसकी अनुभवजन्य परिणाम की पुष्टि, ध्यान दें कैसे RobotPeer का एक आंतरिक उदाहरण के लिए विभिन्न तरीकों Robot प्रतिनिधि इंटरफ़ेस, जिसका मूल कार्यान्वयन प्लेटफ़ॉर्म द्वारा भिन्न होता है। इसके अलावा, विधियों को सिंक्रनाइज़ कर रहे हैं। स्रोत के बावजूद सिंथेटिक घटनाएं EventQueue पर पहुंचती हैं।

+0

मुझे लगता है कि पुनरावर्ती स्क्रीनशॉट के लिए Thread.sleep (int) द्वारा सभी धागे तोड़ने की आवश्यकता है; +1 और मुझे लगता है कि जावा 1-3 से बनने वाली पूर्व एडब्ल्यूटी विधियां बहुत अनदेखी कर सकती हैं यदि ईडीटी है या नहीं, सरल काम, अजीब देरी के साथ कुछ समय लेकिन – mKorbel

+0

['ज़ूम'] (http://stackoverflow.com/ ए/3742841/230513) 'mouseDragged()' में 'createScreenCapture() 'को आमंत्रित करता है; ऐसा लगता है कि बिना किसी देरी के काम करते हैं, लेकिन प्रत्येक 'माउसवेन्ट' अलग है। – trashgod

+0

हमेशा trashgod के रूप में धन्यवाद! –

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