如何在Java中添加图像?

时间:2016-03-12 14:07:48

标签: java image swing

frame.add(new JLabel(new ImageIcon("C:/Users/Sam/Pictures/DesktopBackgrounds/image.png")));

我在另一个问题上看到了这个,所以我尝试使用它并且该类运行时没有错误,但屏幕上没有图像。

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.KeyStroke;

class FullSceenToggleAction extends AbstractAction {

    private JFrame frame;
    private GraphicsDevice fullscreenDevice;

    public FullSceenToggleAction(JFrame frame) {
        this(frame, GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice());
    }

    public FullSceenToggleAction(JFrame frame, GraphicsDevice fullscreenDevice) {
        this.frame = frame;
        this.fullscreenDevice = fullscreenDevice;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        frame.dispose();
        if (frame.isUndecorated()) {
            fullscreenDevice.setFullScreenWindow(null);
            frame.setUndecorated(false);
        } else {
            frame.setUndecorated(true);
            fullscreenDevice.setFullScreenWindow(frame);
        }
        frame.setVisible(true);
        frame.repaint();
    }

}

public class Main {

    public static final void addKeyBinding(JComponent c, String key, final Action action) {
        c.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(key), key);
        c.getActionMap().put(key, action);
        c.setFocusable(true);
    }

    public static void main(String[] args) {
        final JFrame frame = new JFrame("Fullscreen Toggle Test");
        Container contentPane = frame.getContentPane();
        contentPane.add(new JLabel("Hey"), BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(960, 600);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.setTitle("Virtual World");
        frame.add(new JLabel(new ImageIcon("C:/Users/Sam/Pictures/DesktopBackgrounds/image.png")));
        addKeyBinding(frame.getRootPane(), "F11", new FullSceenToggleAction(frame));
    }

}

如果您需要,这是完整的代码。

3 个答案:

答案 0 :(得分:3)

您的代码存在多个问题。在Swing中,代码的顺序确实有所不同。

代码订购问题:

目前,您要在 设置尺寸后将图像添加到 框架中。当帧大小改变时,将咨询油漆管理器以重新绘制帧。因此,您只能看到之前添加的"Hey"标签,但不能看到图片。

建议在添加所需的所有组件后设置大小。如果没有,您可能希望稍后revalidate()您的框架。

我通常会按以下顺序设置组件:

// Create frame
// Set default close operation for frame
// Add components or container to frame
// pack the frame   (frame will be repainted by this action)
// set visible as true

布局问题:

您正在使用框架的默认布局(BorderLayout)。如果没有说明要在BorderLayout中添加组件的位置/方向,它将通过BorderLayout的默认值添加到CENTER中。

在您的代码中,您添加了图像(第二个标签)而没有说明位置(字符串规范)。这样做会将第一个标签替换为第二个标签。因此,框架中只显示一个组件。

其他问题:

我将在下面总结一些其他问题:

  • 建议setVisible(true)持续防止闪烁问题。
  • 我更喜欢将另一个容器(如JPanel)添加到JFrame中,并在面板中添加组件,而不是直接添加到框架中。
  • 通过上述内容,您可以pack()框架,允许它根据添加的组件确定自己的preferredSize。

答案 1 :(得分:-2)

尝试将imageIcon Label添加到内容窗格中。

    Container contentPane = frame.getContentPane();
    contentPane.add(new JLabel("Hey"), BorderLayout.SOUTH);
    contentPane.add(new JLabel(new ImageIcon("C:/Users/Sam/Pictures/DesktopBackgrounds/image.png")));

答案 2 :(得分:-2)

你可能会发现这些代码很有用。我发布这段代码是为了理解目的。

public class AddingIconJLabel {
  public static void main(String[] args) {
    JFrame.setDefaultLookAndFeelDecorated(true);
    JFrame frame = new JFrame();
    frame.setTitle("JLabel Test");
    frame.setLayout(new FlowLayout());
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
    ImageIcon imageIcon = new ImageIcon("C:/Users/Sam/Pictures/DesktopBackgrounds/image.png");
    JLabel label = new JLabel(imageIcon);    
    frame.add(label);
    frame.pack();
    frame.setVisible(true);
  }
}

这将输出以下内容。希望你发现我的帮助很有用。

output