java - JFrame with Background Image and a JPanel -


i have following:

public class frame {  public static void main(string[] args) {      jframe frame = new jframe("frame demo");      panel panel = new panel();              frame.add(panel);              frame.setbounds(250,100,800,500);     frame.setvisible(true); } }  public class panel extends jpanel {  jbutton singleplayerbutton; jbutton multiplayerbutton;  bufferedimage image;  gui gui;   public panel() {     gui = new gui();     add(gui);      try {         image = imageio.read(new file("c:\\users\\void\\workspace\\battleships\\src\\testumgebung\\background\\battleship_main.jpg"));      } catch (ioexception e) {         e.getmessage();         e.printstacktrace();     }  }  public void paintcomponent(graphics g) {     g.drawimage(image, 0, 0, this.getwidth(), this.getheight(), null); }   jlabel text; jpanel mainmenupanel;   private class gui extends jpanel {      public gui() {      setvisible(true);     setsize(500, 300);     setlayout(null);      mainmenupanel = new jpanel();      mainmenupanel.setlayout(null);     mainmenupanel.setbackground(color.blue);     mainmenupanel.setbounds(150, 10, 200, 230);     add(mainmenupanel);     mainmenupanel.setvisible(true);       singleplayerbutton = new jbutton("single player");     singleplayerbutton.setbounds(100,50 , 150, 40);      singleplayerbutton.setvisible(true);      mainmenupanel.add(singleplayerbutton);      multiplayerbutton = new jbutton("multi player");     multiplayerbutton.setbounds(100, 100, 150, 40);      multiplayerbutton.setvisible(true);     mainmenupanel.add(multiplayerbutton);      repaint(); }  } } 

i want mainmenu backgroundimage , buttons singleplayer etc. have set layout or possible without one. started gui, can assume code. in advance...

do have set layout or possible without one

as general rule of thumb, yes, should make use of layout manager ever it's possible, save lot of work in long run.

based on code , presume want do, suggest having at:

as additional advice:

  • don't use null layouts, pixel perfect layouts illusion within modern ui design. there many factors affect individual size of components, none of can control. swing designed work layout managers @ core, discarding these lead no end of issues , problems spend more , more time trying rectify
  • don't reference src ever, no exist once program exported. try , avoid absolute paths well, different computers place program in different locations (and not os's have concept of drive letters). instead, in case, should using getclass().getresource("/testumgebung/background/battleship_main.jpg")
  • you should calling super.paintcomponent before performing custom painting general rule.
  • in order background show up, components added should made transparent (setopaque(false)) background can show through.
  • separate classes areas of responsibility. example panel should nothing manage background image , should not managing else, mean having gui added panel separate step , not part of panels initialisation

as conceptual example...

be free

import java.awt.alphacomposite; import java.awt.borderlayout; import java.awt.cardlayout; import java.awt.color; import java.awt.composite; import java.awt.dimension; import java.awt.eventqueue; import java.awt.graphics; import java.awt.graphics2d; import java.awt.gridbagconstraints; import java.awt.gridbaglayout; import java.awt.image.bufferedimage; import java.io.ioexception; import javax.imageio.imageio; import javax.swing.jbutton; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jpanel; import javax.swing.uimanager; import javax.swing.unsupportedlookandfeelexception;  public class frame {      public static void main(string[] args) {          eventqueue.invokelater(new runnable() {             @override             public void run() {                 try {                     uimanager.setlookandfeel(uimanager.getsystemlookandfeelclassname());                 } catch (classnotfoundexception | instantiationexception | illegalaccessexception | unsupportedlookandfeelexception ex) {                     ex.printstacktrace();                 }                  panel background = new panel();                  jframe frame = new jframe("testing");                 frame.setcontentpane(background);                 frame.setdefaultcloseoperation(jframe.exit_on_close);                 frame.add(new gui());                 frame.pack();                 frame.setlocationrelativeto(null);                 frame.setvisible(true);             }         });     }      public static class panel extends jpanel {          bufferedimage image;          public panel() {             setlayout(new borderlayout());             try {                 image = imageio.read(getclass().getresource("/testumgebung/background/battleship_main.png"));             } catch (ioexception e) {                 e.printstacktrace();             }          }          @override         public dimension getpreferredsize() {             return image == null ? super.getpreferredsize() : new dimension(image.getwidth(), image.getheight());         }          @override         public void paintcomponent(graphics g) {             super.paintcomponent(g);             g.drawimage(image, 0, 0, this);         }      }      public static class gui extends jpanel {          private mainmenupane mainmenupane;         private cardlayout cardlayout;          public gui() {              setopaque(false);              setvisible(true);             cardlayout = new cardlayout();             setlayout(cardlayout);              mainmenupane = new mainmenupane();             // other views              add(mainmenupane, "mainmenu");              cardlayout.show(this, "mainmenu");          }      }      public static class mainmenupane extends jpanel {          jbutton singleplayerbutton;         jbutton multiplayerbutton;          jlabel text;          public mainmenupane() {              setlayout(new gridbaglayout());             setopaque(false);             setbackground(color.blue);              gridbagconstraints gbc = new gridbagconstraints();             gbc.ipadx = 20;             gbc.ipady = 20;              singleplayerbutton = new jbutton("single player");              add(singleplayerbutton, gbc);              multiplayerbutton = new jbutton("multi player");              add(multiplayerbutton, gbc);         }          @override         protected void paintcomponent(graphics g) {             super.paintcomponent(g);             // faking transparency, background color             // see through             graphics2d g2d = (graphics2d) g.create();             composite old = g2d.getcomposite();             g2d.setcomposite(alphacomposite.srcover.derive(0.5f));             g2d.fillrect(0, 0, getwidth(), getheight());             g2d.setcomposite(old);         }      }  } 

Comments