Vollbild und Fenster



  • Also, ich habe eine Klasse geschrieben die praktisch als Zeichenoberfläche dient. Sie ist von Frame abgeleitet und kann entweder als Fenster oder im Vollbildmodus genutzt werden. Nun gibt es da eine kleine ungereimtheit.
    Als ich noch direkt Frame benutzt habe um zu zeichnen, konnte ich zwar mit Doppelpufferung etwas zeichnen, aber dabei kam es halt zu ner Menge Exceptions wegen ungültigen Peer usw.. Aber immerhin wurde das was ich wollte, gezeichnet, solange ich jede Neuzeichnung manuell veranlasst und ohne Threads gearbeitet habe. Also habe ich den code geändert und ein Canvas hinzugefügt, auf dem nun gezeichnet wird. Jetzt klappt das zeichnen auch mit Threads, aber leider nur im Fenstermodus. Im Fenster wird alles korrekt gezeichnet, aber wenn ich das Programm mit Vollbild starte funktioniert zwar alles sowas wie Events aber es wird halt überhaupt nichts gezeichnet. Der Unterschied im Code liegt halt nur im Konstruktor, dass eben einmal ein Fenster "eingerichtet" wird und einmal einmal der Vollbildmodus.

    Woran kann das liegen?

    public Playground(int x, int y, int width, int height, String title, 
    
    GraphicsDevice device) {
    
                super(title);
                setSize(width, height);
    
                setLocation(x, y);
                setVisible(true);
                setLayout(new BorderLayout());
                surface = new Canvas(device.getDefaultConfiguration());
                surface.setSize(width, height);
                surface.addKeyListener(this);
                add("Center", surface);
                surface.createBufferStrategy(numBuffers);
                surface.requestFocus();
                //setVisible(true);
    
            }
    
            public Playground(Dimension resolution, int colorDepth, GraphicsDevice 
    
    device) {
    
                super();    
    
                fullscreen = true;
                surface = new Canvas(device.getDefaultConfiguration());
    
                setLayout(new BorderLayout());
                add("Center", surface);
                surface.addKeyListener(this);
                thread = new Thread(this);
                this.device = device;
                try {
                    setUndecorated(true);
                    setIgnoreRepaint(true);
                    device.setFullScreenWindow(this);
                    surface.setSize((int)getWidth(), (int)getHeight());
                    if (device.isDisplayChangeSupported())
                        device.setDisplayMode(new 
    
    DisplayMode((int)resolution.getWidth(), (int)resolution.getHeight(), 
    
    colorDepth, 0));
                    surface.createBufferStrategy(numBuffers);
                } catch (Exception e) {
                    System.out.println(e.toString() + "\n\n");
                    e.printStackTrace();
                    device.setFullScreenWindow(null);
                }
                System.out.println("index: " + chosen);
                surface.requestFocus();
            }
    


  • Also, ich habe das nochmal umgeschrieben, so dass direkt auf dem Frame gezeichnet wird. Jetzt wird im Fenster und im Vollbild alles richtig angezeigt. Also es läuft alles reibungslos. Das einzig dumme ist, dass beim Start des Programmes immer die folgende exception auftritt:

    An unexpected exception has been detected in native code outside the VM.
    Unexpected Signal : EXCEPTION_ACCESS_VIOLATION (0xc0000005) occurred at PC=0x182DB326
    Function=Java_sun_print_Win32PrintJob_endPrintRawData+0x5182
    Library=C:\Programme\Java\j2re1.4.2_03\bin\awt.dll

    Current Java thread:
    at sun.java2d.DefaultDisposerRecord.invokeNativeDispose(Native Method)
    at sun.java2d.DefaultDisposerRecord.dispose(Unknown Source)
    at sun.java2d.Disposer.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

    Dynamic libraries:
    0x00400000 - 0x00406000 C:\WINNT\system32\java.exe
    0x77880000 - 0x77901000 C:\WINNT\system32\ntdll.dll
    0x79350000 - 0x793B2000 C:\WINNT\system32\ADVAPI32.dll
    0x77E70000 - 0x77F30000 C:\WINNT\system32\KERNEL32.DLL
    0x77D20000 - 0x77D8E000 C:\WINNT\system32\RPCRT4.DLL
    0x78000000 - 0x78045000 C:\WINNT\system32\MSVCRT.dll
    0x08000000 - 0x08138000 C:\Programme\Java\j2re1.4.2_03\bin\client\jvm.dll
    0x77E00000 - 0x77E5F000 C:\WINNT\system32\USER32.dll
    0x77F40000 - 0x77F79000 C:\WINNT\system32\GDI32.dll
    0x77540000 - 0x77571000 C:\WINNT\system32\WINMM.dll
    0x6BD00000 - 0x6BD0D000 C:\WINNT\system32\SYNCOR11.DLL
    0x10000000 - 0x10007000 C:\Programme\Java\j2re1.4.2_03\bin\hpi.dll
    0x007C0000 - 0x007CE000 C:\Programme\Java\j2re1.4.2_03\bin\verify.dll
    0x007D0000 - 0x007E9000 C:\Programme\Java\j2re1.4.2_03\bin\java.dll
    0x007F0000 - 0x007FD000 C:\Programme\Java\j2re1.4.2_03\bin\zip.dll
    0x18270000 - 0x1837F000 C:\Programme\Java\j2re1.4.2_03\bin\awt.dll
    0x777F0000 - 0x7780E000 C:\WINNT\system32\WINSPOOL.DRV
    0x782F0000 - 0x78301000 C:\WINNT\system32\MPR.DLL
    0x75DF0000 - 0x75E0A000 C:\WINNT\system32\IMM32.dll
    0x77A40000 - 0x77B2C000 C:\WINNT\system32\ole32.dll
    0x18580000 - 0x185D0000 C:\Programme\Java\j2re1.4.2_03\bin\fontmanager.dll
    0x51000000 - 0x5104D000 C:\WINNT\system32\ddraw.dll
    0x72810000 - 0x72816000 C:\WINNT\system32\DCIMAN32.dll
    0x5C000000 - 0x5C0C8000 C:\WINNT\system32\D3DIM700.DLL
    0x6E330000 - 0x6E336000 C:\WINNT\system32\INDICDLL.dll
    0x2C790000 - 0x2C7AE000 C:\Programme\Java\j2re1.4.2_03\bin\jpeg.dll
    0x77910000 - 0x77933000 C:\WINNT\system32\imagehlp.dll
    0x72970000 - 0x7299D000 C:\WINNT\system32\DBGHELP.dll
    0x68F30000 - 0x68F3B000 C:\WINNT\system32\PSAPI.DLL

    Heap at VM Abort:
    Heap
    def new generation total 576K, used 0K [0x10010000, 0x100b0000, 0x104f0000)
    eden space 512K, 0% used [0x10010000, 0x10010000, 0x10090000)
    from space 64K, 1% used [0x10090000, 0x100903d0, 0x100a0000)
    to space 64K, 0% used [0x100a0000, 0x100a0000, 0x100b0000)
    tenured generation total 2896K, used 2108K [0x104f0000, 0x107c4000, 0x14010000)
    the space 2896K, 72% used [0x104f0000, 0x106ff3f8, 0x106ff400, 0x107c4000)
    compacting perm gen total 4096K, used 2934K [0x14010000, 0x14410000, 0x18010000)
    the space 4096K, 71% used [0x14010000, 0x142ed9d0, 0x142eda00, 0x14410000)

    Local Time = Mon Mar 15 21:25:02 2004
    Elapsed Time = 9

    # The exception above was detected in native code outside the VM

    # Java VM: Java HotSpot(TM) Client VM (1.4.2_03-b02 mixed mode)

    Obwohl halt so eine Exception geworfen wird, läuft das Programm reibungslos weiter, sie wird wie gesagt auch nur einmal geworfen. Was soll ich jetzt machen? Das Programm läuft ja, sollte ich die Exception einfach ignorieren!?

    Denn ich seh momentan keine andere Möglichkeit, da ich es anders nicht hinkriege, wenn ich die Zeichenoperationen auf dem Canvas mache, entfällt zwar die Exception, aber leider ebenso die Grafik...


Anmelden zum Antworten