Отображение JFrame в конфигурации без растровой графики - PullRequest
2 голосов
/ 08 апреля 2011

Привет,

Я пытаюсь получить рисунок JFrame на неэкранном устройстве.Конструктор JFrame имеет

 JFrame(GraphicsConfiguration) 

, чтобы, казалось бы, разрешить это:

Моя первая попытка состояла в создании моей собственной GraphicsConfiguration, о которой GraphicsDevice сообщил GraphicsDevice.TYPE_IMAGE_BUFFER при вызове getType ().

Однако JFrame.init специально ищет тип и выдает исключение, если тип не TYPE_RASTER_SCREEN:

    if (graphicsConfig.getDevice().getType() !=
        GraphicsDevice.TYPE_RASTER_SCREEN) {
        throw new IllegalArgumentException("not a screen device");
    }

Затем я попытался создать в GraphicsDevice возвращенный отчет GraphicsDevice.TYPE_RASTER_SCREEN.Это позволило правильно инициализировать JFrame, но когда он начал отображать его, я получил

Exception in thread "main" java.lang.ClassCastException: TestGraphicsConfiguration cannot be cast to sun.awt.X11GraphicsConfig

Так что у меня закончились идеи о том, как нарисовать JFrame, который не отображается наэкран, но, тем не менее, полностью выложен и функционален.

Идет ли здесь по кроличьей норе, или это можно сделать?

1 Ответ

2 голосов
/ 08 апреля 2011

Java Контейнер верхнего уровня , такой как JFrame, требует доступа к равноправному компоненту , встроенному в платформу хоста, обычно через JNI. В качестве альтернативы, вы можете использовать режим BufferedImage или java.awt.headless, как обсуждено здесь .

Добавление:

Интересно, может ли "любой человек" заменить то, как отбираются сверстники?

Я не знаю, как заменить конкретный одноранговый компонент, но возможно вызвать специфичные для платформы собственные компоненты; Java Native Access (JNA) является одним из таких способов. В качестве крайнего примера, эта 6502 JVM работает в 128K на 8-битном процессоре, работающем на частоте 1 МГц. Демонстрации, включая source для нижнего правого скриншота, были скомпилированы с использованием javac.

...