有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何使用JPanel使java图像可见

我制作了一个以图像为背景的JPanel。但在第一次加载JPanel时,添加的其余组件却看不到图像。将鼠标滚动到图像上后,按钮将可见。如何在加载面板时使JButtons与作为背景的图像一起可见

enter image description here

以下是我的代码:

    contentPane = new JPanel();
    contentPane.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null, null, null, null));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    homePanel.setBounds(10, 11, 959, 620);
    homePanel.setLayout(null);

    JPanel wizardPanel = new JPanel();
    wizardPanel.setBounds(10, 295, 545, 336);
    wizardPanel.setLayout(null);
    homePanel.add(wizardPanel);

    JLabel backgroundLabel;
    try {
        backgroundLabel = new JLabel(new ImageIcon(ImageIO.read(new File("images/nature.jpg"))));
        backgroundLabel.setBounds(0, 0, 545, 336);
        wizardPanel.add(backgroundLabel);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


    JButton btnNewButton = new JButton("New button");
    btnNewButton.setBounds(309, 95, 89, 23);
    wizardPanel.add(btnNewButton);

    JButton btnNewButton_1 = new JButton("New button");
    btnNewButton_1.setBounds(309, 150, 89, 23);
    wizardPanel.add(btnNewButton_1);

    JButton btnNewButton_2 = new JButton("New button");
    btnNewButton_2.setBounds(309, 212, 89, 23);
    wizardPanel.add(btnNewButton_2);

共 (3) 个答案

  1. # 1 楼答案

    把按钮放在标签上是个坏主意。更好的方法是将图像绘制为面板背景或使用JLayer。以下是第一个解决方案的示例:

    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.LayoutManager;
    import java.util.Objects;
    
    import javax.imageio.ImageIO;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    import javax.swing.WindowConstants;
    
    public class JImagePanel extends JPanel {
    
        private final Image image;
    
        private boolean scale;
    
        public JImagePanel(Image anImage) {
            image = Objects.requireNonNull(anImage);
        }
    
        public JImagePanel(Image anImage, LayoutManager aLayout) {
            super(aLayout);
            image = Objects.requireNonNull(anImage);
        }
    
        /**
         * {@inheritDoc}
         */
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            final Image toDraw = scale? image.getScaledInstance(getWidth(), getHeight(), Image.SCALE_SMOOTH) : image;
            g.drawImage(toDraw, 0, 0, this);
        }
    
        /**
         * {@inheritDoc}
         */
        @Override
        public Dimension getPreferredSize() {
            if (isPreferredSizeSet()) {
                return super.getPreferredSize();
            } else {
                return new Dimension(image.getWidth(this), image.getHeight(this));
            }
        }
    
        public boolean isScale() {
            return scale;
        }
    
        public void setScale(boolean scale) {
            this.scale = scale;
        }
    
    
        public static void main(String[] args) throws Exception {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    try {
                        final JImagePanel p = 
                                new JImagePanel(ImageIO.read(JImagePanel.class.getResource("myImage.png")), new FlowLayout());
                        p.setScale(true);
                        p.add(new JButton("Button"));
                        final JFrame frm = new JFrame("Image test");
                        frm.add(p);
                        frm.pack();
                        frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                        frm.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    
    }
    
  2. # 2 楼答案

    一个快速的解决方案可能是直接将JFrame内容窗格设置为图像,并将组件添加到此JFrame的内容窗格中。假设您的代码来自JFrame类的主体。我的建议大致如下:

            JRootPane rootpane = new JRootPane();
            JPanel contentPane = new JPanel();
            contentPane.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null, null, null, null));
            rootpane.setContentPane(contentPane);
            contentPane.setLayout(null);
    
            JPanel homePanel = new JPanel();
            homePanel.setBounds(10, 11, 959, 620);
            homePanel.setLayout(null);
    
            JRootPane wizardPanel = new JRootPane();
            wizardPanel.setBounds(10, 295, 545, 336);
            wizardPanel.setLayout(null);
    
            JLabel backgroundLabel;
            try {
                File f = new File("D:\\work\\eclipse\\workspace_eclipse_4.4.1\\trialExamples\\src\\main\\images\\nature.jpg");
                backgroundLabel = new JLabel(new ImageIcon(ImageIO.read(f)));
                backgroundLabel.setBounds(0, 0, 545, 336);
                wizardPanel.setContentPane(backgroundLabel);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
            JButton btnNewButton = new JButton("New button");
            btnNewButton.setBounds(309, 95, 89, 23);
            wizardPanel.getContentPane().add(btnNewButton);
    
            JButton btnNewButton_1 = new JButton("New button");
            btnNewButton_1.setBounds(309, 150, 89, 23);
            wizardPanel.getContentPane().add(btnNewButton_1);
    
            JButton btnNewButton_2 = new JButton("New button");
            btnNewButton_2.setBounds(309, 212, 89, 23);
            wizardPanel.getContentPane().add(btnNewButton_2);
    
            homePanel.add(wizardPanel.getContentPane());
    
            add(homePanel);
    
  3. # 3 楼答案

    这太疯狂了!!我把JButtons初始化代码块放在它工作的图像加载部分之上,使它工作

         package demo;
    
         import java.awt.EventQueue;
         import java.io.File;
         import java.io.IOException;
    
         import javax.imageio.ImageIO;
         import javax.swing.ImageIcon;
         import javax.swing.JButton;
         import javax.swing.JFrame;
         import javax.swing.JLabel;
         import javax.swing.JPanel;
         import javax.swing.SwingUtilities;
         import javax.swing.UIManager;
         import javax.swing.border.EmptyBorder;
    
    public class demoframe extends JFrame {
    
    /**
     * 
     */
    private static final long serialVersionUID = 1436190962490331120L;
    
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    demoframe frame = new demoframe();
    
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
                    SwingUtilities.updateComponentTreeUI(frame);
    
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    
    /**
     * Create the frame.
     */
    public demoframe() {
    
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 988, 678);
        JPanel contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
    
        JPanel panel = new JPanel();
        panel.setBounds(10, 11, 501, 361);
        contentPane.add(panel);
        panel.setLayout(null);
    
        JButton btnNewButton = new JButton("New button");
        btnNewButton.setBounds(322, 112, 89, 23);
        panel.add(btnNewButton);
    
        JButton button = new JButton("New button");
        button.setBounds(322, 172, 89, 23);
        panel.add(button);
    
        JButton button_1 = new JButton("New button");
        button_1.setBounds(322, 244, 89, 23);
        panel.add(button_1);
    
        JLabel backgroundLabel;
        try {
            backgroundLabel = new JLabel(new ImageIcon(ImageIO.read(new File("images/nature.jpg"))));
            backgroundLabel.setBounds(0, 0, 501, 361);
            panel.add(backgroundLabel);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
    
    
        JPanel panel_1 = new JPanel();
        panel_1.setBounds(521, 11, 441, 361);
        contentPane.add(panel_1);
    
        JPanel panel_2 = new JPanel();
        panel_2.setBounds(10, 383, 952, 246);
        contentPane.add(panel_2);
    
    }   
     }
    

    Output looks like this now