开发者

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.JVyajmREAD_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 Listenehttp://www.devze.comr() {

            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(开发者_JS开发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;

            www.devze.com    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,

douhttp://www.devze.comble 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

+ " }";

}

}

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新开发

开发排行榜