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));
}
}
如果您需要,这是完整的代码。
答案 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)
持续防止闪烁问题。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);
}
}
这将输出以下内容。希望你发现我的帮助很有用。