SWT(JFace) 图片浏览器 实现代码

    代码如下:
    ImageViewer.java

    复制代码 代码如下:

    package swt_jface.demo11;
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.events.PaintEvent;
    import org.eclipse.swt.events.PaintListener;
    import org.eclipse.swt.graphics.GC;
    import org.eclipse.swt.graphics.Image;
    import org.eclipse.swt.graphics.Point;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.printing.PrintDialog;
    import org.eclipse.swt.printing.Printer;
    import org.eclipse.swt.printing.PrinterData;
    import org.eclipse.swt.widgets.Canvas;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Event;
    import org.eclipse.swt.widgets.FileDialog;
    import org.eclipse.swt.widgets.Listener;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.ToolBar;
    import org.eclipse.swt.widgets.ToolItem;
    public class ImageViewer {

        Display display = new Display();
        Shell shell = new Shell(display);
        Canvas canvas;
        Image image;
        String fileName;

        public ImageViewer() {

            shell.setText(“Image viewer”);
            shell.setLayout(new GridLayout(1, true));
            ToolBar toolBar = new ToolBar(shell, SWT.FLAT);
            ToolItem itemOpen = new ToolItem(toolBar, SWT.PUSH);
            itemOpen.setText(“Open”);
            itemOpen.addListener(SWT.Selection, new Listener() {
                public void handleEvent(Event event) {
                    FileDialog dialog = new FileDialog(shell, SWT.OPEN);
                    String file = dialog.open();
                    if (file != null) {
                        if (image != null)
                            image.dispose();
                        image = null;
                        try {
                            image = new Image(display, file);
                        } catch (RuntimeException e) {
                        }
                        if (image != null) {
                            fileName = file;
                        } else {
                            System.err.println(
                                “Failed to load image from file: ” + file);
                        }
                        canvas.redraw();
                    }
                }
            });
            ToolItem itemPrintPreview = new ToolItem(toolBar, SWT.PUSH);
            itemPrintPreview.setText(“Preview”);
            itemPrintPreview.addListener(SWT.Selection, new Listener() {
                public void handleEvent(Event event) {
                    ImagePrintPreviewDialog dialog =
                        new ImagePrintPreviewDialog(ImageViewer.this);
                    dialog.open();
                }
            });
            ToolItem itemPrint = new ToolItem(toolBar, SWT.PUSH);
            itemPrint.setText(“Print”);
            itemPrint.addListener(SWT.Selection, new Listener() {
                public void handleEvent(Event event) {
                    print();
                }
            });
            canvas = new Canvas(shell, SWT.BORDER);
            canvas.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
            canvas.setLayoutData(new GridData(GridData.FILL_BOTH));
            canvas.addPaintListener(new PaintListener() {
                public void paintControl(PaintEvent e) {
                    if (image == null) {
                        e.gc.drawString(“No image”, 0, 0);
                    } else {
                        e.gc.drawImage(image, 0, 0);
                    }
                }
            });
            image = new Image(display, “C:/icons/scene.jpg”);
            fileName = “scene.jpg”;
            shell.setSize(500, 400);
            shell.open();
            while (!shell.isDisposed()) {
                if (!display.readAndDispatch()) {
                    display.sleep();
                }
            }
            display.dispose();
        }
        void print() {
            PrintDialog dialog = new PrintDialog(shell);
            PrinterData printerData = dialog.open();
            if (printerData == null) return;
            Printer printer = new Printer(printerData);
            print(printer, null);
        }
        void print(final Printer printer, PrintMargin printMargin) {
            if (image == null) return;
            final Point printerDPI = printer.getDPI();
            final Point displayDPI = display.getDPI();
            System.out.println(displayDPI + ” ” + printerDPI);
            final PrintMargin margin = (printMargin == null ? PrintMargin.getPrintMargin(printer, 1.0) : printMargin);
            Thread printThread = new Thread() {
                public void run() {
                    if (!printer.startJob(fileName)) {
                        System.err.println(“Failed to start print job!”);
                        printer.dispose();
                        return;
                    }
                    GC gc = new GC(printer);
                    if (!printer.startPage()) {
                        System.err.println(“Failed to start a new page!”);
                        gc.dispose();
                        return;
                    } else {
                        int imageWidth = image.getBounds().width;
                        int imageHeight = image.getBounds().height;
                        double dpiScaleFactorX = printerDPI.x * 1.0 / displayDPI.x;
                        double dpiScaleFactorY = printerDPI.y * 1.0 / displayDPI.y;
                        double imageSizeFactor =
                            Math.min(
                                1,
                                (margin.right – margin.left)
                                    * 1.0
                                    / (dpiScaleFactorX * imageWidth));
                        imageSizeFactor =
                            Math.min(
                                imageSizeFactor,
                                (margin.bottom – margin.top)
                                    * 1.0
                                    / (dpiScaleFactorY * imageHeight));
                        gc.drawImage(
                            image,
                            0,
                            0,
                            imageWidth,
                            imageHeight,
                            margin.left,
                            margin.top,
                            (int) (dpiScaleFactorX * imageSizeFactor * imageWidth),
                            (int) (dpiScaleFactorY
                                * imageSizeFactor
                                * imageHeight));
                        gc.dispose();
                    }
                    printer.endPage();
                    printer.endJob();
                    printer.dispose();
                    System.out.println(“Printing job done!”);
                }
            };
            printThread.start();
        }
        public static void main(String[] args) {
            new ImageViewer();
        }
    }


    ImagePrintPreviewDialog.java

    复制代码 代码如下:

    package swt_jface.demo11;
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.events.PaintEvent;
    import org.eclipse.swt.events.PaintListener;
    import org.eclipse.swt.graphics.Point;
    import org.eclipse.swt.graphics.Rectangle;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.printing.PrintDialog;
    import org.eclipse.swt.printing.Printer;
    import org.eclipse.swt.printing.PrinterData;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.widgets.Canvas;
    import org.eclipse.swt.widgets.Combo;
    import org.eclipse.swt.widgets.Dialog;
    import org.eclipse.swt.widgets.Event;
    import org.eclipse.swt.widgets.Label;
    import org.eclipse.swt.widgets.Listener;
    import org.eclipse.swt.widgets.Shell;
    public class ImagePrintPreviewDialog extends Dialog {

    ImageViewer viewer;
    Shell shell;
    Canvas canvas;
    Printer printer;
    PrintMargin margin;
    Combo combo;
    public ImagePrintPreviewDialog(ImageViewer viewer) {
    super(viewer.shell);
    this.viewer = viewer;
    }
    public void open() {
    shell =
    new Shell(
    viewer.shell,
    SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL | SWT.RESIZE);
    shell.setText(“Print preview”);
    shell.setLayout(new GridLayout(4, false));
    final Button buttonSelectPrinter = new Button(shell, SWT.PUSH);
    buttonSelectPrinter.setText(“Select a printer”);
    buttonSelectPrinter.addListener(SWT.Selection, new Listener() {
    public void handleEvent(Event event) {
    PrintDialog dialog = new PrintDialog(shell);
    PrinterData printerData = dialog.open();
    if (printerData == null) return;
    final Printer printer = new Printer(printerData);
    setPrinter(
    printer,
    Double.parseDouble(
    combo.getItem(combo.getSelectionIndex())));
    }
    });
    new Label(shell, SWT.NULL).setText(“Margin in inches: “);
    combo = new Combo(shell, SWT.READ_ONLY);
    combo.add(“0.5”);
    combo.add(“1.0”);
    combo.add(“1.5”);
    combo.add(“2.0”);
    combo.add(“2.5”);
    combo.add(“3.0”);
    combo.select(1);
    combo.addListener(SWT.Selection, new Listener() {
    public void handleEvent(Event event) {
    double value =
    Double.parseDouble(
    combo.getItem(combo.getSelectionIndex()));
    setPrinter(printer, value);
    }
    });
    final Button buttonPrint = new Button(shell, SWT.PUSH);
    buttonPrint.setText(“Print”);
    buttonPrint.addListener(SWT.Selection, new Listener() {
    public void handleEvent(Event event) {
    if (printer == null)
    viewer.print();
    else
    viewer.print(printer, margin);
    shell.dispose();
    }
    });
    canvas = new Canvas(shell, SWT.BORDER);
    GridData gridData = new GridData(GridData.FILL_BOTH);
    gridData.horizontalSpan = 4;
    canvas.setLayoutData(gridData);
    canvas.addPaintListener(new PaintListener() {
    public void paintControl(PaintEvent e) {
    int canvasBorder = 20;
    if (printer == null || printer.isDisposed()) return;
    Rectangle rectangle = printer.getBounds();
    Point canvasSize = canvas.getSize();
    double viewScaleFactor =
    (canvasSize.x – canvasBorder * 2) * 1.0 / rectangle.width;
    viewScaleFactor =
    Math.min(
    viewScaleFactor,
    (canvasSize.y – canvasBorder * 2)
    * 1.0
    / rectangle.height);
    int offsetX =
    (canvasSize.x – (int) (viewScaleFactor * rectangle.width))
    / 2;
    int offsetY =
    (canvasSize.y – (int) (viewScaleFactor * rectangle.height))
    / 2;
    e.gc.setBackground(
    shell.getDisplay().getSystemColor(SWT.COLOR_WHITE));
    e.gc.fillRectangle(
    offsetX,
    offsetY,
    (int) (viewScaleFactor * rectangle.width),
    (int) (viewScaleFactor * rectangle.height));
    e.gc.setLineStyle(SWT.LINE_DASH);
    e.gc.setForeground(shell.getDisplay().getSystemColor(SWT.COLOR_BLACK));
    int marginOffsetX = offsetX + (int) (viewScaleFactor * margin.left);
    int marginOffsetY = offsetY + (int) (viewScaleFactor * margin.top);
    e.gc.drawRectangle(
    marginOffsetX,
    marginOffsetY,
    (int) (viewScaleFactor * (margin.right – margin.left)),
    (int) (viewScaleFactor * (margin.bottom – margin.top)));
    if (viewer.image != null) {
    int imageWidth = viewer.image.getBounds().width;
    int imageHeight = viewer.image.getBounds().height;
    double dpiScaleFactorX =
    printer.getDPI().x
    * 1.0
    / shell.getDisplay().getDPI().x;
    double dpiScaleFactorY =
    printer.getDPI().y
    * 1.0
    / shell.getDisplay().getDPI().y;
    double imageSizeFactor =
    Math.min(
    1,
    (margin.right – margin.left)
    * 1.0
    / (dpiScaleFactorX * imageWidth));
    imageSizeFactor =
    Math.min(
    imageSizeFactor,
    (margin.bottom – margin.top)
    * 1.0
    / (dpiScaleFactorY * imageHeight));
    e.gc.drawImage(
    viewer.image,
    0,
    0,
    imageWidth,
    imageHeight,
    marginOffsetX,
    marginOffsetY,
    (int) (dpiScaleFactorX
    * imageSizeFactor
    * imageWidth
    * viewScaleFactor),
    (int) (dpiScaleFactorY
    * imageSizeFactor
    * imageHeight
    * viewScaleFactor));
    }
    }
    });
    shell.setSize(400, 400);
    shell.open();
    setPrinter(null, 1.0);
    while (!shell.isDisposed()) {
    if (!shell.getDisplay().readAndDispatch()) {
    shell.getDisplay().sleep();
    }
    }
    }
    void setPrinter(Printer printer, double marginSize) {
    if (printer == null) {
    printer = new Printer(Printer.getDefaultPrinterData());
    }
    this.printer = printer;
    margin = PrintMargin.getPrintMargin(printer, marginSize);
    canvas.redraw();
    }
    }
    package swt_jface.demo11;
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.events.PaintEvent;
    import org.eclipse.swt.events.PaintListener;
    import org.eclipse.swt.graphics.Point;
    import org.eclipse.swt.graphics.Rectangle;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.printing.PrintDialog;
    import org.eclipse.swt.printing.Printer;
    import org.eclipse.swt.printing.PrinterData;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.widgets.Canvas;
    import org.eclipse.swt.widgets.Combo;
    import org.eclipse.swt.widgets.Dialog;
    import org.eclipse.swt.widgets.Event;
    import org.eclipse.swt.widgets.Label;
    import org.eclipse.swt.widgets.Listener;
    import org.eclipse.swt.widgets.Shell;
    public class ImagePrintPreviewDialog extends Dialog {

        ImageViewer viewer;
        Shell shell;
        Canvas canvas;
        Printer printer;
        PrintMargin margin;
        Combo combo;
        public ImagePrintPreviewDialog(ImageViewer viewer) {
            super(viewer.shell);
            this.viewer = viewer;
        }
        public void open() {
            shell =
                new Shell(
                    viewer.shell,
                    SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL | SWT.RESIZE);
            shell.setText(“Print preview”);
            shell.setLayout(new GridLayout(4, false));
            final Button buttonSelectPrinter = new Button(shell, SWT.PUSH);
            buttonSelectPrinter.setText(“Select a printer”);
            buttonSelectPrinter.addListener(SWT.Selection, new Listener() {
                public void handleEvent(Event event) {
                    PrintDialog dialog = new PrintDialog(shell);
                    PrinterData printerData = dialog.open();
                    if (printerData == null) return;
                    final Printer printer = new Printer(printerData);
                    setPrinter(
                        printer,
                        Double.parseDouble(
                            combo.getItem(combo.getSelectionIndex())));
                }
            });
            new Label(shell, SWT.NULL).setText(“Margin in inches: “);
            combo = new Combo(shell, SWT.READ_ONLY);
            combo.add(“0.5”);
            combo.add(“1.0”);
            combo.add(“1.5”);
            combo.add(“2.0”);
            combo.add(“2.5”);
            combo.add(“3.0”);
            combo.select(1);
            combo.addListener(SWT.Selection, new Listener() {
                public void handleEvent(Event event) {
                    double value =
                        Double.parseDouble(
                            combo.getItem(combo.getSelectionIndex()));
                    setPrinter(printer, value);
                }
            });
            final Button buttonPrint = new Button(shell, SWT.PUSH);
            buttonPrint.setText(“Print”);
            buttonPrint.addListener(SWT.Selection, new Listener() {
                public void handleEvent(Event event) {
                    if (printer == null)
                        viewer.print();
                    else
                        viewer.print(printer, margin);
                    shell.dispose();
                }
            });
            canvas = new Canvas(shell, SWT.BORDER);
            GridData gridData = new GridData(GridData.FILL_BOTH);
            gridData.horizontalSpan = 4;
            canvas.setLayoutData(gridData);
            canvas.addPaintListener(new PaintListener() {
                public void paintControl(PaintEvent e) {
                    int canvasBorder = 20;
                    if (printer == null || printer.isDisposed()) return;
                    Rectangle rectangle = printer.getBounds();
                    Point canvasSize = canvas.getSize();
                    double viewScaleFactor =
                        (canvasSize.x – canvasBorder * 2) * 1.0 / rectangle.width;
                    viewScaleFactor =
                        Math.min(
                            viewScaleFactor,
                            (canvasSize.y – canvasBorder * 2)
                                * 1.0
                                / rectangle.height);
                    int offsetX =
                        (canvasSize.x – (int) (viewScaleFactor * rectangle.width))
                            / 2;
                    int offsetY =
                        (canvasSize.y – (int) (viewScaleFactor * rectangle.height))
                            / 2;
                    e.gc.setBackground(
                        shell.getDisplay().getSystemColor(SWT.COLOR_WHITE));
                    e.gc.fillRectangle(
                        offsetX,
                        offsetY,
                        (int) (viewScaleFactor * rectangle.width),
                        (int) (viewScaleFactor * rectangle.height));
                    e.gc.setLineStyle(SWT.LINE_DASH);
                    e.gc.setForeground(shell.getDisplay().getSystemColor(SWT.COLOR_BLACK));
                    int marginOffsetX = offsetX + (int) (viewScaleFactor * margin.left);
                    int marginOffsetY = offsetY + (int) (viewScaleFactor * margin.top);
                    e.gc.drawRectangle(
                        marginOffsetX,
                        marginOffsetY,
                        (int) (viewScaleFactor * (margin.right – margin.left)),
                        (int) (viewScaleFactor * (margin.bottom – margin.top)));
                    if (viewer.image != null) {
                        int imageWidth = viewer.image.getBounds().width;
                        int imageHeight = viewer.image.getBounds().height;
                        double dpiScaleFactorX =
                            printer.getDPI().x
                                * 1.0
                                / shell.getDisplay().getDPI().x;
                        double dpiScaleFactorY =
                            printer.getDPI().y
                                * 1.0
                                / shell.getDisplay().getDPI().y;
                        double imageSizeFactor =
                            Math.min(
                                1,
                                (margin.right – margin.left)
                                    * 1.0
                                    / (dpiScaleFactorX * imageWidth));
                        imageSizeFactor =
                            Math.min(
                                imageSizeFactor,
                                (margin.bottom – margin.top)
                                    * 1.0
                                    / (dpiScaleFactorY * imageHeight));
                        e.gc.drawImage(
                            viewer.image,
                            0,
                            0,
                            imageWidth,
                            imageHeight,
                            marginOffsetX,
                            marginOffsetY,
                            (int) (dpiScaleFactorX
                                * imageSizeFactor
                                * imageWidth
                                * viewScaleFactor),
                            (int) (dpiScaleFactorY
                                * imageSizeFactor
                                * imageHeight
                                * viewScaleFactor));
                    }
                }
            });
            shell.setSize(400, 400);
            shell.open();
            setPrinter(null, 1.0);
            while (!shell.isDisposed()) {
                if (!shell.getDisplay().readAndDispatch()) {
                    shell.getDisplay().sleep();
                }
            }
        }
        void setPrinter(Printer printer, double marginSize) {
            if (printer == null) {
                printer = new Printer(Printer.getDefaultPrinterData());
            }
            this.printer = printer;
            margin = PrintMargin.getPrintMargin(printer, marginSize);
            canvas.redraw();
        }
    }

    PrintMargin.java

    复制代码 代码如下:

    package swt_jface.demo11;
    import org.eclipse.swt.graphics.Point;
    import org.eclipse.swt.graphics.Rectangle;
    import org.eclipse.swt.printing.Printer;
    public class PrintMargin {

    public int left;
    public int right;
    public int top;
    public int bottom;
    private PrintMargin(int left, int right, int top, int bottom) {
    this.left = left;
    this.right = right;
    this.top = top;
    this.bottom = bottom;
    }
    static PrintMargin getPrintMargin(Printer printer, double margin) {
    return getPrintMargin(printer, margin, margin, margin, margin);
    }
    static PrintMargin getPrintMargin(
    Printer printer,
    double marginLeft,
    double marginRight,
    double marginTop,
    double marginBottom) {
    Rectangle clientArea = printer.getClientArea();
    Rectangle trim = printer.computeTrim(0, 0, 0, 0);
    Point dpi = printer.getDPI();
    int leftMargin = (int) (marginLeft * dpi.x) – trim.x;
    int rightMargin =
    clientArea.width
    + trim.width
    – (int) (marginRight * dpi.x)
    – trim.x;
    int topMargin = (int) (marginTop * dpi.y) – trim.y;
    int bottomMargin =
    clientArea.height
    + trim.height
    – (int) (marginBottom * dpi.y)
    – trim.y;
    return new PrintMargin(
    leftMargin,
    rightMargin,
    topMargin,
    bottomMargin);
    }
    public String toString() {
    return “Margin { ”
    + left
    + “, ”
    + right
    + “; ”
    + top
    + “, ”
    + bottom
    + ” }”;
    }
    }


Leave a Reply

Leave a Reply