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

页面导航:首页 > 软件编程 > Java编程 > SWT(JFace) 图片浏览器 实现代码

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

来源:互联网 作者:脚本宝典 时间:2015-07-30 12:57 【

代码如下: 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; imp

代码如下: 
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 
+ " }"; 


Tags:

文章评论

最 近 更 新
热 点 排 行
Js与CSS工具
代码转换工具

<