Java Install4j:在自定义InstallerScreen中更改JPanel的大小

Java Install4j:在自定义InstallerScreen中更改JPanel的大小,java,swing,install4j,Java,Swing,Install4j,我正在尝试更改JPanel的大小,它将在createComponent()中返回,并使用getParent()将其调整为帧/屏幕的大小。但面板尺寸保持不变。my CustomPanel的代码如下所示: class CustomPanel extends JPanel { final Image backImage = getBackImage(); @Override protected void paintComponent(Graph

我正在尝试更改
JPanel
的大小,它将在
createComponent()
中返回,并使用
getParent()
将其调整为帧/屏幕的大小。但面板尺寸保持不变。my CustomPanel的代码如下所示:

    class CustomPanel extends JPanel {
        final Image backImage = getBackImage();

        @Override
        protected void paintComponent(Graphics g) {

            super.paintComponent(g);
            g.drawImage(backImage, 0, 0, null);
        }

        @Override
        public Dimension getPreferredSize() {
            Container c = this.getParent();
            Dimension d = new Dimension(c.getWidth(), c.getHeight());
            return d;
        }
    }
createComponent()
方法中的示例代码如下:

JPanel buttonPanel = new CustomPanel();
buttonPanel.add(button);    
return buttonPanel;
我尝试在实例化
按钮面板时直接执行此操作,这给了我错误。这方面的示例代码是:

JPanel buttonPanel = new JPanel();
Container c = buttonPanel.getParent();
Dimension d = new Dimension(c.getWidth(), c.getHeight());
buttonPanel.setSize(d);
buttonPanel.add(button);
return buttonPanel;
错误日志为:

Caused by: java.lang.NullPointerException
    at com.test.customcode.SampleScreenNew.createComponent(SampleScreenNew.java:101)
    at com.install4j.runtime.installer.frontend.ScreenEnvelope.addScreenContent(ScreenEnvelope.java:372)
    at com.install4j.runtime.wizard.StandardScreen.createMainPanel(StandardScreen.java:136)
    at com.install4j.runtime.wizard.StandardScreen.setupComponent(StandardScreen.java:78)
    at com.install4j.runtime.wizard.StandardScreen.initScreen(StandardScreen.java:50)
    at com.install4j.runtime.installer.frontend.ScreenEnvelope.init(ScreenEnvelope.java:61)
    at com.install4j.runtime.installer.frontend.ScreenEnvelope.<init>(ScreenEnvelope.java:46)
    at com.install4j.runtime.installer.frontend.WizardScreenExecutor$1.run(WizardScreenExecutor.java:199)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$300(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
原因:java.lang.NullPointerException
在com.test.customcode.SampleScreenNew.createComponent上(SampleScreenNew.java:101)
在com.install4j.runtime.installer.frontend.ScreenEnvelope.addScreenContent(ScreenEnvelope.java:372)
位于com.install4j.runtime.wizard.StandardScreen.createMainPanel(StandardScreen.java:136)
位于com.install4j.runtime.wizard.StandardScreen.setupComponent(StandardScreen.java:78)
位于com.install4j.runtime.wizard.StandardScreen.initScreen(StandardScreen.java:50)
位于com.install4j.runtime.installer.frontend.ScreenEnvelope.init(ScreenEnvelope.java:61)
位于com.install4j.runtime.installer.frontend.ScreenEnvelope.(ScreenEnvelope.java:46)
位于com.install4j.runtime.installer.frontend.WizardScreenExecutor$1.run(WizardScreenExecutor.java:199)
在java.awt.event.InvocationEvent.dispatch(未知源)处
位于java.awt.EventQueue.dispatchEventImpl(未知源)
位于java.awt.EventQueue.access$300(未知源)
在java.awt.EventQueue$3.run处(未知源)
在java.awt.EventQueue$3.run处(未知源)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.security.ProtectionDomain$1.doIntersectionPrivilege(未知源)
位于java.awt.EventQueue.dispatchEvent(未知源)
位于java.awt.EventDispatchThread.pumpOneEventForFilters(未知源)
位于java.awt.EventDispatchThread.pumpEventsForFilter(未知源)
位于java.awt.EventDispatchThread.pumpEventsForHierarchy(未知源)
位于java.awt.EventDispatchThread.pumpEvents(未知源)
位于java.awt.EventDispatchThread.pumpEvents(未知源)
位于java.awt.EventDispatchThread.run(未知源)

在屏幕实现中,覆盖

@Override
public boolean isFillVertical() {
    return true;
}

@Override
public boolean isFillHorizontal() {
    return true;
}

然后,由
createComponent()
返回的面板将填满所有可用空间。

“我正在尝试更改createComponent()中返回的JPanel的大小,并使用getParent()将其调整为帧/屏幕的大小。”看起来像是在摇尾巴。在这种情况下,我建议1)让面板返回合理的首选尺寸和
pack()
顶层容器,或者。。2) 执行同样的操作,然后将顶层容器(框架)设置为
MAXIMIZED\u BOTH
以使其填充屏幕在这两种情况下,面板都可能处于布局/布局约束中,这将导致它随窗口扩展。顺便说一句:部署Java桌面应用程序的最佳方法是使用。@AndrewThompson问题是对于Install4j应用程序,我只能找到使用Java swing的Install4j库。它们有特定的抽象类,您必须对这些抽象类进行扩展,以便为安装程序应用程序创建自定义屏幕。另外,这只是我第二次尝试使用JavaSwing,对我来说,事情还是有点陌生“问题在于Install4j应用程序”改用JWS。问题解决了@AndrewThompson install4j和JWS不属于同一类别。这里不想列出,但一个简单的区别是:如何使用JWS部署服务器应用程序?