質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

3054閲覧

JavaFXのタブ上にawtのボタンを表示する

plue

総合スコア71

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2014/08/12 10:05

先日tetatailで同じような(質問)をしたのですが、
その先で躓いてしまったので再度投稿させていただきます。

JavaFX上にSwingNodeを利用してSwingもしくはawtの部品を表示しようとした場合、
SwingのJButtonは表示されるのですが、
awtのButtonの場合は表示されず、実行時に以下の例外が発生しボタンが表示されません。

===例外内容=================================================
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Width (0) and height (0) cannot be <= 0
at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1016)
at java.awt.GraphicsConfiguration.createCompatibleImage(GraphicsConfiguration.java:186)
at sun.awt.image.SunVolatileImage.getBackupImage(SunVolatileImage.java:236)
at sun.awt.image.VolatileSurfaceManager.getBackupSurface(VolatileSurfaceManager.java:263)
at sun.awt.image.VolatileSurfaceManager.initialize(VolatileSurfaceManager.java:126)
at sun.awt.image.SunVolatileImage.<init>(SunVolatileImage.java:88)
at sun.awt.image.SunVolatileImage.<init>(SunVolatileImage.java:117)
at java.awt.GraphicsConfiguration.createCompatibleVolatileImage(GraphicsConfiguration.java:307)
at java.awt.GraphicsConfiguration.createCompatibleVolatileImage(GraphicsConfiguration.java:241)
at sun.awt.windows.TranslucentWindowPainter$VIWindowPainter.getBackBuffer(TranslucentWindowPainter.java:272)
at sun.awt.windows.WWindowPeer.getTranslucentGraphics(WWindowPeer.java:606)
at sun.awt.windows.WComponentPeer.getGraphics(WComponentPeer.java:562)
at java.awt.Component.getGraphics(Component.java:3035)
at sun.awt.RepaintArea.paint(RepaintArea.java:227)
at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:347)
at java.awt.Component.dispatchEventImpl(Component.java:4959)
at java.awt.Component.dispatchEvent(Component.java:4705)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
at java.awt.EventQueue.access$400(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:697)
at java.awt.EventQueue$3.run(EventQueue.java:691)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:719)
at java.awt.EventQueue$4.run(EventQueue.java:717)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
=========================================================

ソースは以下のようになっております
1:Javaソース
`
public class JavaFXonAWTView extends Application{

public static void main(String args[]){ Application.launch(args); } @Override public void start(Stage stage) throws Exception { //画面の読み込み Pane root = new Pane(); FXMLLoader loader = new FXMLLoader(getClass().getResource("/view.fxml")); root = loader.load(); // awtのボタンを設置 SwingNode sNode = new SwingNode(); sNode.setLayoutX(10.0); sNode.setLayoutY(50.0); JPanel jPanel = new JPanel(); jPanel.add(new Button("awtボタン")); sNode.setContent(jPanel); // Scene生成 Scene scene = new Scene(root, javafx.scene.paint.Color.WHITE); // TabPane取得 TabPane tabPane = (TabPane)root.lookup("#tabPane"); // Tabの配列取得(Tabはlookupで取れない) ObservableList<Tab> tabList = tabPane.getTabs(); // 対象のTabの取得 Region tab = null; for (Tab tabTmp : tabList) { if ("awtの部品表示".equals(tabTmp.getText())) { tab = (Region)tabTmp.getContent(); break; } } // CJSpreadを乗せるPaneの取得 Pane pane = (Pane)tab.lookup("#pane2"); pane.getChildren().add(sNode); stage.setScene(scene); stage.show(); }

2:fxmlファイル(SceneBuilderで生成したものです)

<?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.text.*?> <?import javafx.scene.control.*?> <?import java.lang.*?> <?import javafx.scene.layout.*?> <Pane fx:id="pane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="360.0" prefWidth="640.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"> <children> <TabPane fx:id="tabPane" prefHeight="360.0" prefWidth="640.0" tabClosingPolicy="UNAVAILABLE"> <tabs> <Tab fx:id="tab1" text="awtの部品表示"> <content> <Pane fx:id="pane2" prefHeight="200.0" prefWidth="200.0"> <children> <Label fx:id="label1" layoutX="10.0" layoutY="10.0" maxHeight="30.0" maxWidth="300.0" minHeight="30.0" minWidth="300.0" prefHeight="30.0" prefWidth="300.0" text="JavaFXの上にawt部品を表示します"> <font> <Font name="Meiryo" size="16.0" /> </font> </Label> </children> </Pane> </content> </Tab> <Tab fx:id="tab2" text="その他" /> </tabs> </TabPane> </children> </Pane> ` 3:画面イメージです。タブ内にawtのボタンが表示される想定です。 ![イメージ説明][WIDTH:600](c9b69706a50081acfd5db86c![イメージ説明][WIDTH:600](64f94dcd43cf0cbe6592ef4fb7dc1661.gif)

ネットで原因を調べていたのですが結局わかりませんでした。。
お分かりになられる方がいましたら、ご教授いただければと思います。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

残念ながら、できません。

AWTのコンポーネントはHeavyweight Componentといって、OSに描画を委譲しています。

それに対し、JavaFXはすべてを自前でレンダリングしています。このため、AWTのHeavyweight Compは表示できないのです。

Swingも自前でレンダリングしているLightweight Componentなので、JavaFX上でも表示することができます。つまりSwingNodeではSwingのコンポーネントしか表示できないのです。

投稿2014/08/20 14:10

skrb

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

plue

2014/08/21 01:25

ご回答いただきありがとうございます。 そもそもAWTとJavaFXでは描画方法が異なるのですね。私の勉強不足でした。 不可能とのことがわかり、その理由もわかりましたので 今回のベストアンサーとさせていただきます。非常に助かりました。ありがとうございました。
guest

0

私の環境でも表示されませんでした。バグか仕様か分かりませんが、現状では無理なのでしょうか。
もしawtを表示したかったら、jFXPanel等で、Swingスレッドとバインドするしかないと思います。

投稿2014/08/20 04:58

bonchan

総合スコア204

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

plue

2014/08/21 01:22

わざわざbonchanさんの方でも試していただいたようでありがとうございます。 bonchanさんの方でも表示されなかったのですね。 skrbさんからの回答により不可能とのことがわかりましたので、今回はそちらをベストアンサーとして選ばせていただきましたが、前回に続き、ご回答いただき感謝しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問