2013-12-19 2 views
2

В настоящее время я работаю над SWT, чтобы создать пользовательский интерфейс для нашего приложения. Я столкнулся с затруднительным положением. Я использую холст для рисования заголовка, который имеет некоторые изображения. Он также должен отображать время (обновляется каждую секунду). Хотя я все это сделал, ловушка заключается в том, что я использую единственный paintListener для рисования изображений и текущего времени.Рисование определенной части изображения SWT

Часть кода заголовка выглядит следующим образом:

private void initHeader(){ 
    header = new Canvas(shell,SWT.NONE);     
    GridLayout gd = new GridLayout();    
    gd.numColumns = 1; 
    gd.marginHeight = 10; 
    gd.marginBottom = 10; 
    gd.verticalSpacing = 0; 
    header.setLayout(gd); 
    header.setLayoutData(new GridData(SWT.FILL,SWT.BEGINNING,true,false));  
    header.layout();     
    //Paint listener for SDM Logo 
    header.addPaintListener(new PaintListener() { 
     private final Image bgLogoImage = new Image(Display.getDefault(),"resources/images/1stimage.png"); 
     private final Image bgLockImage = new Image(Display.getDefault(),"resources/images/2ndimage.png"); 
     private final Image bgHelpImage = new Image(Display.getDefault(),"resources/images/3rdimage.png"); 
     private final int bgImageWidth = bgHelpImage.getBounds().width; 
     private final int bgImageHeight = bgHelpImage.getBounds().height; 
     private final int bgLockImageWidth = bgLockImage.getBounds().width; 
     private final int bgLockImageHeight = bgLockImage.getBounds().height;   

     @Override 
     public void paintControl(PaintEvent e) { 
      e.gc.drawImage(bgLogoImage, 0, 0); 
      Point lockSize = ((Control) e.widget).getSize(); 
      e.gc.drawImage(bgLockImage, (lockSize.x - bgLockImageWidth) - 50, (lockSize.y 
        - bgLockImageHeight)/2); 
      Point size = ((Control) e.widget).getSize(); 
      e.gc.drawImage(bgHelpImage, (size.x - bgImageWidth) - 10, (size.y 
        - bgImageHeight)/2);         
      e.gc.setBackground(new Color(display,225,43,41)); 
      e.gc.setForeground(new Color(display,255,255,255)); 
      Date dNow = new Date(); 
      SimpleDateFormat ft = new SimpleDateFormat("MMM d,y E hh:mm:ss a"); 
      e.gc.drawText(ft.format(dNow), header.getClientArea().width - 350, header.getClientArea().y + 10); 
     } 
    });  
} 

Затем я использую нить обновления времени каждый второй. Моя трудность состоит в два раза:

  1. Поскольку я называю header.redraw() и header.update() каждый второй, в сущности, все изображения перерисовывается каждый второй. Могу ли я это избежать?
  2. Поскольку я использую gridLayout, я не могу вручную поместить currentTime в метку в относительном положении. Есть ли способ сделать это?
+2

У меня нет ответа на ваш вопрос, но, пожалуйста, запомните 'dispose()' все ресурсы, которые вы сами выделяете, например '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. В противном случае у вас могут закончиться ручки. – Baz

+1

Извините, я не совсем понял ваш вопрос. Почему вы создавали приложение для обновления каждую секунду в первую очередь? Обновления пользовательского интерфейса обычно выполняются, когда модель обновляет представление. Кроме того, если вы хотите собрать пользовательское 'Image', вы можете создать' ImageBuilder' (украденный из 'StringBuilder'), который расширяет' CompositeImageDescriptor'. Если вы прочитаете javadoc и пройдете несколько примеров, это будет очень легко понять. – GGrec

+0

@Baz: так было то, что происходило! Спасибо, Баз! :) –

ответ

2

Вместо того, чтобы иметь один Canvas вы могли бы иметь два элемента управления в виде Composite один с изображениями и один со временем. Затем вы можете просто перерисовать время в прослушивании этого элемента управления.

Должны ли быть какие-либо из них Canvas? Не могли бы вы использовать несколько элементов управления Label, которые могут содержать изображение или текст?

Если вы хотите остаться с одним элементом управления, вы можете использовать redraw(x, y, width, height, false), чтобы указать регион управления, который вы хотите перерисовать. В прослушивателе красок вы вызываете GC.getClipping, чтобы получить часть элемента управления, который необходимо перерисовать, и пропустить любые операции рисования, которые не нужно делать.

+0

Хм, я не знал о перегрузке для функции перерисовки, проверит в нем :) –

Смежные вопросы