0

i'm trying to get a GUI going with a background and some buttons which shall be in front of the background picture.

My current problem is combining those both things cause Java keeps producing error codes at the

"frame.setContentPane(new JPanel() {"

section in the code.

public class AbsolutLayoutDemo {

/**
 * @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();
                }
            }
        });
    }
}

I edited the modified code, now im able to compile the project, but no image as well as no buttons are displayed anymore.

3 Answers3

3

Your code don't compile cause you are creating an anonymous class incorrectly. You can solve it using initialization block like show below.

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);
        }

});

Also and not less important. Don't use null layout you can read more here

Community
  • 1
  • 1
nachokk
  • 14,363
  • 4
  • 24
  • 53
  • I've seen `static {}` initialization blocks but I've never seen something like this! How does it work? When does it execute the code? – StepTNT Sep 13 '13 at 13:22
  • 1
    @StepTNT Before anonymous class constructor and after JPanel constructor. – nachokk Sep 13 '13 at 13:26
  • Firstly i wanted to say thanks for the feedback; I'm able to compile it now but no image is displayed. Furthermore the buttons are not longer displayed in the frame :S – Marius Rieg Sep 13 '13 at 13:30
  • 1
    @MariusRieg debug it, sure your `getPrefferedSize()` returns `0`. im not expert in painting in swing. But **DON'T** use NULL LayoutManager instead use a proper layout manager. – nachokk Sep 13 '13 at 13:35
  • @nachokk thanks i will try. The problem is, i have to place the buttons variable on the whole screen. – Marius Rieg Sep 13 '13 at 13:38
  • @MariusRieg you can do it easily using layout manager, if you are using netbeans with matisse, set a proper layout and you can see it at the moment, Have a look to [Using layout managers](http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html) – nachokk Sep 13 '13 at 13:42
1

You can't use an inner class like this :

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);
    }

}

The try {} should be in a method not directly in the class

Michael Laffargue
  • 10,116
  • 6
  • 42
  • 76
1

I can't try it now, and without knowing which are the errors, I guess that the problem is caused by how you're building your JPanel.

Try something like:

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);
    }

    });
StepTNT
  • 3,867
  • 7
  • 41
  • 82