有 Java 编程相关的问题?

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

如何在JavaSwing中在contentpane(JPanel)上打印图像

在主类Practice extends JFrame中,有三个类UpperPanelCenterPanelLowerPanel扩展了JPanel

我将把按钮放在上面板和下面板上,把一个图像放在中心面板上,并在一个框架中打印出来。 但是,当图像打印出来时,三个面板不打印。当三个面板打印出来时,图像不会被打印出来。 我想问题是setContentPane(new ImagePanel());当我输入这个代码时(在CenterPanel),只打印图像。其余面板(上、中、下)不输出。 (我已经创建了一个单独的图像输出class(ImagePanel extends JPanel),但是可以删除这个类。但是我想使用paintComponent(Graphics g)

我很抱歉我的英语很差,谢谢你阅读 请帮帮我

    import java.awt.Color;

    import java.awt.Container;
    import java.awt.FlowLayout;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.SwingConstants;
    
    public class Practice extends JFrame {
    public int width = 480; 
    public int height = 720;
    
    public Practice() {
        setTitle("20201209");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(null);
        setSize(width,height);  
        c.add(new UpperPanel());
        c.add(new CenterPanel());
        c.add(new LowerPanel());
        setVisible(true);
    }
    
    
    class UpperPanel extends JPanel {
        public UpperPanel() {
        JPanel UpperPanel = new JPanel();
        
        UpperPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 25));
        UpperPanel.setBackground(Color.MAGENTA);
        UpperPanel.setBounds(0, 0, 480, 100);
        getContentPane().add(UpperPanel);
        
        JButton btnEnlarge = new JButton("1");
        btnEnlarge.setFont(new Font("궁서체", Font.PLAIN, 20));
        btnEnlarge.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            }
        });
        UpperPanel.add(btnEnlarge);
        
        JButton btnReduce = new JButton("2");
        btnReduce.setFont(new Font("바탕체", Font.ITALIC, 20));
        btnReduce.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            }
        });
        UpperPanel.add(btnReduce);
        
        JButton btnFit = new JButton("3");
        btnFit.setFont(new Font("돋움체", Font.BOLD, 20));
        btnFit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            }
        });
        UpperPanel.add(btnFit);
        }
    }
    
    class CenterPanel extends JPanel{
        public CenterPanel() {
        JPanel CenterPanel = new JPanel();
        CenterPanel.setLayout(null);
        CenterPanel.setBackground(Color.YELLOW);
        CenterPanel.setBounds(0, 100, 480, 500);
        CenterPanel.setOpaque(true);
        getContentPane().add(CenterPanel);
        
        setContentPane(new ImagePanel()); // when I enter this code, Only images are printed. The rest of the panels(Upper, Center, Lower) are not output
        }
    }
    
    class ImagePanel extends JPanel { //this class is for image printing on CenterPanel
        private ImageIcon icon = new ImageIcon("images/1771211.jpg");
        private Image img = icon.getImage();
        
        public void paintComponent(Graphics g) { //I want to use this code
            super.paintComponent(g);
            g.drawImage(img, 10, 110, this);
        }
    
    }
    
        
    class LowerPanel extends JPanel {
        public LowerPanel() {
            JPanel LowerPanel = new JPanel();
            LowerPanel.setLayout(null);
            LowerPanel.setBackground(Color.BLACK);
            LowerPanel.setBounds(0, 600, 480, 120);
            getContentPane().add(LowerPanel);
            getContentPane().add(new MyButton());
            }
        }
    
    class MyButton extends JLabel{ //this class is for a Button on LowerPanel
        MyButton(){
            JButton btn = new JButton("4");
            btn.setBounds(10, 610, 460, 100);
            btn.setHorizontalAlignment(SwingConstants.CENTER);
            btn.setVerticalAlignment(SwingConstants.CENTER);
            btn.setFont(new Font("돋움체", Font.BOLD, 50)); 
            btn.setBackground(Color.WHITE);
            btn.setForeground(Color.RED);
            btn.setOpaque(true);
            getContentPane().add(btn);
            }
        }
    
    public static void main(String[] args) {
        new Practice();
    }
}

共 (1) 个答案

  1. # 1 楼答案

    1. 不要不必要地扩展JFrame
    2. 不要使用null/AbsoluteLayout而要使用适当的LayoutManager
    3. 不要在组件上调用setBounds()setSize(),如果使用正确的布局管理器,这将为您处理
    4. 在将帧设置为可见之前调用JFrame#pack()
    5. 所有Swing组件都应该通过SwingUtilities.invokeLaterEDT上调用

    下面是一个你想要实现的小例子

    enter image description here

    TestApp。java:

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.imageio.ImageIO;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class TestApp {
    
        BufferedImage image;
    
        public TestApp() {
            createAndShowGui();
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(TestApp::new);
        }
    
        private void createAndShowGui() {
            JFrame frame = new JFrame("TestApp");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            // load image
            try {
                image = ImageIO.read(new URL("https://i.stack.imgur.com/XNO5e.png"));
            } catch (MalformedURLException ex) {
                Logger.getLogger(TestApp.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(TestApp.class.getName()).log(Level.SEVERE, null, ex);
            }
    
            // upper panel
            JPanel upperPanel = new JPanel(); // JPanels use FlowLayout by default
            JButton button1 = new JButton("Button 1");
            JButton button2 = new JButton("Button 2");
            JButton button3 = new JButton("Button 3");
            upperPanel.add(button1);
            upperPanel.add(button2);
            upperPanel.add(button3);
    
            // center panel
            JPanel centerPanel = new JPanel() {
                @Override
                protected void paintComponent(Graphics g) {
                    super.paintComponent(g);
                    g.drawImage(image, 0, 0, this);
                }
    
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(image.getWidth(), image.getHeight());
                }
    
            };
    
            // lower panel
            JPanel lowerPanel = new JPanel();
            JButton button4 = new JButton("Button 4");
            JButton button5 = new JButton("Button 5");
            JButton button6 = new JButton("Button 6");
            lowerPanel.add(button4);
            lowerPanel.add(button5);
            lowerPanel.add(button6);
    
            frame.add(upperPanel, BorderLayout.NORTH); // JFrame uses BorderLayout by default
            frame.add(centerPanel, BorderLayout.CENTER);
            frame.add(lowerPanel, BorderLayout.SOUTH);
    
            frame.pack();
            frame.setVisible(true);
        }
    
    }