当前位置: 首页 > 知识库问答 >
问题:

Java:无法在带有图像的JLabel上方显示JPanel

葛承德
2023-03-14

我的问题是:我在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; }

}

共有1个答案

邵耀
2023-03-14

如果您希望按钮出现在普通图像上,那么您有两种选择:

  • 在主 JPanel 中的 paintComponent 覆盖中绘制图像,而不是在 JLabel 中绘制 ImageIcons。这将允许您向同一个JPanel添加组件,包括按钮等,并且图像将保留在后台。如果你走这条路,一定要在你的覆盖中首先调用super.paintComponent(g);方法
  • 或者你可以使用JLayeredPane(不管你不想这样做)。您只需将背景 JPanel 放入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图像(从本地文件夹加载)的最合适的图像类型是什么? 干杯。 问题答案: