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

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

ただいまの
回答率

88.03%

グラフィックスイメージを印刷するプログラムがうまく動かない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 939
退会済みユーザー

退会済みユーザー

JavaFXを参考書で勉強しています。以下のプログラムでエラーが出ているところは
エラーメッセージで分かったのですが、修正の仕方が分かりません。
どなたか、教えていただけませんか。よろしくお願いいたします。

package application;

import java.awt.ScrollPane;
import java.io.File;
import java.nio.file.Paths;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.print.PrinterJob;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Label;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.image.Image;
import javafx.scene.layout.VBox;
import javafx.stage.FileChooser;
import javafx.stage.Stage;

public class PrintImage extends Application {

    Canvas canvas = new Canvas();

    Label lblStatus = new Label("");

    PrinterJob job = null;

    void fileOpen(Stage stage) {

        FileChooser fc = new FileChooser();
        // ファイル選択ダイアログは、javafx.stage.FileChooserを使用します。
        // FileChooser のインスタンスを生成します。

        fc.getExtensionFilters().addAll(

            new FileChooser.ExtensionFilter("Text Files", "*.txt"),
            // ファイル名拡張子に基づいてFileDialogで選択できるファイルを
            // フィルタリングするために使用する、拡張子フィルタを定義します。

            new FileChooser.ExtensionFilter("Java Files", "*.txt"),
            // 指定された説明とファイル名拡張子を持つExtensionFilterを作成します。

            new FileChooser.ExtensionFilter("All Files", "*.txt"));
            // All Files - フィルタのテキスト説明
            // *.txt - 受け入れるファイル名拡張子

        File file = fc.showSaveDialog(stage);
        // ファイル保存は、初期ファイル名をsetInitialFileNameで設定して
        // showOpenDialogの代わりにshowSaveDialogを呼びます。
        // ファイル出力ダイアログを表示するには
        // FileChooserクラスのshowSaveDialogメソッドを使います。
        // ボタンのクリックイベントでshowSaveDialogメソッドを使って
        // ダイアログを表示し、指定した出力ファイルの絶対パスを
        // showSaveDialogメソッドの戻り値として受け取ります。
        // showSaveDialogメソッドの引数はjavafx.stage.Stageに
        // なっているため、ここではこのアプリのstageを渡しています。
        // (nullでも問題ない)。また、出力ファイル指定ダイアログが
        // 閉じるまで後続の処理は実行されません。

        if (file.isFile()) {

            lblStatus.setText(file.getAbsolutePath());

            GraphicsContext gc = canvas.getGraphicsContext2D();

            // イメージを描く
            System.out.println(file.getAbsolutePath());

            String URL = file.getAbsolutePath();

            Image img = new Image(Paths.get(URL).toUri().toString());

            gc.drawImage(img, 0, 0);

        }
    }

    @Override
    public void start(Stage stage) throws Exception{

         stage.setTitle("PrintText");
         // setTitleメソッドを使ってファイル選択ダイアログのタイトルを設定します。

         stage.setWidth(360);
         stage.setHeight(320);

         MenuBar menuBar = new MenuBar();
         // MenuBarコントロールは通常ユーザー・インタフェースの
         // 最上部に配置され、Menusが内部に組み込まれています。
         // メニューをメニュー・バーに追加するには、それを
         // menus ObservableListに追加します。
         // デフォルトでは、メニュー・バーに追加した各メニューは、
         // メニューのtext値が表示されたボタンとして表されます。

         menuBar.setUseSystemMenuBar(true);
         // setUseSystemMenuBar(boolean value)
         // プロパティuseSystemMenuBarの値を設定します。
         // MenuBarのメソッド

         Menu fileMenu = new Menu("ファイル");
         // メニューを作るには、MenuBarとMenu、MenuItemを作り、
         // MenuBarにMenuを登録、MenuにMenuItemを登録、

         MenuItem mnuOpen = new MenuItem("開く");
         //

         mnuOpen.setOnAction(event -> fileOpen(stage));

         MenuItem mnuPrintDialog = new MenuItem("印刷設定");

         mnuPrintDialog.setOnAction(event -> {

             if(job == null)
                 job = PrinterJob.createPrinterJob();
             // createPrinterJob() ジョブを作成するファクトリ・メソッド。
             // PrinterJobのメソッド

             job.showPrintDialog(stage);
         });

         MenuItem mnuPageSetup = new MenuItem("ページ設定");

         mnuPageSetup.setOnAction(event -> {

             if(job == null)
                 job = PrinterJob.createPrinterJob();
             // createPrinterJob() ジョブを作成するファクトリ・メソッド。
             // PrinterJobのメソッド

             job.showPageSetupDialog(stage);
         });

         MenuItem mnuPrint = new MenuItem("印刷");

         mnuPrint.setOnAction(event -> {

             if(job == null)
                 job = PrinterJob.createPrinterJob();
             // createPrinterJob() ジョブを作成するファクトリ・メソッド。
             // PrinterJobのメソッド

             job.printPage(canvas);

             job.endJob();
         });

         MenuItem mnuExit = new MenuItem("終了");

         mnuExit.setOnAction(event -> System.exit(0));

         fileMenu.getItems().addAll(mnuOpen,mnuPrintDialog,mnuPageSetup,
                                                         mnuPrint,mnuExit);

         menuBar.getMenus().add(fileMenu);

         canvas.setWidth(360);

         canvas.setHeight(300);
         //

         VBox root = new VBox();

         ScrollPane  scrl = new ScrollPane(canvas);

         root.setPadding(new Insets(5,5,5,5));

         root.setSpacing(10.0);

         root.getChildren().addAll(menuBar,scrl, lblStatus);

         stage.setScene(new Scene(root));

         stage.show();

    }

    public static void main(String[] args) {
        launch(args);
    }

}

// エラーメッセージ
C:\IdeaProjects\javaFX8_12\src\PrintImage.java
エラー:(165, 43) java: 不適合な型: javafx.scene.canvas.Canvasをintに変換できません:
エラー:(171, 27) java: インタフェース javafx.collections.ObservableList<E>のメソッド addAllは指定された型に適用できません。
  期待値: javafx.scene.Node[]
  検出値: javafx.scene.control.MenuBar,java.awt.ScrollPane,javafx.scene.control.Label
  理由: 可変引数の不一致: java.awt.ScrollPaneをjavafx.scene.Nodeに変換できません:
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

0

import java.awt.ScrollPane;を
import javafx.scene.control.ScrollPane;に変更する。

new FileChooser.ExtensionFilter("All Files", "*.txt"));を
new FileChooser.ExtensionFilter("All Files", "*.*"));に変更する。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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