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

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

ただいまの
回答率

90.48%

  • Java

    14154questions

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

  • JavaFX

    406questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,451

plue

score 67

先日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![イメージ説明
ネットで原因を調べていたのですが結局わかりませんでした。。
お分かりになられる方がいましたら、ご教授いただければと思います。
よろしくお願い致します。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/08/21 10:25

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/08/21 10:22

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

    キャンセル

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

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    14154questions

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

  • JavaFX

    406questions

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