JDesktopPaneスクロールバー

5224 ワード

現実JDesktopPaneの現実スクロールバーには、次の方法があります.
 
package test;

import javax.swing.*;

public class TJInternalFrame extends JFrame {
	Container container;
	JButton button;
	JDesktopPane desktop;
	JInternalFrame internalFrame;

	static int frameCount = 0;
	static final int xOffSet = 1;
	static final int yOffSet = 150;

	// 1.Constructor of the frame class.
	public TJInternalFrame() {
		// 2.Give title to the frame and get its content pane
		super("TJInternalFrame");
		container = this.getContentPane();

		// 3.Create a button and add it at the lower portion of frame;
		// also add an action listener.
		button = new JButton("Click to Create More Internal Frames");
		button.addActionListener(new ButtonListener());
		container.add(button, BorderLayout.SOUTH);

		//  :JDesktopPane !!!!!!
		// desktop = new JDesktopPane();// holds the internal frame
		// JScrollPane scrollPane = new JScrollPane();
		// scrollPane.getViewport().setView(desktop);
		//
		// desktop.setPreferredSize(new Dimension(1600, 2200)); // very
		// important
		//
		// container.add(scrollPane);// add the desktop to the main frame

		//  :JDesktopPane ! JDesktopPane JDesktop。!!!!!
		// ================================================================
		desktop = new JDesktop();
		JScrollPane scrollpane = new JScrollPane(desktop,
				JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
				JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		container.add(scrollpane);
		// ================================================================
		createInternalFrame();// create an internal frame

		// 5.Add the window listener, set the frame size, default close
		// operation and make the frame visible.
		addWindowListener(new WindowEventHandler());
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		setSize(1060, 708);
		setVisible(true);
	}

	// 6.Creates an internal frame and adds it to the desktop pane.
	// Takes care of displaying frames with overlap offsets when called
	// multiple times.
	public void createInternalFrame() {

		// 7.Use a suitable internal frame constructor.
		JInternalFrame iFrame = new JInternalFrame("Internal Frame - "
				+ frameCount, false, false, false, false);
		iFrame.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null, null,
				null, null));
		((BasicInternalFrameUI) iFrame.getUI()).setNorthPane(null);
		// 8.Set the location and size, and add it to the desktop pane.
		iFrame.setLocation(xOffSet * frameCount, yOffSet * frameCount);
		frameCount++;
		iFrame.setSize(800, 150);
		iFrame.setVisible(true);
		desktop.add(iFrame);
		// 9.Let the frame be selected.
		try {
			iFrame.setSelected(true);
		} catch (java.beans.PropertyVetoException e) {
			System.out.println("Exception while selecting an internal frame");
		}
	}

	// 10.The button(action) listener.
	class ButtonListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			createInternalFrame();
		}
	}

	// 11.The listener class to handle closing of the frame.
	class WindowEventHandler extends WindowAdapter {
		public void windowClosing(WindowEvent evt) {
			System.exit(0);
		}
	}

	// 12.The main method.
	public static void main(String[] args) {
		String lookAndFeel = UIManager.getSystemLookAndFeelClassName();
		try {
			UIManager.setLookAndFeel(lookAndFeel);

		} catch (Exception e) {
			e.printStackTrace();
		}
		TJInternalFrame frame = new TJInternalFrame();
	}
}

 
JDesktopPaneの継承クラスJDesktop
package test;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class JDesktop extends JDesktopPane
{
   public void paint(Graphics g)
   {
       super.paint(g);
       Dimension d = preferredSizeOfAllFrames();
       this.setPreferredSize(d);
       this.revalidate();
   }
 /**
  * @return  desktop ..
  */
   public Dimension preferredSizeOfAllFrames()
   {
       JInternalFrame [] array = getAllFrames();
       int maxX = 0;
       int maxY = 0;
       for (int i = 0; i < array.length; i++)
       {
           if ( array[ i ].isVisible() )
           {
               int cx;
               cx = array[i].getX();
               int x = cx + array[i].getWidth();
               if (x > maxX) maxX = x;
               int cy;
               cy = array[i].getY();
               int y = cy + array[i].getHeight();
               if (y > maxY) maxY = y;
           }
       }
       return new Dimension(maxX, maxY);
   }
}