如何在我的表单中放置图像?

时间:2010-03-17 13:49:54

标签: java image icons

我遇到了问题。我想在Java中的表单中放置一个图像,我不知道我是否使用了正确的技术(在网页的某个地方找到它)。

private void iconSelect() {
    String iconString = "";
    if (typeCombobox.getSelectedIndex() == 0) {
        iconString = "LP_";
    } else if (typeCombobox.getSelectedIndex() == 1) {
        iconString = "HP_";
    } else if (typeCombobox.getSelectedIndex() == 2) {
        iconString = "BP_";
    } else if (typeCombobox.getSelectedIndex() == 3) {
        iconString = "BS_";
    }
    if (RB_Gain_Clean.isSelected()) {
        iconString = iconString + "Clean";
    } else if (RB_Gain_dB.isSelected()) {
        iconString = iconString + "dB";
    }

    ImageIcon icon = new ImageIcon("images/" + iconString + ".jpg");
    Image img = icon.getImage();
    if (iconGraphLabel.getWidth() > 0 && iconGraphLabel.getHeight() > 0) {
        img = img.getScaledInstance(iconGraphLabel.getWidth(), iconGraphLabel.getHeight(), java.awt.Image.SCALE_SMOOTH);
    }
    icon = new ImageIcon(img);
    iconGraphLabel.setIcon(icon);
}

所以它实际上显示了图像并且正在调整大小,但是当我调整表单大小然后再将其缩小时,标签似乎不会跟随调整大小,因此它会比窗口大。

另外,由于我对java的图形不太熟悉,有人能告诉我如何控制窗口大小调整事件,以便重绘图片?现在,该方法由代码中显示的组合框和无线电按钮触发。

提前致谢!

edit1:表单是我的jFrame。 iconGraphLabel是我正在放入图像的jLabel。我将尝试解释父组件的层次结构。

PlotArea [jPanel](cardLayout)> plotArea_Image [jPanel](“cardDraw”)> iconGraphPanel [jPanel]> iconGraphLabel

2 个答案:

答案 0 :(得分:0)

  

但是当我调整表格大小然后   让它变得更小,标签   似乎没有按照调整大小   它比窗口大

正确,JLabel或任何使用Icons的Swing组件都会以实际大小绘制Icon。如果您希望图标根据可用空间进行缩放,则需要进行自定义绘制。

Background Panel类为显示图像提供了不同的选项(您可以使用Icon,getImage()方法)。您还应该阅读Custom Painting上Swing教程中的部分,以便更好地理解上述代码的工作原理。

答案 1 :(得分:0)

找到解决方案。这是最终的代码:

private void iconSelect() {
    iconGraphPanel.removeAll();
    ImageIcon icon = new ImageIcon("image.jpg");
    BackgroundPanel imagePanel = new BackgroundPanel(icon.getImage(), BackgroundPanel.SCALED);
    iconGraphPanel.add(imagePanel);
    iconGraphPanel.revalidate();
}

iconGraphPanel是一个常用的jPanel,我用它作为占位符。它需要设置为BorderLayout。可以找到BackgroundPanel类here。需要removeAll()以便旧图像消失。如果你不把这些图像开始堆叠起来。不知道是否有更好的方法可以做到这一点,但它对我来说效果很好。需要revalidate()方法,因为我们创建了一个新面板,因此需要刷新。

这主要是神奇的工作和来自太阳论坛的一些名叫Maxideon的其他人。我只是张贴以供将来参考。