2016-01-28 4 views
2

Размер кнопки img в макете сетки не меняет того, что я делаю. Следующий мой код. если я масштабирую заполнитель, это тоже не влияет. Пространство, которое занимает заполнение и запас, остается, когда я устанавливаю отступы и маржу к нулю. Как я могу сделать его компактным и избавиться от этого разрыва между изображениями ..Вопросы настройки размера сетки сетки

 GridLayout gr = new GridLayout(1,2); 
     gr.setAutoFit(true); 
     Container grid = new Container(gr); 
     grid.setUIID("containerGridImgGallery"); 
     grid.getAllStyles().setPadding(0, 0, 0, 0); 
     grid.getAllStyles().setMargin(0,0,0,0); 
     f.addComponent(BorderLayout.CENTER,grid); 

     placeholder = (EncodedImage) r.getImage("switch_on.png"); 
     //if I change the scaled value of placeholder, the img size doesnt change in the grid eg scaledEncoded(screenWidth/3, screenWidth/3) doesnt change the img size 
     placeholder = placeholder.scaledEncoded((screenWidth/2)-10, screenWidth/3); 

     EncodedImage a = URLImage.createToStorage(placeholder , galleryPhotoTitle + offset + imageId, galleryPhotoUrl, URLImage.RESIZE_SCALE_TO_FILL); 
     final Button btn = new Button(a); 
     btn.setUIID("galleryGridButton"); 
     btn.getAllStyles().setPadding(0, 0, 0, 0); 
     btn.getAllStyles().setMargin(0,0,0,0); 

я нужен макет сетки здесь, так как я могу установить на gridLayout.autofit() в GridLayout, который является то, что я просто хотел авто пригонки изображения в соответствии с экранами. Как я могу привязать ячейки сетки к клетке внутри? могу ли я задать размер сетки?

обновления:

// как использовать scaleImageLabel в кнопке? я получил это работает так или иначе, но не правильно я думаю,

EncodedImage a = URLImage.createToStorage(largePlaceholder, galleryPhotoTitle + offset + imageId, galleryPhotoUrl, URLImage.RESIZE_SCALE_TO_FILL); 
final Button btn = new Button(a); 
Image abc = btn.getIcon(); 
ScaleImageLabel scaledPlaceholder = new ScaleImageLabel(abc); 
Container imageHolder = new Container(); 
imageHolder.addComponent(btn); 
btn.setPreferredSize(new Dimension(1,1)); 
imageHolder.addComponent(scaledPlaceholder); 
imageHolder.setLeadComponent(btn); 
grid.addComponent(i, imageHolder); 

У меня есть несколько вопросов: 1) почему я не могу установить uiid из scaledPlaceholder выше (ScaledImageLabel) это занимает несколько отступов & поля, которые я хочу удалить. Если я установил uiid, изображения не отображаются.

2) как установитьBackgroundType() работать? он не принимает setBackgroundType (Style.BACKGROUND_IMAGE_SCALED_FIT).

3) И самое главное, как я могу подобрать изображения в сетке, поддерживая соотношение сторон? если я делаю что-л. Как - abc = abc.scaled (230, 336); Он подходит к сетке, но не поддерживает соотношение сторон изображения.

обновления 1:

EncodedImage a = URLImage.createToStorage(largePlaceholder, galleryPhotoTitle + offset + imageId, galleryPhotoUrl, URLImage.RESIZE_SCALE_TO_FILL); 
ScaleImageButton scaleImageButton = new ScaleImageButton(a); 
scaleImageButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
      //...... 
      } 
     }); 
     grid.addComponent(i, btn); 

исключение:

java.lang.NullPointerException 
    at userclasses.StateMachine$ScaleImageButton.calcPreferredSize(StateMachine.java:500) 
    at com.codename1.ui.Component.preferredSizeImpl(Component.java:1930) 
    at com.codename1.ui.Component.preferredSize(Component.java:1965) 
    at com.codename1.ui.Component.getPreferredSize(Component.java:752) 
    at com.codename1.ui.Component.getPreferredW(Component.java:832) 
    at com.codename1.ui.layouts.GridLayout.getPreferredSize(GridLayout.java:153) 
    at com.codename1.ui.Container.calcPreferredSize(Container.java:1793) 
    at com.codename1.ui.Component.preferredSizeImpl(Component.java:1930) 
    at com.codename1.ui.Component.preferredSize(Component.java:1965) 
    at com.codename1.ui.Component.getPreferredSize(Component.java:752) 
    at com.codename1.ui.Component.getPreferredW(Component.java:832) 
    at com.codename1.ui.layouts.GridLayout.getPreferredSize(GridLayout.java:153) 
    at com.codename1.ui.Container.calcPreferredSize(Container.java:1793) 
    at com.codename1.ui.Component.calcScrollSize(Component.java:782) 
    at com.codename1.ui.Component.getScrollDimension(Component.java:769) 
    at com.codename1.ui.Container.isScrollableY(Container.java:1873) 
    at com.codename1.ui.Component.isScrollable(Component.java:1686) 
    at com.codename1.ui.Form.isScrollable(Form.java:3058) 
    at com.codename1.ui.Component.checkAnimation(Component.java:3802) 
    at com.codename1.ui.Component.initComponentImpl(Component.java:4209) 
    at com.codename1.ui.Container.initComponentImpl(Container.java:843) 
    at com.codename1.ui.Form.initComponentImpl(Form.java:1608) 
    at com.codename1.ui.Display.setCurrent(Display.java:1332) 
    at com.codename1.ui.Form.show(Form.java:1588) 
    at com.codename1.ui.Form.show(Form.java:1566) 
    at com.codename1.ui.util.UIBuilder.showForm(UIBuilder.java:2515) 
    at com.codename1.ui.util.UIBuilder.showForm(UIBuilder.java:2561) 
    at userclasses.StateMachine.showGalleryImage(StateMachine.java:159) 
    at userclasses.StateMachine$1.lambda$readResponse$0(StateMachine.java:136) 
    at userclasses.StateMachine$1$$Lambda$17/1247957021.actionPerformed(Unknown Source) 
    at com.codename1.ui.util.EventDispatcher.fireActionEvent(EventDispatcher.java:345) 
    at com.codename1.ui.Button.fireActionEvent(Button.java:397) 
    at com.codename1.ui.Button.released(Button.java:428) 
    at com.codename1.ui.Button.pointerReleased(Button.java:516) 
    at com.codename1.ui.Form.pointerReleased(Form.java:2560) 
    at com.codename1.ui.Form.pointerReleased(Form.java:2496) 
    at com.codename1.ui.Component.pointerReleased(Component.java:3108) 
    at com.codename1.ui.Display.handleEvent(Display.java:2017) 
    at com.codename1.ui.Display.edtLoopImpl(Display.java:1065) 
    at com.codename1.ui.Display.mainEDTLoop(Display.java:994) 
    at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120) 
    at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176) 

ошибка здесь

@Override 
     protected Dimension calcPreferredSize() { 
      Image i = getIcon(); 
      Style s = getStyle(); 
     //error occured here 
      return new Dimension(i.getWidth() + s.getPaddingLeft(false) + s.getPaddingRight(false), i.getHeight() 
        + s.getPaddingTop() + s.getPaddingBottom()); 
     } 

Еще одна вещь, если я использовать ярлык вместо БТН это работает отлично, но такой же Doesnt работа в случае кнопки, почему?

Update 2: после добавления метода getIconFromState, отображается пустая форма - та же старая проблема, и если нуль проверки будет удален, следующее сообщение об ошибке

java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at com.codename1.impl.javase.Executor$1$1.run(Executor.java:100) 
    at com.codename1.ui.Display.processSerialCalls(Display.java:1149) 
    at com.codename1.ui.Display.mainEDTLoop(Display.java:966) 
    at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120) 
    at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176) 
Caused by: java.lang.NullPointerException 
    at userclasses.StateMachine$ScaleImageButton.calcPreferredSize(StateMachine.java:303) 
    at com.codename1.ui.Component.preferredSizeImpl(Component.java:1930) 
    at com.codename1.ui.Component.preferredSize(Component.java:1965) 
    at com.codename1.ui.Component.getPreferredSize(Component.java:752) 
    at com.codename1.ui.Component.getPreferredW(Component.java:832) 
    at com.codename1.ui.layouts.GridLayout.getPreferredSize(GridLayout.java:153) 
    at com.codename1.ui.Container.calcPreferredSize(Container.java:1793) 
    at com.codename1.ui.Component.preferredSizeImpl(Component.java:1930) 
    at com.codename1.ui.Component.preferredSize(Component.java:1965) 
    at com.codename1.ui.Component.getPreferredSize(Component.java:752) 
    at com.codename1.ui.Component.getPreferredH(Component.java:842) 
    at com.codename1.ui.layouts.BoxLayout.layoutContainer(BoxLayout.java:91) 
    at com.codename1.ui.Container.doLayout(Container.java:1366) 
    at com.codename1.ui.Container.layoutContainer(Container.java:1358) 
    at com.codename1.ui.Container.doLayout(Container.java:1371) 
    at com.codename1.ui.Container.layoutContainer(Container.java:1358) 
    at com.codename1.ui.Container.revalidate(Container.java:1006) 
    at com.codename1.ui.Form.setFocused(Form.java:1922) 
    at com.codename1.ui.Form.initFocused(Form.java:1553) 
    at com.codename1.ui.Form.show(Form.java:1584) 
    at com.codename1.ui.Form.show(Form.java:1566) 
    at com.codename1.ui.util.UIBuilder.showForm(UIBuilder.java:2515) 
    at com.codename1.ui.util.UIBuilder.showForm(UIBuilder.java:2561) 
    at generated.StateMachineBase.startApp(StateMachineBase.java:56) 
    at generated.StateMachineBase.<init>(StateMachineBase.java:31) 
    at generated.StateMachineBase.<init>(StateMachineBase.java:98) 
    at userclasses.StateMachine.<init>(StateMachine.java:51) 
    at com.mycompany.myapp.MyApplication.start(MyApplication.java:23) 
    ... 9 more 

Update 3: скриншот будет выглядеть так: портрет:

enter image description here

пейзаж: enter image description here

Однако, если я перехожу в альбомный режим из портретного режима и снова в портретный режим, изображения получаются отрегулированными так, как ожидалось, но я все еще вижу тонкую дублируемую часть изображения.

скриншот происходит от портрета до пейзажа и снова к портрету:

enter image description here

ответ

0

После загрузки изображений и совпадает с размером заполнителя они хранятся/кэшированные в системе. Поскольку Label (или Button, который его выводит) не масштабирует изображение значка, это не изменится.

Изменение размера заполнителя после загрузки также не будет иметь эффекта.

Для 3.3 мы представили новый класс ScaleImageLabel, который должен позволить ярлыку масштабироваться, чтобы заняться дополнительным пространством в такой ситуации. Обратите внимание, что артефакты могут применяться из-за масштабирования.

Поскольку вам нужен Button, а не ярлык попробовать что-то вроде этого:

public class ScaleImageButton extends Button { 

    /** 
    * Default constructor 
    */ 
    public ScaleImageButton() { 
     setUIID("Label"); 
     setShowEvenIfBlank(true); 
     setBackgroundType(Style.BACKGROUND_IMAGE_SCALED_FIT); 
    } 

    /** 
    * Create a version with the given image 
    * @param i image 
    */ 
    public ScaleImageButton(Image i) { 
     setUIID("Label"); 
     setShowEvenIfBlank(true); 
     setBackgroundType(Style.BACKGROUND_IMAGE_SCALED_FIT); 
     setIcon(i); 
    } 

    /** 
    * Sets the behavior of the background to one of Style.BACKGROUND_IMAGE_SCALED_FIT, 
    * Style.BACKGROUND_IMAGE_SCALED_FILL, Style.BACKGROUND_IMAGE_SCALE 
    * @param behavior the background behavior 
    */ 
    public void setBackgroundType(byte behavior) { 
     getUnselectedStyle().setBackgroundType(behavior); 
     getSelectedStyle().setBackgroundType(behavior); 
     getPressedStyle().setBackgroundType(behavior); 
    } 

    public byte getBackgroundType() { 
     return getUnselectedStyle().getBackgroundType(); 
    } 

    @Override 
    protected Dimension calcPreferredSize() { 
     Image i = getIcon(); 
     if(i == null) { 
      return new Dimension(); 
     } 
     Style s = getStyle(); 
     return new Dimension(i.getWidth() + s.getPaddingLeft(false) + s.getPaddingRight(false), i.getHeight() + 
       s.getPaddingTop() + s.getPaddingBottom()); 
    } 


    public void setIcon(Image i) { 
     getUnselectedStyle().setBgImage(i); 
     getSelectedStyle().setBgImage(i); 
     getPressedStyle().setBgImage(i); 
    } 

    public Image getIcon() { 
     return getUnselectedStyle().getBgImage(); 
    } 

    @Override 
    public void setText(String text) { 
    } 

    @Override 
    public Image getIconFromState() { 
     return getIcon(); 
    } 

    @Override 
    public void setUIID(String id) { 
     Image icon = getIcon(); 
     super.setUIID(id); 
     setIcon(icon); 
    } 
} 
+0

Спасибо ... В любом случае я могу заставить его работать скручиванием ничего до 3,3 отпущена? – beck

+0

3.3 был выпущен на прошлой неделе. –

+0

Как использовать scaleImageLabel в кнопке? я получил его работу как-то, но не правильно, я думаю. Я обновил то, что сделал до сих пор в вопросе выше, но он не работает нормально. – beck

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