我的问题是:我在JPanel中显示了一个JLabel的数组列表和一个JPanel的按钮,当我按下按钮时,我想在JLabel的上方显示我的JPanel。但是当我按下按钮时,我的JPanel在标签下面。
请不要告诉我使用JLayerPane,因为如果我可以不用它,那将是最好的。感谢您的解决方案。
这是我的代码的一个例子:要运行这个,请在这里找到图像100x100:
http://www.html5gamedevs.com/topic/32190-image-very-large-when-using-the-dragging-example/
在名为图像的文件中
主要:
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setTitle("test");
frame.setSize(900,700);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
JPanelControler ctrl = new JPanelControler();
frame.add(ctrl.getMyJpanel());
frame.setVisible(true);
}
}
MyJPanelController:
public class JPanelControler {
private MyJPanel myJpanel;
public JPanelControler() {
myJpanel = new MyJPanel();
myJpanel.createJLabel();
myJpanel.getButton().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
myJpanel.displayJPanel();
}
});
}
public MyJPanel getMyJpanel() {
return myJpanel;
}
}
MyJPanel:
public class MyJPanel extends JPanel {
private JButton button;
private ArrayList<JLabel> labels;
//a JPanel that contains buttons,... I won't put this class here
private JPanel panel;
public MyJPanel() {
setLayout(null);
button = new JButton("X");
button.setBounds(600,600,50,50);
add(button);
}
public void createJLabel() {
labels = new ArrayList<>();
JLabel label;
try {
BufferedImage image = ImageIO.read(new File("images/image.jpg"));
for(int i=0; i<2; i++) {
label = new JLabel(new ImageIcon(image));
label.setBounds(i*100,50,image.getWidth(), image.getHeight());
labels.add(label);
add(label);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void displayJPanel() {
panel = new JPanel();
panel.setLayout(null);
JButton b = new JButton("Ok");
b.setBounds(0,0,100, 50);
JButton b2 = new JButton("Cancel");
b2.setBounds(0,50,100, 50);
panel.setBounds(150,50, 100, 100);
panel.add(b);
panel.add(b2);
add(panel);
refresh();
}
public void refresh() {
invalidate();
revalidate();
repaint();
}
public JButton getButton() {return this.button; }
}
如果您希望按钮出现在普通图像上,那么您有两种选择:
paintComponent
覆盖中绘制图像,而不是在 JLabel 中绘制 ImageIcons。这将允许您向同一个JPanel添加组件,包括按钮等,并且图像将保留在后台。如果你走这条路,一定要在你的覆盖中首先调用super.paintComponent(g);
方法。JLayeredPane.DEFAULT_LAYER
,即底层(常量为 Integer 0),然后将新显示的 JButton 面板放在JLayeredPane.PALETTE_LAYER
中,它位于默认值的正上方。如果您采用此路线,请确保添加的JPanel不是不透明的,否则它将完全覆盖所有图像。关于第二条建议的示例,请参见下文:
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.*;
public class JPanelControler {
private MyJPanel myJpanel;
public JPanelControler() {
myJpanel = new MyJPanel();
myJpanel.createJLabel();
myJpanel.getButton().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
myJpanel.displayJPanel();
}
});
}
public MyJPanel getMyJpanel() {
return myJpanel;
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setTitle("test");
frame.setSize(900, 700);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
JPanelControler ctrl = new JPanelControler();
frame.add(ctrl.getMyJpanel());
frame.setVisible(true);
}
}
class MyJPanel extends JLayeredPane {
private static final String IMG_PATH = "https://upload.wikimedia.org/wikipedia"
+ "/commons/thumb/f/fc/Gros_Perr%C3%A9.jpg/100px-Gros_Perr%C3%A9.jpg";
private JButton button;
private ArrayList<JLabel> labels;
// a JPanel that contains buttons,... I won't put this class here
private JPanel panel;
public MyJPanel() {
setLayout(null);
button = new JButton("X");
button.setBounds(600, 600, 50, 50);
add(button, JLayeredPane.DEFAULT_LAYER); // add to the bottom
}
public void createJLabel() {
labels = new ArrayList<>();
JLabel label;
try {
URL imgUrl = new URL(IMG_PATH); // ** added to make program work for all
BufferedImage image = ImageIO.read(imgUrl);
for (int i = 0; i < 2; i++) {
label = new JLabel(new ImageIcon(image));
label.setBounds(i * 100, 50, image.getWidth(), image.getHeight());
labels.add(label);
add(label);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void displayJPanel() {
panel = new JPanel();
panel.setLayout(null);
panel.setOpaque(false); // ** make sure can see through
JButton b = new JButton("Ok");
b.setBounds(0, 0, 100, 50);
JButton b2 = new JButton("Cancel");
b2.setBounds(0, 50, 100, 50);
panel.setBounds(150, 50, 100, 100);
panel.add(b);
panel.add(b2);
add(panel, JLayeredPane.PALETTE_LAYER); // add it above the default layer
refresh();
}
public void refresh() {
// invalidate(); // not needed
revalidate();
repaint();
}
public JButton getButton() {
return this.button;
}
}
问题内容: 这是我的代码。它不会在框架中显示图像,而是显示一些文本。有人可以建议我,我应该对代码进行哪些更改,以便可以在框架中显示图像? 问题答案: 请注意,我不会以这种方式设计代码,但是我希望使它尽可能接近原始代码,同时使其能够在基于Windows的框中显示图像列表。 列表显示
问题内容: 我通过这种方式创建了一个JEditorPane: 我将此窗格放在JFrame上。 文字显示正确,但是我看不到图片,只有一个正方形指示应该有图片(即:未找到图片时浏览器会显示“破碎的图片”) 问题答案: 您必须提供类型,并获取资源。就这样。我测试过的示例,但是不确定格式。希望能帮助到你:
Mac OSX Netbeans JAVA 目标:21点程序…我正在尝试将扑克牌的图像图标显示在JLabel中 逻辑:我创建了一些CARD对象,用一个方法返回与之相关的imageIcon。在我的主GUI类中,如果我创建新的imageIcon来指定文件位置,它就会工作 注释掉的行工作正常,显示imageIcon图像,但是当我使用card1.getImage()方法时,图像不显示。方法很简单- 此外,
此页http://wildlife.x-tremeteam.com利用CSS边框图像属性和。带有透明边缘的png图像,可在我的div上创建“撕裂的纸张”外观。除了在我的Android(三星SIII)上,无论我使用的是它的默认浏览器还是Chrome应用程序,它都工作得很好。在这一点上,我可以看到在20px边界的内部和外部都有一个轻微的边缘。有趣的是,我看不到角落的边缘。带边框的div的背景是透明的。
我设计了一个简单的表格。 其中我将一个面板作为contentPane,将一个JLabel作为LBLPanel。 但是当我尝试这样做时,它只显示图像的原始大小,这是自然的,我们必须手动设置图像大小来fed整个JLabel。 因此,下面是我使用JLabel的图标属性设置图像时由WindowBuilder生成的代码。 现在我的问题是我想把图像的大小设置为JLabel的大小,那么有什么直接的方法可以使用W
问题内容: 在JPanel上显示jpg图像(从本地文件夹加载)的最合适的图像类型是什么? 干杯。 问题答案: