Will new instance of JVM or reflection help in this case

前端 未结 3 1263
无人及你
无人及你 2021-01-14 18:57

I had a problem that I posted before but got no clear solution

How to prevent JFrame from closing.

So I am posting a SSCCE may be this might help in better u

相关标签:
3条回答
  • 2021-01-14 19:19

    You could use JFrame.getFrames() which returns an array of Frame (you could also getWindows() for a much lower level list of those windows created within the current application context).

    Then, you need to walk through, checking each frame to see if it meets your requirements. After, that, you don't need reflection, you gain direct access to the frames

    The only only way to communicate with other JVM's is via socket comms (such as RMI).

    UPDATE WITH EXAMPLE

    Frame[] listOfFrames = JFrame.getFrames();
    for (Frame : listOfFrames) {
      if (frame instanceof JFrame) {
    
          JFrame aFrame = (JFrame)frame;
    
      }
    }
    
    0 讨论(0)
  • 2021-01-14 19:22

    Cross Process Communications is not a simple thing. Basically, each process you want to talk to needs to have a ServerSocket with which it can accept incoming requests. If you want to perform two way communication, each process would need to have it's own ServerSocket, this will allow ANY process to start the communications.

    This raises issues with port numbers and the like, but you could actually do a muticast to over come that (basically, "hay everybody, I'm here, come talk to me") which could be used to determine who's available or not - take a look at Broadcasting to Multiple Recipients for an example.

    So. When you're ready, you would open a socket connection to the process in question (localhost/127.0.0.1) on it's port and start chatting.

    Now. The problem I see with what you've described, is the fact that in order to get this to run, you're going to need some kind of launcher that can create the server socket and then execute the existing program (as you've already described), which raises the question of why? If you're only goal is to get these frames to stop closing your application, simply launching the program in a new JVM achieves that goal. Obviously, if you still need more information from them, then that's a reasonable excuse for all the hard work.

    Now, the good news, you can serialize objects across sockets (that is, you can send Java objects via the socket connection), check Discover the secrets of the Java Serialization API for more info.

    Now, if that hasn't scared you off, check out All About Sockets for more information.

    And finally, the big question of "how" to execute a new JVM, check out Java ProcessBuilder, it actually describes a means by which you can execute a new JVM!!

    0 讨论(0)
  • 2021-01-14 19:22

    So have completed the solution with the help provided by MadProgrammer amd mKorbel and here is the updated MYApp class

    package myApp;
    
    import java.awt.Frame;
    import java.awt.Window;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    import javax.swing.JFrame;
    
    import App2.Applic2;
    
    public class MYApp {
    
        @SuppressWarnings({ "unchecked", "rawtypes" })
        public static void main(String arg[]){
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setTitle("Application frame 1");
            f.setSize(200,200);
            f.setVisible(true);
            Class cls = Applic2.class;
            Object[] actuals = { new String[] { "" } };
    
    
    
    
            Method m = null;
            try {
                m=cls.getMethod("main", new Class[] { String[].class } );
    
    
                Method[] m1  =Frame.class.getDeclaredMethods();
    
    
    
    
    
    
    
            } catch (NoSuchMethodException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
                try {
                    m.invoke(null,actuals);
                } catch (IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    
    
                Frame[] f2 = JFrame.getFrames();
                //  Window[] f23=  JFrame.getFrames();
    
                    for(Frame fx: f2){
                        System.out.println(fx.getTitle());
                        //  fx.setVisible(false);
    
                          if (fx instanceof JFrame) {
    
                              JFrame aFrame = (JFrame)fx;
                              aFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    
                          }
                        }
    
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题