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
nulllayouts, 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
srcever, 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 usinggetclass().getresource("/testumgebung/background/battleship_main.jpg") - you should calling
super.paintcomponentbefore 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
panelshould nothing manage background image , should not managing else, mean havingguiaddedpanelseparate step , not part ofpanels initialisation
as conceptual example...

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
Post a Comment