有 Java 编程相关的问题?

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

Java Swing设置背景和按钮

我正试图让一个图形用户界面有一个背景和一些按钮,应该在背景图片的前面

我目前的问题是将这两个因素结合在一起,因为Java总是同时产生错误代码

“frame.setContentPane(新JPanel(){”

代码中的节

公共类绝对布局演示{

/**
 * @param args
 */
  public static void addComponentsToPane(Container pane) {
        pane.setLayout(null);

        JButton b1 = new JButton("one");
        JButton b2 = new JButton("two");
        JButton b3 = new JButton("three");

        pane.add(b1);
        pane.add(b2);
        pane.add(b3);

        Insets insets = pane.getInsets();
        Dimension size = b1.getPreferredSize();
        b1.setBounds(25 + insets.left, 5 + insets.top,
                     size.width, size.height);
        size = b2.getPreferredSize();
        b2.setBounds(55 + insets.left, 40 + insets.top,
                     size.width, size.height);
        size = b3.getPreferredSize();
        b3.setBounds(150 + insets.left, 15 + insets.top,
                     size.width + 50, size.height + 20);




    }

    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     * @throws IOException 
     */
    public static void createAndShowGUI() throws IOException {



        //Create and set up the window.
        JFrame frame = new JFrame("AbsoluteLayoutDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Set up the content pane.
        addComponentsToPane(frame.getContentPane());

        //Size and display the window.
        Insets insets = frame.getInsets();
        frame.setSize(600 + insets.left + insets.right,
                      600 + insets.top + insets.bottom);
        frame.setVisible(true);
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        frame.setContentPane(new JPanel() {


            BufferedImage image = ImageIO.read(new File("bilder/background.jpg"));

            @Override 
        public void paintComponent(Graphics g) {


            super.paintComponent(g);
            g.drawImage(image, 0, 0, 600, 600, this);
        }

        });


    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.

        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                try {
                    createAndShowGUI();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
    }
}

我编辑了修改后的代码,现在我可以编译这个项目了,但是不再显示任何图像和按钮


共 (3) 个答案

  1. # 1 楼答案

    您的代码无法编译,因为您创建的匿名类不正确。您可以使用如下所示的初始化块来解决它

    frame.setContentPane(new JPanel() {
             BufferedImage image; // you declare as instance variable
             { // initialization block
              try {
                  image = ImageIO.read(new File("bilder/background.jpg"));
              } catch (IOException e) {
                  e.printStackTrace();
              }
             }
    
           @Override 
           public void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(image, 0, 0, 600, 600, this);
            }
    
    });
    

    同样,也同样重要。不要使用null布局,您可以阅读更多here

  2. # 2 楼答案

    不能使用这样的内部类:

    new JPanel() {
    
        try {
            BufferedImage image = ImageIO.read(new File("bilder/background.jpg"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
        public void paintComponent(Graphics g) {
    
            super.paintComponent(g);
            g.drawImage(image, 0, 0, 600, 600, this);
        }
    
    }
    

    try {}应该在一个方法中,而不是直接在类中

  3. # 3 楼答案

    我现在无法尝试,在不知道哪些是错误的情况下,我猜问题是由您如何构建JPanel引起的

    尝试以下方法:

    frame.setContentPane(new JPanel() {
    
        BufferedImage image;
        private BufferedImage getImage(){
            if(image == null){
                try {
                    image = ImageIO.read(new File("bilder/background.jpg"));
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            return image;
        }
    
        public void paintComponent(Graphics g) {
    
            super.paintComponent(g);
            g.drawImage(getImage(), 0, 0, 600, 600, this);
        }
    
        });