如何在SWT画布上绘制选择框? [英] How to draw selection box on SWT canvas?
问题描述
我有一张SWT Canvas,上面有一些图片。我希望我的用户通过单击鼠标左键并通过移动鼠标打开选择框来选择图像的某些部分。作为视觉反馈,我想将选定的矩形显示为透明覆盖图像。
问题是我不知道如何最好地实现这一点?有人可以给我一个提示吗?
我的答案与我在这里给出的答案类似:
<下面的代码应该给你一个关于从哪里开始的想法。它基本上记住了
MouseDown
事件的位置。每次拖动鼠标时,都会从起始位置向当前位置绘制一个矩形。一旦 MouseUp
发生,一切都会停止。 public class DrawExample
{
private static boolean drag = false;
private static int startX;
private static int startY;
private static int endX;
private static int endY;
public static void main(String [] args)
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setText(Drawing Example);
final Canvas canvas = new Canvas(shell,SWT.NONE);
canvas.setSize(150,150);
canvas.setLocation(20,20);
shell.open();
shell.setSize(200,220);
canvas.addListener(SWT.MouseDown,new Listener(){
@Override
public void handleEvent(Event event){
startX = event .x;
startY = event.y;
drag = true;
}
});
canvas.addListener(SWT.MouseUp,new Listener(){
@Override
public void handleEvent(Event event){
endX = event .x;
endY = event.y;
drag = false;
canvas.redraw();
}
}) ;
canvas.addListener(SWT.MouseMove,new Listener(){
$ b @Override
public void handleEvent(Event event){
if(drag )
{
endX = event.x;
endY = event.y;
canvas.redraw();
}
}
});
canvas.addListener(SWT.Paint,new Listener(){
$ b $ @Override
public void handleEvent(Event event){
if(drag )
{
GC gc = event.gc;
gc.setBackground(Display.getDefault()。getSystemColor(SWT.COLOR_BLACK));
gc.setAlpha (128);
int minX = Math.min(startX,endX);
int minY = Math.min(startY,endY);
int maxX = Math.max(startX,endX);
int maxY = Math.max(startY,endY);
int width = maxX - minX;
int height = maxY - minY;
gc.fillRectangle(minX,minY,width,height);
}
}
}); $!
$ b while(!shell.isDisposed())
{
if(!display.readAndDispatch())
display.sleep();
}
display.dispose();
$ / code $ / pre
看起来像这样:
I have an SWT Canvas with some image on it. I want my user to select parts of the image by clicking, holding the left mouse button and opening a selection box by moving the mouse. As a visual feedback I want to show the selected rectangle as a transparent overlay over my image.
The problem is I have not clue how to best achieve this? Can someone give me a hint?
解决方案 My answer is somehow similar to the one I gave here:
The code below should give you an idea on where to start. It basically remembers the location of a MouseDown
event. Each time the mouse is then dragged, a rectangle is drawn from the starting location to the current location. Once MouseUp
happens, everything stops.
public class DrawExample
{
private static boolean drag = false;
private static int startX;
private static int startY;
private static int endX;
private static int endY;
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("Drawing Example");
final Canvas canvas = new Canvas(shell, SWT.NONE);
canvas.setSize(150, 150);
canvas.setLocation(20, 20);
shell.open();
shell.setSize(200, 220);
canvas.addListener(SWT.MouseDown, new Listener() {
@Override
public void handleEvent(Event event) {
startX = event.x;
startY = event.y;
drag = true;
}
});
canvas.addListener(SWT.MouseUp, new Listener() {
@Override
public void handleEvent(Event event) {
endX = event.x;
endY = event.y;
drag = false;
canvas.redraw();
}
});
canvas.addListener(SWT.MouseMove, new Listener() {
@Override
public void handleEvent(Event event) {
if(drag)
{
endX = event.x;
endY = event.y;
canvas.redraw();
}
}
});
canvas.addListener(SWT.Paint, new Listener() {
@Override
public void handleEvent(Event event) {
if(drag)
{
GC gc = event.gc;
gc.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_BLACK));
gc.setAlpha(128);
int minX = Math.min(startX, endX);
int minY = Math.min(startY, endY);
int maxX = Math.max(startX, endX);
int maxY = Math.max(startY, endY);
int width = maxX - minX;
int height = maxY - minY;
gc.fillRectangle(minX, minY, width, height);
}
}
});
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
It looks like this:
这篇关于如何在SWT画布上绘制选择框?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!