SWT(JFace) 图片浏览器 实现代码
SWT(JFace) 图片浏览器 实现代码
发布时间:2016-12-28 来源:查字典编辑
摘要:代码如下:ImageViewer.java复制代码代码如下:packageswt_jface.demo11;importorg.eclips...

代码如下:

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

+ " }";

}

}

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新Java学习
热门Java学习
编程开发子分类