Zwei Anwendungen kommen sich in die Quere!

leonReif

Neues Mitglied
Hallo zusammen,

ich habe eine Anwendung, die so aussieht:

class XYZView extends FrameView
class XYZApp extends SingleFrameApplication

Diese Anwendung befindet sich in eine Jar-Datei.

Ich möchte diese Anwendung aus einem anderen Java-Programm aufrufen. Es „funktioniert“ es auch!

Ich habe diese Jar-Datei in der zweiten Anwendung eingebunden. Die zweite Anwendung sieht so aus:

class ABCView extends FrameView
class ABCApp extends SingleFrameApplication

Das eigentliche Problem:

Wenn man die erste Anwendung (XYZApp) aus der zweiten Anwendung aufruft und anschließend schließt, dann kann ich nicht mehr in der zweiten Anwendung (ABCApp) ein Unterfenster öffnen. Es knallt genau an folgender Stelle in der Klasse Class.java unter:

public T cast(Object obj) {
if (obj != null && !isInstance(obj))
throw new ClassCastException();
return (T) obj;
}

Fehlermeldung:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException at java.lang.Class.cast(Class.java:2990)

Wenn XYZApp einmal aufrufen wird, dann bleibt das „obj“ auf XYZApp stehen. Wenn ich nun versuche in der zweiten Anwendung über einem Button ein weiteres Fenster öffnen, dann wird in der Methode „T cast(Object obj)“ ein ABCApp erwartet und NICHT XYZApp!! Ich rufe sogar beim schließen der ersten Anwendung (XYZApp) folgendes auf:
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

Was kann ich tun, dass beim Aufruf der Methode „T cast(Object obj)“ das richtige Objekt reinkommt?

Vielen Dank im Voraus
 
Von wo wird die Methode denn aufgerufen? Kompletter Stacktrace und den relevanten Teil des Codes, der sich auf die erste Zeile des Stacktraces bezieht, die von dir stammt.
 
Hallo Marco,

ich habe in der zweiten Anwendung (ABCView) einen Button. Durch den Button-Click wird eine Methode
Java:
show()
aufgerufen. Diese Methode sorgt dafür, dass die erste Anwendung geöffnet wird.

Java:
private void jMenuHelpActionPerformed(java.awt.event.ActionEvent evt){                                          
         HelperClass.show();
    }

Die show-Methode sieht so aus:
Java:
show(){
   XYZApp.main(new String[]{""});
}

In Zukunft soll die erste Anwendung (ABCView bzw. ABCApp) in allen Anwendungen als jar eingebunden und benutzt.

Hier ist der Code von XYZApp (erste Anwendung, die in allen Anwendungen eingebunden werden soll):

Java:
package de.XYZApp;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.UIManager;
import org.jdesktop.application.Application;
import org.jdesktop.application.SingleFrameApplication;
import org.jvnet.substance.SubstanceLookAndFeel;

/**
 * The main class of the application.
 */
public class XYZApp extends SingleFrameApplication {

    private static JFrame frame = null;
    /**
     * At startup create and show the main frame of the application.
     */
    @Override protected void startup() {
        show(new XYZView(this));
    }

    /**
     * This method is to initialize the specified window by injecting resources.
     * Windows shown in our application come fully initialized from the GUI
     * builder, so this additional configuration is not needed.
     */
    @Override
    protected void configureWindow(java.awt.Window root) {
        frame = XYZApp.getApplication().getMainFrame();
        frame.addWindowListener(new WindowAdapter(){

            @Override
            public void windowClosing(WindowEvent e) {
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            }

            @Override
            public void windowClosed(WindowEvent e) {
            }
        });
    }

    /**
     * A convenient static getter for the application instance.
     * @return the instance of XYZApp
     */
    public static XYZApp getApplication() {
        return Application.getInstance(XYZApp.class);
    }

    /**
     * Main method launching the application.
     */
    public static void main(String[] args)
    {
            JFrame.setDefaultLookAndFeelDecorated(true);
            JDialog.setDefaultLookAndFeelDecorated(true);
            UIManager.put(SubstanceLookAndFeel.SHOW_EXTRA_WIDGETS, false);
            UIManager.put(SubstanceLookAndFeel.WATERMARK_VISIBLE, false);
            SubstanceLookAndFeel.setToUseConstantThemesOnDialogs(true);
            launch(XYZApp.class, args);
    }
}

Hier ist der Code von ABCApp:

Java:
package abc;

import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.UIManager;
import org.jdesktop.application.Application;
import org.jdesktop.application.SingleFrameApplication;
import org.jvnet.substance.SubstanceLookAndFeel;

/**
 * The main class of the application.
 */
public class ABCApp extends SingleFrameApplication {

    /**
     * At startup create and show the main frame of the application.
     */
    @Override protected void startup() {
        show(new ABCView(this));
    }

    /**
     * This method is to initialize the specified window by injecting resources.
     * Windows shown in our application come fully initialized from the GUI
     * builder, so this additional configuration is not needed.
     */
    @Override protected void configureWindow(java.awt.Window root) {

        ABCApp.getApplication().getMainFrame().addWindowListener(new WindowAdapter(){

            public void windowOpened(WindowEvent e) {
			
            }
        });
    }

    /**
     * A convenient static getter for the application instance.
     * @return the instance of ABCApp
     */
    public static ABCApp getApplication() {
        return Application.getInstance(ABCApp.class);
    }

    /**
     * Main method launching the application.
     */
    public static void main(String[] args) {

        JFrame.setDefaultLookAndFeelDecorated(true);
        JDialog.setDefaultLookAndFeelDecorated(true);
        UIManager.put(SubstanceLookAndFeel.SHOW_EXTRA_WIDGETS, false);
        UIManager.put(SubstanceLookAndFeel.WATERMARK_VISIBLE, false);
        SubstanceLookAndFeel.setToUseConstantThemesOnDialogs(true);
        launch(ABCApp.class, args);
    }
}

Wenn ich nur einmal die Methode show() aufrufe, dann kann ich in der zweiten Anwendung andere Sub-Fenster nicht mehr öffnen, da das "obj" in der Methode
Java:
public T cast(Object obj) {
if (obj != null && !isInstance(obj))
throw new ClassCastException();
return (T) obj;
}

auf die Klasse XYZApp zeigt und nicht auf ABCApp! Was muss ich tun, dass beim Schließen die XYZApp nicht mehr gültig ist?

Danke
 
Hm. Infiefern das mit "jdesktop" zusammenhängt (was ich nicht kenne) und wo die Exception genau herkommt erkennt man daran jetzt nicht. Vielleicht hat da jemand eine Idee.
 
Dabei handelt es sich um das Swing Application Framework (JSR 296) https://appframework.dev.java.net/

Im Endeffekt ist das ganze eine kleiner Wrapper um Swing mit zusätzlichem LifeCycle und einigen vereinfachten Dingen (ActionHandling, Internationalization, ...). Evtl. hängt der Fehler in der Tat mit dem Framework zusammen, das ganze ist allerdings meiner Meinung nach auch noch nicht wirklich ausgereift (zumindest hatte ich auch massig Probleme damit, als ich es mir vor ca. 1 Jahr angeguckt hatte).

Evtl. sollte der TO mal ein Komplett Kompilierbares Beispiel Programm zusammenstellen, dann würde ich mir das mal anschauen.
 

Neue Themen


Zurück
Oben