首页 文章

网格布局按钮大小调整问题

提问于
浏览
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中设置为gridLayout.autofit(),这就是我想根据屏幕自动调整图像的方式 . 我如何将网格单元格与其中的按钮相匹配?我可以设置网格的大小吗?

更新:

//如何在按钮中使用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)为什么我不能设置上面的scaledPlaceholder的uiid(ScaledImageLabel)它需要一些我想删除的填充和边距 . 如果我设置uiid,图像不会出现 .

2)setBackgroundType()如何工作?它不需要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());
        }

还有一件事,如果我使用标签而不是btn它工作正常,但同样不起作用的按钮为什么是这样?

更新2:添加getIconFromState方法后,显示空白表单 - 相同的旧问题,如果删除null检查程序,则出现以下错误

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

更新3:截图现在看起来像这样:肖像:

enter image description here

风景:
enter image description here

但是,如果我从纵向模式进入横向模式并再次进入纵向模式,图像会按预期进行调整,但我仍然可以在那里看到薄的重复图像部分 .

截图从纵向到横向再到纵向:

enter image description here

1 回答

  • 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);
        }
    }
    

相关问题