Java 调整JFrame的大小以适应JPanel

Java 调整JFrame的大小以适应JPanel,java,image,swing,resize,Java,Image,Swing,Resize,我有一个GUI,它由JFrame和菜单栏组成。JFrame内部是我的自定义面板(扩展JPanel),它最初是隐藏的。用户选择一个图像(JFileChooser),该图像被传递到面板并绘制(使用paintIcon)。调整面板大小以适合图像,然后设置为可见。我想调整JFrame的大小以适应面板,但我似乎无法让它工作。我尝试过使用pack()方法,但这只是一个很小的GUI,即JMenu的大小!我还尝试使用ImageIcon的getIconWidth()和getIconHeight()属性调整框架和JP

我有一个GUI,它由JFrame和菜单栏组成。JFrame内部是我的自定义面板(扩展JPanel),它最初是隐藏的。用户选择一个图像(JFileChooser),该图像被传递到面板并绘制(使用paintIcon)。调整面板大小以适合图像,然后设置为可见。我想调整JFrame的大小以适应面板,但我似乎无法让它工作。我尝试过使用pack()方法,但这只是一个很小的GUI,即JMenu的大小!我还尝试使用ImageIcon的getIconWidth()和getIconHeight()属性调整框架和JPanel的大小,但是虽然这可以正确调整面板的大小,但它不会调整JFrame的大小。关于我如何正确地做到这一点,有什么想法吗

我设置JFrame大小的代码块如下:

@Override
public void actionPerformed(ActionEvent e) 
{

    JFileChooser imgChooser = new JFileChooser();
    JMenuItem evtSource = (JMenuItem) e.getSource();
    String srcText = evtSource.getText();

    if (srcText.equals("Add Image..."))
    {
        imgChooser = new JFileChooser();
        imgChooser.showOpenDialog(frmMain);

        chosenImage = imgChooser.getSelectedFile();
        try
        {
            loadedImage = ImageIO.read(chosenImage);
        }
        catch (IOException ex)
        {
            String errorMsg = ex.getMessage();
            JOptionPane.showMessageDialog(frmMain, "Error while loading file: " + errorMsg, "Error!", JOptionPane.ERROR_MESSAGE);
        }

        panelImage = new ImageIcon(loadedImage);

        frmMain.setSize(panelImage.getIconWidth(), panelImage.getIconHeight() + mbMenu.getHeight());
        displayImage.loadImage(panelImage);
        displayImage.setVisible(true);

    }
}
“displayImage”自定义面板相关部分的代码如下:

public void paintComponent(Graphics g) 
{
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;

        if (imgIsLoaded)
        {
            panelImage.paintIcon(this,g2,0,0);
            resizePanel(panelImage.getIconWidth(), panelImage.getIconHeight());

        }
}

public void loadImage(ImageIcon i)
{
    panelImage = i;
    imgIsLoaded = true;
}

public void resizePanel(int w, int h)
{
    this.setSize(w, h);
}

覆盖面板中的
getPreferredSize()
,如果没有图像,则返回默认值(例如400x400),否则返回图像的大小

设置图像后,调用
frame.pack()


顺便说一句-如果面板所做的只是绘制图像,我会选择
JLabel

好的,谢谢你-我会尝试一下!它必须是一个JPanel,因为我也要在上面画形状。很抱歉,这完全不起作用。框架确实会调整大小,但它的高度比图像短,而且有点太宽。在我稍微调整代码后,你的建议奏效了。我在错误的位置调用frame.pack()。