// JTiler - Tiled JPanel with components in subpanels import javax.swing.*; import java.awt.*; import java.awt.event.*; public class JTiler extends JPanel implements ActionListener, WindowListener { // uncomment line for ImageIcon usage // ImageIcon iiBackground; // uncomment line for Icon usage Icon iiBackground; int iiBHeight, iiBWidth; JButton jbOK = new JButton( "I'm a Button"), jb[] = new JButton[4]; JComponent jcMatch[] = new JComponent[jb.length]; JFrame myFrame = new JFrame("Panel Tiler"); JLabel jl = new JLabel( "I'm a Label" ), jlOT = new JLabel("Click to toggle Opacity:"); JPanel jpNorth = new JPanel(), jpCenter = new JPanel(), jpFSouth = new JPanel(); JTextField jtf = new JTextField("I'm some text."); public JTiler() { super( new BorderLayout() ); // background when opaque setBackground( Color.PINK.brighter() ); iiBackground = // uncomment this for Icon usage UIManager.getIcon("OptionPane.errorIcon"); // uncomment this for ImageIcon usage // This image can be found at yourJDKdir/docs/images/ // in both JDK 1.1 and 1.2. Copy it to a classloader available // directory OR change to fully qualified path OR use your own // available gif/jpeg - small, of course, to get tiled effect. // new ImageIcon( // JTiler.class.getResource( "cupHJbutton.gif" )); iiBHeight = iiBackground.getIconHeight(); iiBWidth = iiBackground.getIconWidth(); jpNorth.add( jl ); jpNorth.add( jtf ); jpCenter.add( jbOK ); // subpanels will block background if opaque jpNorth.setOpaque( false ); jpCenter.setOpaque( false ); this.add( jpNorth, BorderLayout.NORTH ); this.add( jpCenter, BorderLayout.CENTER ); jpFSouth = new JPanel(); jb[0] = new JButton("Label"); jcMatch[0] = jl; jb[1] = new JButton("North"); jcMatch[1] = jpNorth; jb[2] = new JButton("Center"); jcMatch[2] = jpCenter; jb[3] = new JButton("This"); jcMatch[3] = this; jpFSouth.add( jlOT ); for( int i = 0; i < jb.length; i++ ) { jb[i].addActionListener( this ); jpFSouth.add( jb[i] ); } myFrame.addWindowListener( this ); Container cp = myFrame.getContentPane(); cp.add( this, BorderLayout.CENTER ); cp.add( jpFSouth, BorderLayout.SOUTH ); myFrame.pack(); myFrame.show(); } // end constructor public void paintComponent(Graphics g) { Dimension dim = getSize(); int x, y; // ensure proper background handling if( isOpaque() ) { super.paintComponent( g ); } // redraw image horizontal/vertical until panel is filled for( y = 0; y < dim.height; y += iiBHeight ) { for( x = 0; x < dim.width; x += iiBWidth ) { iiBackground.paintIcon( this, g, x, y ); } } } // end paintComponent // ActionListener Implementation public void actionPerformed(ActionEvent e) { Object oSource = e.getSource(); for( int i = 0; i < jb.length; i++ ) { if( oSource == jb[i] ) { jcMatch[i].setOpaque( !jcMatch[i].isOpaque() ); repaint(); break; } // end if oSource } // end for } // end actionPerformed // Window Listener Implementation public void windowOpened(WindowEvent e) {} public void windowClosing(WindowEvent e) { myFrame.dispose(); System.exit(0); } public void windowClosed(WindowEvent e) {} public void windowIconified(WindowEvent e) {} public void windowDeiconified(WindowEvent e) {} public void windowActivated(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {} // End Window Listener Implementation public static void main(String[] args) { new JTiler(); } } // end class JTiler