Java/Swing JFC/Container
Версия от 18:01, 31 мая 2010; (обсуждение)
Содержание
- 1 Container Event Demo
- 2 Containers
- 3 Container which can transform its children
- 4 Count Components in a Container
- 5 Find Component Under Glass Pane At
- 6 Find First Component Of Type
- 7 Get All Components in a container
- 8 Get Child At Line
- 9 Get Child At Point
- 10 Get Component Index
- 11 Get Visible Child At
- 12 Get Visible Children Count
- 13 Has Visible Children
- 14 Is Only Visible Component
- 15 Is Within Parent
Container Event Demo
/* From http://java.sun.ru/docs/books/tutorial/index.html */
/*
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* -Redistribution of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* -Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of Sun Microsystems, Inc. or the names of contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
* OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN")
* AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
* AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed, licensed or intended
* for use in the design, construction, operation or maintenance of any
* nuclear facility.
*/
/*
* ContainerEventDemo.java is a 1.4 example that requires no other files.
*/
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ContainerEvent;
import java.awt.event.ContainerListener;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class ContainerEventDemo extends JPanel implements ContainerListener,
ActionListener {
JTextArea display;
JPanel buttonPanel;
JButton addButton, removeButton, clearButton;
Vector buttonList;
static final String ADD = "add";
static final String REMOVE = "remove";
static final String CLEAR = "clear";
static final String newline = "\n";
public ContainerEventDemo() {
super(new GridBagLayout());
GridBagLayout gridbag = (GridBagLayout) getLayout();
GridBagConstraints c = new GridBagConstraints();
//Initialize an empty list of buttons.
buttonList = new Vector(10, 10);
//Create all the components.
addButton = new JButton("Add a button");
addButton.setActionCommand(ADD);
addButton.addActionListener(this);
removeButton = new JButton("Remove a button");
removeButton.setActionCommand(REMOVE);
removeButton.addActionListener(this);
buttonPanel = new JPanel(new GridLayout(1, 1));
buttonPanel.setPreferredSize(new Dimension(200, 75));
buttonPanel.addContainerListener(this);
display = new JTextArea();
display.setEditable(false);
JScrollPane scrollPane = new JScrollPane(display);
scrollPane.setPreferredSize(new Dimension(200, 75));
clearButton = new JButton("Clear text area");
clearButton.setActionCommand(CLEAR);
clearButton.addActionListener(this);
c.fill = GridBagConstraints.BOTH; //Fill entire cell.
c.weighty = 1.0; //Button area and message area have equal height.
c.gridwidth = GridBagConstraints.REMAINDER; //end of row
gridbag.setConstraints(scrollPane, c);
add(scrollPane);
c.weighty = 0.0;
gridbag.setConstraints(clearButton, c);
add(clearButton);
c.weightx = 1.0; //Add/remove buttons have equal width.
c.gridwidth = 1; //NOT end of row
gridbag.setConstraints(addButton, c);
add(addButton);
c.gridwidth = GridBagConstraints.REMAINDER; //end of row
gridbag.setConstraints(removeButton, c);
add(removeButton);
c.weighty = 1.0; //Button area and message area have equal height.
gridbag.setConstraints(buttonPanel, c);
add(buttonPanel);
setPreferredSize(new Dimension(400, 400));
setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
}
public void componentAdded(ContainerEvent e) {
displayMessage(" added to ", e);
}
public void componentRemoved(ContainerEvent e) {
displayMessage(" removed from ", e);
}
void displayMessage(String action, ContainerEvent e) {
display.append(((JButton) e.getChild()).getText() + " was" + action
+ e.getContainer().getClass().getName() + newline);
display.setCaretPosition(display.getDocument().getLength());
}
/*
* This could have been implemented as two or three classes or objects, for
* clarity.
*/
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if (ADD.equals(command)) {
JButton newButton = new JButton("JButton #"
+ (buttonList.size() + 1));
buttonList.addElement(newButton);
buttonPanel.add(newButton);
buttonPanel.revalidate(); //Make the button show up.
} else if (REMOVE.equals(command)) {
int lastIndex = buttonList.size() - 1;
try {
JButton nixedButton = (JButton) buttonList.elementAt(lastIndex);
buttonPanel.remove(nixedButton);
buttonList.removeElementAt(lastIndex);
buttonPanel.revalidate(); //Make the button disappear.
buttonPanel.repaint(); //Make the button disappear.
} catch (ArrayIndexOutOfBoundsException exc) {
}
} else if (CLEAR.equals(command)) {
display.setText("");
}
}
/**
* Create the GUI and show it. For thread safety, this method should be
* invoked from the event-dispatching thread.
*/
private static void createAndShowGUI() {
//Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);
//Create and set up the window.
JFrame frame = new JFrame("ContainerEventDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create and set up the content pane.
JComponent newContentPane = new ContainerEventDemo();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
//Display the window.
frame.pack();
frame.setVisible(true);
}
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() {
createAndShowGUI();
}
});
}
}
Containers
/*
* Copyright (c) 2000 David Flanagan. All rights reserved.
* This code is from the book Java Examples in a Nutshell, 2nd Edition.
* It is provided AS-IS, WITHOUT ANY WARRANTY either expressed or implied.
* You may study, use, and modify it for any non-commercial purpose.
* You may distribute it non-commercially as long as you retain this notice.
* For a commercial use license, or to purchase the book (recommended),
* visit http://www.davidflanagan.ru/javaexamples2.
*/
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
* A component subclass that demonstrates nested containers and components. It
* creates the hierarchy shown below, and uses different colors to distinguish
* the different nesting levels of the containers
*
* Containers---panel1----button1 | |---panel2----button2 | |
* |----panel3----button3 | |------panel4----button4 | |----button5 |---button6
*/
public class Containers extends JPanel {
public Containers() {
this.setBackground(Color.white); // This component is white
this.setFont(new Font("Dialog", Font.BOLD, 24));
JPanel p1 = new JPanel();
p1.setBackground(new Color(200, 200, 200)); // Panel1 is darker
this.add(p1); // p1 is contained by this component
p1.add(new JButton("#1")); // Button 1 is contained in p1
JPanel p2 = new JPanel();
p2.setBackground(new Color(150, 150, 150)); // p2 is darker than p2
p1.add(p2); // p2 is contained in p1
p2.add(new JButton("#2")); // Button 2 is contained in p2
JPanel p3 = new JPanel();
p3.setBackground(new Color(100, 100, 100)); // p3 is darker than p2
p2.add(p3); // p3 is contained in p2
p3.add(new JButton("#3")); // Button 3 is contained in p3
JPanel p4 = new JPanel();
p4.setBackground(new Color(150, 150, 150)); // p4 is darker than p1
p1.add(p4); // p4 is contained in p1
p4.add(new JButton("#4")); // Button4 is contained in p4
p4.add(new JButton("#5")); // Button5 is also contained in p4
this.add(new JButton("#6")); // Button6 is contained in this component
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.getContentPane().add(new Containers(), BorderLayout.CENTER);
// Finally, set the size of the main window, and pop it up.
frame.setSize(600, 400);
frame.setVisible(true);
}
}
Container which can transform its children
/*
* Copyright 2006 Sun Microsystems, Inc., 4150 Network Circle,
* Santa Clara, California 95054, U.S.A. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;
import java.awt.geom.NoninvertibleTransformException;
import java.awt.geom.Point2D;
import java.util.Map;
import java.util.HashMap;
/**
* Container which can transform its children, for example:<br>
* <pre>
* JButton button = new JButton("Hello");
* JXTransformer t = new JXTransformer(button);
* t.rotate(Math.PI/2);</pre>
*
* <strong>Note:</strong>
* This component was designed to transform simple components
* like JButton, JLabel etc.
*
* @author Alexander Potochkin
*
* https://swinghelper.dev.java.net/
* http://weblogs.java.net/blog/alexfromsun/
*/
public class JXTransformer extends JPanel {
private Component glassPane = new MagicGlassPane();
private Component view;
private Rectangle visibleRect;
private Map<?,?> renderingHints;
private AffineTransform at;
public JXTransformer() {
this(null);
}
public JXTransformer(JComponent view) {
this(view, new AffineTransform());
}
public JXTransformer(JComponent view, AffineTransform at) {
super(null);
setTransform(at);
super.addImpl(glassPane, null, 0);
setView(view);
Handler handler = new Handler();
addHierarchyBoundsListener(handler);
addComponentListener(handler);
}
public Component getView() {
return view;
}
public void setView(Component view) {
if (getView() != null) {
super.remove(getView());
}
if (view != null) {
super.addImpl(view, null, 1);
}
this.view = view;
doLayout();
revalidate();
repaint();
}
public Map<?,?> getRenderingHints() {
if (renderingHints == null) {
return null;
}
return new HashMap<Object,Object>(renderingHints);
}
public void setRenderingHints(Map<?,?> renderingHints) {
if (renderingHints == null) {
this.renderingHints = null;
} else {
this.renderingHints = new HashMap<Object,Object>(renderingHints);
}
repaint();
}
protected void addImpl(Component comp, Object constraints, int index) {
setView(comp);
}
public void remove(int index) {
Component c = getComponent(index);
if (c == view) {
view = null;
super.remove(index);
} else if (c == glassPane) {
throw new IllegalArgumentException("GlassPane can"t be removed");
} else {
throw new AssertionError("Unknown component with index " + index);
}
}
public void removeAll() {
remove(view);
}
//This is important
public boolean isOptimizedDrawingEnabled() {
return false;
}
public void setLayout(LayoutManager mgr) {
if (mgr != null) {
throw new IllegalArgumentException("Only null layout is supported");
}
super.setLayout(mgr);
}
public void doLayout() {
if (view != null) {
view.setSize(view.getPreferredSize());
visibleRect = getVisibleRect();
view.setLocation(visibleRect.x, visibleRect.y);
}
glassPane.setLocation(0, 0);
glassPane.setSize(getWidth(), getHeight());
}
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
Dimension size = getTransformedSize().getSize();
Insets insets = getInsets();
size.width += insets.left + insets.right;
size.height += insets.top + insets.bottom;
return size;
}
private Rectangle getTransformedSize() {
if (view != null) {
Dimension viewSize = view.getSize();
Rectangle viewRect = new Rectangle(viewSize);
return at.createTransformedShape(viewRect).getBounds();
}
return new Rectangle(super.getPreferredSize());
}
public void paint(Graphics g) {
//repaint the whole transformer in case the view component was repainted
Rectangle clipBounds = g.getClipBounds();
if (clipBounds != null && !clipBounds.equals(visibleRect)) {
repaint();
}
//clear the background
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
if (view != null && at.getDeterminant() != 0) {
Graphics2D g2 = (Graphics2D) g.create();
Insets insets = getInsets();
Rectangle bounds = getBounds();
//don"t forget about insets
bounds.x += insets.left;
bounds.y += insets.top;
bounds.width -= insets.left + insets.right;
bounds.height -= insets.top + insets.bottom;
double centerX1 = bounds.getCenterX();
double centerY1 = bounds.getCenterY();
Rectangle tb = getTransformedSize();
double centerX2 = tb.getCenterX();
double centerY2 = tb.getCenterY();
//set antialiasing by default
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
if (renderingHints != null) {
g2.addRenderingHints(renderingHints);
}
//translate it to the center of the view component again
double tx = centerX1 - centerX2 - getX();
double ty = centerY1 - centerY2 - getY();
g2.translate((int) tx, (int) ty);
g2.transform(at);
view.paint(g2);
g2.dispose();
}
//paint the border
paintBorder(g);
}
private class MagicGlassPane extends JPanel {
private Component mouseEnteredComponent;
private Component mouseDraggedComponent;
private Component mouseCurrentComponent;
public MagicGlassPane() {
super(null);
setOpaque(false);
enableEvents(AWTEvent.MOUSE_EVENT_MASK);
enableEvents(AWTEvent.MOUSE_MOTION_EVENT_MASK);
enableEvents(AWTEvent.MOUSE_WHEEL_EVENT_MASK);
ToolTipManager.sharedInstance().registerComponent(this);
}
private MouseEvent transformMouseEvent(MouseEvent event) {
if (event == null) {
throw new IllegalArgumentException("MouseEvent is null");
}
MouseEvent newEvent;
if (event instanceof MouseWheelEvent) {
MouseWheelEvent mouseWheelEvent = (MouseWheelEvent) event;
newEvent = new MouseWheelEvent(mouseWheelEvent.getComponent(), mouseWheelEvent.getID(),
mouseWheelEvent.getWhen(), mouseWheelEvent.getModifiers(),
mouseWheelEvent.getX(), mouseWheelEvent.getY(),
mouseWheelEvent.getClickCount(), mouseWheelEvent.isPopupTrigger(),
mouseWheelEvent.getScrollType(), mouseWheelEvent.getScrollAmount(),
mouseWheelEvent.getWheelRotation());
} else {
newEvent = new MouseEvent(event.getComponent(), event.getID(),
event.getWhen(), event.getModifiers(),
event.getX(), event.getY(),
event.getClickCount(), event.isPopupTrigger(), event.getButton());
}
if (view != null && at.getDeterminant() != 0) {
Rectangle viewBounds = getTransformedSize();
Insets insets = JXTransformer.this.getInsets();
int xgap = (getWidth() - (viewBounds.width + insets.left + insets.right)) / 2;
int ygap = (getHeight() - (viewBounds.height + insets.top + insets.bottom)) / 2;
double x = newEvent.getX() + viewBounds.getX() - insets.left;
double y = newEvent.getY() + viewBounds.getY() - insets.top;
Point2D p = new Point2D.Double(x - xgap, y - ygap);
Point2D tp;
try {
tp = at.inverseTransform(p, null);
} catch (NoninvertibleTransformException ex) {
//can"t happen, we check it before
throw new AssertionError("NoninvertibleTransformException");
}
//Use transformed coordinates to get the current component
mouseCurrentComponent =
SwingUtilities.getDeepestComponentAt(view, (int) tp.getX(), (int) tp.getY());
if (mouseCurrentComponent == null) {
mouseCurrentComponent = JXTransformer.this;
}
Component tempComponent = mouseCurrentComponent;
if (mouseDraggedComponent != null) {
tempComponent = mouseDraggedComponent;
}
Point point = SwingUtilities.convertPoint(view, (int) tp.getX(), (int) tp.getY(), tempComponent);
newEvent.setSource(tempComponent);
newEvent.translatePoint(point.x - event.getX(), point.y - event.getY());
}
return newEvent;
}
protected void processMouseEvent(MouseEvent e) {
MouseEvent transformedEvent = transformMouseEvent(e);
switch (e.getID()) {
case MouseEvent.MOUSE_ENTERED:
if (mouseDraggedComponent == null || mouseCurrentComponent == mouseDraggedComponent) {
dispatchMouseEvent(transformedEvent);
}
break;
case MouseEvent.MOUSE_EXITED:
if (mouseEnteredComponent != null) {
dispatchMouseEvent(createEnterExitEvent(mouseEnteredComponent, MouseEvent.MOUSE_EXITED, e));
mouseEnteredComponent = null;
}
break;
case MouseEvent.MOUSE_RELEASED:
if (mouseDraggedComponent != null && e.getButton() == MouseEvent.BUTTON1) {
transformedEvent.setSource(mouseDraggedComponent);
mouseDraggedComponent = null;
}
dispatchMouseEvent(transformedEvent);
break;
default:
dispatchMouseEvent(transformedEvent);
}
super.processMouseEvent(e);
}
private void dispatchMouseEvent(MouseEvent event) {
MouseListener[] mouseListeners =
event.getComponent().getMouseListeners();
for (MouseListener listener : mouseListeners) {
//skip all ToolTipManager"s related listeners
if (!listener.getClass().getName().startsWith("javax.swing.ToolTipManager")) {
switch (event.getID()) {
case MouseEvent.MOUSE_PRESSED:
listener.mousePressed(event);
break;
case MouseEvent.MOUSE_RELEASED:
listener.mouseReleased(event);
break;
case MouseEvent.MOUSE_CLICKED:
listener.mouseClicked(event);
break;
case MouseEvent.MOUSE_EXITED:
listener.mouseExited(event);
break;
case MouseEvent.MOUSE_ENTERED:
listener.mouseEntered(event);
break;
default:
throw new AssertionError();
}
}
}
}
protected void processMouseMotionEvent(MouseEvent e) {
MouseEvent transformedEvent = transformMouseEvent(e);
if (mouseEnteredComponent == null) {
mouseEnteredComponent = mouseCurrentComponent;
}
switch (e.getID()) {
case MouseEvent.MOUSE_MOVED:
if (mouseCurrentComponent != mouseEnteredComponent) {
dispatchMouseEvent(createEnterExitEvent(mouseEnteredComponent, MouseEvent.MOUSE_EXITED, e));
dispatchMouseEvent(createEnterExitEvent(mouseCurrentComponent, MouseEvent.MOUSE_ENTERED, e));
}
break;
case MouseEvent.MOUSE_DRAGGED:
if (mouseDraggedComponent == null) {
mouseDraggedComponent = mouseEnteredComponent;
}
if (mouseEnteredComponent == mouseDraggedComponent && mouseCurrentComponent != mouseDraggedComponent) {
dispatchMouseEvent(createEnterExitEvent(mouseDraggedComponent, MouseEvent.MOUSE_EXITED, e));
} else if (mouseEnteredComponent != mouseDraggedComponent && mouseCurrentComponent == mouseDraggedComponent) {
dispatchMouseEvent(createEnterExitEvent(mouseDraggedComponent, MouseEvent.MOUSE_ENTERED, e));
}
if (mouseDraggedComponent != null) {
transformedEvent.setSource(mouseDraggedComponent);
}
break;
}
mouseEnteredComponent = mouseCurrentComponent;
//dispatch MouseMotionEvent
MouseMotionListener[] mouseMotionListeners =
transformedEvent.getComponent().getMouseMotionListeners();
for (MouseMotionListener listener : mouseMotionListeners) {
//skip all ToolTipManager"s related listeners
if (!listener.getClass().getName().startsWith("javax.swing.ToolTipManager")) {
switch (transformedEvent.getID()) {
case MouseEvent.MOUSE_MOVED:
listener.mouseMoved(transformedEvent);
break;
case MouseEvent.MOUSE_DRAGGED:
listener.mouseDragged(transformedEvent);
break;
default:
throw new AssertionError();
}
}
}
super.processMouseMotionEvent(e);
}
protected void processMouseWheelEvent(MouseWheelEvent e) {
MouseWheelEvent transformedEvent = (MouseWheelEvent) transformMouseEvent(e);
MouseWheelListener[] mouseWheelListeners =
transformedEvent.getComponent().getMouseWheelListeners();
for (MouseWheelListener listener : mouseWheelListeners) {
listener.mouseWheelMoved(transformedEvent);
}
super.processMouseWheelEvent(e);
}
public String getToolTipText(MouseEvent event) {
if (mouseEnteredComponent instanceof JComponent) {
return ((JComponent) mouseEnteredComponent).getToolTipText();
}
return null;
}
private MouseEvent createEnterExitEvent(Component c, int eventId, MouseEvent mouseEvent) {
return new MouseEvent(c, eventId, mouseEvent.getWhen(), 0,
mouseEvent.getX(), mouseEvent.getY(), 0,
false, MouseEvent.NOBUTTON);
}
public String toString() {
return "GlassPane";
}
}
/**
* This class helps view component to be in the visible area;
* this is important when transformer is inside JScrollPane
*/
private class Handler extends ComponentAdapter implements HierarchyBoundsListener {
public void componentMoved(ComponentEvent e) {
update();
}
public void ancestorMoved(HierarchyEvent e) {
update();
}
public void ancestorResized(HierarchyEvent e) {
update();
}
private void update() {
if (!getVisibleRect().equals(visibleRect)) {
revalidate();
}
}
}
/**
* Never returns null
*/
public AffineTransform getTransform() {
return new AffineTransform(at);
}
public void setTransform(AffineTransform at) {
if (at == null) {
throw new IllegalArgumentException("AffineTransform is null");
}
this.at = new AffineTransform(at);
revalidate();
repaint();
}
public void rotate(double theta) {
AffineTransform transform = getTransform();
transform.rotate(theta);
setTransform(transform);
}
public void scale(double sx, double sy) {
AffineTransform transform = getTransform();
transform.scale(sx, sy);
setTransform(transform);
}
public void shear(double sx, double sy) {
AffineTransform transform = getTransform();
transform.shear(sx, sy);
setTransform(transform);
}
}
/////////////
/*
* Copyright 2006 Sun Microsystems, Inc., 4150 Network Circle,
* Santa Clara, California 95054, U.S.A. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
import javax.swing.*;
import javax.swing.border.TitledBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
/*
* @author Alexander Potochkin
*
* https://swinghelper.dev.java.net/
* http://weblogs.java.net/blog/alexfromsun/
*/
class TransformerDemo extends JFrame implements ChangeListener {
private List<JXTransformer> transformers = new ArrayList<JXTransformer>();
private JSlider rotationSlider;
private JSlider scalingSlider;
private JSlider shearingSlider;
public TransformerDemo() {
super("Transformer demo");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JMenuBar bar = new JMenuBar();
JMenu lafMenu = new JMenu("LaF");
JMenuItem winLaf = new JMenuItem("Windows LaF");
lafMenu.add(winLaf);
winLaf.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setLaf("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
}
});
JMenuItem motifLaf = new JMenuItem("Motif LaF");
lafMenu.add(motifLaf);
motifLaf.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setLaf("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
}
});
bar.add(lafMenu);
JMenuItem metalLaf = new JMenuItem("Metal LaF");
lafMenu.add(metalLaf);
metalLaf.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setLaf("javax.swing.plaf.metal.MetalLookAndFeel");
}
});
JMenu settingsMenu = new JMenu("Settings");
settingsMenu.setMnemonic(KeyEvent.VK_S);
JMenuItem item = new JMenuItem("Reset sliders", KeyEvent.VK_R);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, InputEvent.ALT_MASK));
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
rotationSlider.setValue(0);
scalingSlider.setValue(100);
shearingSlider.setValue(0);
}
});
settingsMenu.add(item);
bar.add(settingsMenu);
setJMenuBar(bar);
JPanel panel = new JPanel(new BorderLayout());
panel.add(createDemoPanel());
panel.add(createStressTestPanel(), BorderLayout.EAST);
add(new JScrollPane(panel));
add(new JScrollPane(createToolPanel()), BorderLayout.SOUTH);
pack();
}
private void setLaf(String laf) {
try {
UIManager.setLookAndFeel(laf);
SwingUtilities.updateComponentTreeUI(this);
} catch (Exception e) {
e.printStackTrace();
}
for (JXTransformer t : transformers) {
t.revalidate();
t.repaint();
}
}
private JPanel createStressTestPanel() {
JPanel panel = new JPanel();
TitledBorder titledBorder = BorderFactory.createTitledBorder("Stress test (with tooltips)");
titledBorder.setTitleJustification(TitledBorder.CENTER);
panel.setBorder(titledBorder);
JButton lowerButton = new JButton("Button");
lowerButton.setLayout(new FlowLayout());
lowerButton.setToolTipText("Lower button");
JButton middleButton = new JButton();
middleButton.setToolTipText("Middle button");
middleButton.setLayout(new FlowLayout());
lowerButton.add(middleButton);
JButton upperButton = new JButton("Upper button");
upperButton.setToolTipText("Upper button");
middleButton.add(upperButton);
panel.add(createTransformer(lowerButton));
return panel;
}
private JPanel createDemoPanel() {
JPanel buttonPanel = new JPanel(new GridLayout(3, 2));
TitledBorder titledBorder = BorderFactory.createTitledBorder("Try three sliders below !");
Font titleFont = titledBorder.getTitleFont();
titledBorder.setTitleFont(titleFont.deriveFont(titleFont.getSize2D() + 10));
titledBorder.setTitleJustification(TitledBorder.CENTER);
buttonPanel.setBorder(titledBorder);
JButton b = new JButton("JButton");
b.setPreferredSize(new Dimension(100,50));
buttonPanel.add(createTransformer(b));
Vector<String> v = new Vector<String>();
v.add("One");
v.add("Two");
v.add("Three");
JList list = new JList(v);
buttonPanel.add(createTransformer(list));
buttonPanel.add(createTransformer(new JCheckBox("JCheckBox")));
JSlider slider = new JSlider(0, 100);
slider.setLabelTable(slider.createStandardLabels(25, 0));
slider.setPaintLabels(true);
slider.setPaintTicks(true);
slider.setMajorTickSpacing(10);
buttonPanel.add(createTransformer(slider));
buttonPanel.add(createTransformer(new JRadioButton("JRadioButton")));
final JLabel label = new JLabel("JLabel");
label.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
Font font = label.getFont();
label.setFont(font.deriveFont(font.getSize2D() + 10));
}
public void mouseExited(MouseEvent e) {
Font font = label.getFont();
label.setFont(font.deriveFont(font.getSize2D() - 10));
}
});
buttonPanel.add(createTransformer(label));
return buttonPanel;
}
private JXTransformer createTransformer(JComponent c) {
JXTransformer t = new JXTransformer(c);
transformers.add(t);
return t;
}
private JPanel createToolPanel() {
JPanel panel = new JPanel(new GridLayout(1, 0));
rotationSlider = new JSlider(-180, 180, 0);
rotationSlider.setLabelTable(rotationSlider.createStandardLabels(90, -180));
rotationSlider.setPaintLabels(true);
rotationSlider.setPaintTicks(true);
rotationSlider.setMajorTickSpacing(45);
rotationSlider.addChangeListener(this);
rotationSlider.setBorder(BorderFactory.createTitledBorder("Rotate"));
panel.add(rotationSlider);
shearingSlider = new JSlider(-10, 10, 0);
shearingSlider.setLabelTable(shearingSlider.createStandardLabels(5, -10));
shearingSlider.setPaintLabels(true);
shearingSlider.setPaintTicks(true);
shearingSlider.setMajorTickSpacing(2);
shearingSlider.addChangeListener(this);
shearingSlider.setBorder(BorderFactory.createTitledBorder("Shear"));
panel.add(shearingSlider);
scalingSlider = new JSlider(50, 150, 100);
scalingSlider.setLabelTable(scalingSlider.createStandardLabels(25, 50));
scalingSlider.setPaintLabels(true);
scalingSlider.setPaintTicks(true);
scalingSlider.setMajorTickSpacing(10);
scalingSlider.addChangeListener(this);
scalingSlider.setBorder(BorderFactory.createTitledBorder("Scale"));
panel.add(scalingSlider);
return panel;
}
public void stateChanged(ChangeEvent e) {
AffineTransform at = new AffineTransform();
at.rotate(rotationSlider.getValue() * Math.PI / 180);
double scale = scalingSlider.getValue() / 100.0;
at.scale(scale, scale);
double shear = shearingSlider.getValue() / 10.0;
at.shear(shear, 0);
for (JXTransformer t : transformers) {
t.setTransform(at);
}
}
public static void main(String[] args) {
TransformerDemo demo = new TransformerDemo();
demo.setSize(800, 600);
demo.setVisible(true);
}
}
Count Components in a Container
import java.awt.ruponent;
import java.awt.Container;
import java.awt.Point;
import java.util.ArrayList;
import javax.swing.RootPaneContainer;
import javax.swing.SwingUtilities;
/**
* Copyright (C) 2004 NNL Technology AB
* Visit www.infonode.net for information about InfoNode(R)
* products and how to contact NNL Technology AB.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*/
// $Id: ComponentUtil.java,v 1.25 2005/12/04 13:46:04 jesper Exp $
public class Util {
public static int countComponents(Container c) {
int num = 1;
for (int i = 0; i < c.getComponentCount(); i++) {
Component comp = c.getComponent(i);
if (comp instanceof Container)
num += countComponents((Container) comp);
else
num++;
}
return num;
}
}
Find Component Under Glass Pane At
import java.awt.ruponent;
import java.awt.Container;
import java.awt.Point;
import java.util.ArrayList;
import javax.swing.RootPaneContainer;
import javax.swing.SwingUtilities;
/**
* Copyright (C) 2004 NNL Technology AB
* Visit www.infonode.net for information about InfoNode(R)
* products and how to contact NNL Technology AB.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*/
// $Id: ComponentUtil.java,v 1.25 2005/12/04 13:46:04 jesper Exp $
public class Util {
public static Component findComponentUnderGlassPaneAt(Point p, Component top) {
Component c = null;
if (top.isShowing()) {
if (top instanceof RootPaneContainer)
c =
((RootPaneContainer) top).getLayeredPane().findComponentAt(
SwingUtilities.convertPoint(top, p, ((RootPaneContainer) top).getLayeredPane()));
else
c = ((Container) top).findComponentAt(p);
}
return c;
}
}
Find First Component Of Type
import java.applet.Applet;
import java.awt.ruponent;
import java.awt.Container;
import java.awt.Point;
import java.awt.Window;
import java.util.ArrayList;
import javax.swing.RootPaneContainer;
import javax.swing.SwingUtilities;
/**
* Copyright (C) 2004 NNL Technology AB
* Visit www.infonode.net for information about InfoNode(R)
* products and how to contact NNL Technology AB.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*/
// $Id: ComponentUtil.java,v 1.25 2005/12/04 13:46:04 jesper Exp $
public class Util {
public static Component findFirstComponentOfType(Component comp, Class c) {
if (c.isInstance(comp))
return comp;
if (comp instanceof Container) {
Container container = (Container) comp;
for (int i = 0; i < container.getComponentCount(); i++) {
Component comp2 = findFirstComponentOfType(container.getComponent(i), c);
if (comp2 != null)
return comp2;
}
}
return null;
}
}
Get All Components in a container
/*
* $Id: WindowUtils.java,v 1.16 2009/05/25 16:37:52 kschaefe Exp $
*
* Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
* Santa Clara, California 95054, U.S.A. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
import java.awt.ruponent;
import java.awt.Container;
import java.util.ArrayList;
import java.util.List;
/**
* Encapsulates various utilities for windows (ie: <code>Frame</code> and
* <code>Dialog</code> objects and descendants, in particular).
*
* @author Richard Bair
*/
public class Utils {
public static List<Component> getAllComponents(final Container c) {
Component[] comps = c.getComponents();
List<Component> compList = new ArrayList<Component>();
for (Component comp : comps) {
compList.add(comp);
if (comp instanceof Container) {
compList.addAll(getAllComponents((Container) comp));
}
}
return compList;
}
}
Get Child At Line
import java.awt.ruponent;
import java.awt.Container;
import java.awt.Point;
/**
* Copyright (C) 2004 NNL Technology AB
* Visit www.infonode.net for information about InfoNode(R)
* products and how to contact NNL Technology AB.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*/
// $Id: ComponentUtil.java,v 1.25 2005/12/04 13:46:04 jesper Exp $
public class Util {
public static final Component getChildAtLine(Container container, Point p, boolean horizontal) {
if (horizontal) {
for (int i = 0; i < container.getComponentCount(); i++) {
Component c = container.getComponent(i);
if (p.x >= c.getX() && p.x < c.getX() + c.getWidth())
return c;
}
} else {
for (int i = 0; i < container.getComponentCount(); i++) {
Component c = container.getComponent(i);
if (p.y >= c.getY() && p.y < c.getY() + c.getHeight())
return c;
}
}
return null;
}
}
Get Child At Point
import java.awt.ruponent;
import java.awt.Container;
import java.awt.Point;
public class Util{
public static final Component getChildAt(Container container, Point p) {
Component c = container.getComponentAt(p);
return c == null || c.getParent() != container ? null : c;
}
}
Get Component Index
import java.awt.ruponent;
import java.awt.Container;
import java.awt.Point;
import java.util.ArrayList;
/**
* Copyright (C) 2004 NNL Technology AB
* Visit www.infonode.net for information about InfoNode(R)
* products and how to contact NNL Technology AB.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*/
// $Id: ComponentUtil.java,v 1.25 2005/12/04 13:46:04 jesper Exp $
public class Util {
public static final int getComponentIndex(Component component) {
if (component != null && component.getParent() != null) {
Container c = component.getParent();
for (int i = 0; i < c.getComponentCount(); i++) {
if (c.getComponent(i) == component)
return i;
}
}
return -1;
}
public static void getComponentTreePosition(Component c, ArrayList pos) {
if (c.getParent() == null) {
return;
}
getComponentTreePosition(c.getParent(), pos);
pos.add(new Integer(c.getParent().getComponentCount() - getComponentIndex(c)));
}
}
Get Visible Child At
import java.awt.ruponent;
import java.awt.Container;
import java.awt.Point;
public class Util{
public static final Component getVisibleChildAt(Container container, Point p) {
for (int i = 0; i < container.getComponentCount(); i++) {
Component c = container.getComponent(i);
if (c.isVisible() && c.contains(p.x - c.getX(), p.y - c.getY()))
return c;
}
return null;
}
}
Get Visible Children Count
import java.awt.ruponent;
import java.awt.Container;
import java.awt.Point;
import java.util.ArrayList;
import javax.swing.RootPaneContainer;
import javax.swing.SwingUtilities;
/**
* Copyright (C) 2004 NNL Technology AB
* Visit www.infonode.net for information about InfoNode(R)
* products and how to contact NNL Technology AB.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*/
// $Id: ComponentUtil.java,v 1.25 2005/12/04 13:46:04 jesper Exp $
public class Util {
public static int getVisibleChildrenCount(Component c) {
if (c == null || !(c instanceof Container))
return 0;
int count = 0;
Container container = (Container) c;
for (int i = 0; i < container.getComponentCount(); i++)
if (container.getComponent(i).isVisible())
count++;
return count;
}
}
Has Visible Children
import java.awt.ruponent;
import java.awt.Container;
import java.awt.Point;
import java.util.ArrayList;
import javax.swing.RootPaneContainer;
import javax.swing.SwingUtilities;
/**
* Copyright (C) 2004 NNL Technology AB
* Visit www.infonode.net for information about InfoNode(R)
* products and how to contact NNL Technology AB.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*/
// $Id: ComponentUtil.java,v 1.25 2005/12/04 13:46:04 jesper Exp $
public class Util {
public static boolean hasVisibleChildren(Component c) {
return getVisibleChildrenCount(c) > 0;
}
public static boolean isOnlyVisibleComponent(Component c) {
return c != null && c.isVisible() && getVisibleChildrenCount(c.getParent()) == 1;
}
public static boolean isOnlyVisibleComponents(Component[] c) {
if (c != null && c.length > 0) {
boolean visible = getVisibleChildrenCount(c[0].getParent()) == c.length;
if (visible)
for (int i = 0; i < c.length; i++)
visible = visible && c[i].isVisible();
return visible;
}
return false;
}
public static int getVisibleChildrenCount(Component c) {
if (c == null || !(c instanceof Container))
return 0;
int count = 0;
Container container = (Container) c;
for (int i = 0; i < container.getComponentCount(); i++)
if (container.getComponent(i).isVisible())
count++;
return count;
}
}
Is Only Visible Component
import java.awt.ruponent;
import java.awt.Container;
import java.awt.Point;
import java.util.ArrayList;
import javax.swing.RootPaneContainer;
import javax.swing.SwingUtilities;
/**
* Copyright (C) 2004 NNL Technology AB
* Visit www.infonode.net for information about InfoNode(R)
* products and how to contact NNL Technology AB.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*/
// $Id: ComponentUtil.java,v 1.25 2005/12/04 13:46:04 jesper Exp $
public class Util {
public static boolean hasVisibleChildren(Component c) {
return getVisibleChildrenCount(c) > 0;
}
public static boolean isOnlyVisibleComponent(Component c) {
return c != null && c.isVisible() && getVisibleChildrenCount(c.getParent()) == 1;
}
public static boolean isOnlyVisibleComponents(Component[] c) {
if (c != null && c.length > 0) {
boolean visible = getVisibleChildrenCount(c[0].getParent()) == c.length;
if (visible)
for (int i = 0; i < c.length; i++)
visible = visible && c[i].isVisible();
return visible;
}
return false;
}
public static int getVisibleChildrenCount(Component c) {
if (c == null || !(c instanceof Container))
return 0;
int count = 0;
Container container = (Container) c;
for (int i = 0; i < container.getComponentCount(); i++)
if (container.getComponent(i).isVisible())
count++;
return count;
}
}
Is Within Parent
/*
* Copyright (C) 2001-2004 Colin Bell
* colbell@users.sourceforge.net
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
import java.awt.ruponent;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Frame;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.geom.Rectangle2D;
import java.beans.PropertyVetoException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.SwingUtilities;
/**
* Common GUI utilities accessed via static methods.
*
* @author
*/
public class GUIUtils {
public static boolean isWithinParent(Component wind) {
if (wind == null) {
throw new IllegalArgumentException("Null Component passed");
}
Rectangle windowBounds = wind.getBounds();
Component parent = wind.getParent();
Rectangle parentRect = null;
if (parent != null) {
parentRect = new Rectangle(parent.getSize());
} else {
// parentRect = new
// Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
parentRect = getScreenBoundsFor(windowBounds);
}
// if (windowBounds.x > (parentRect.width - 20)
// || windowBounds.y > (parentRect.height - 20)
// || (windowBounds.x + windowBounds.width) < 20
// || (windowBounds.y + windowBounds.height) < 20)
// {
// return false;
// }
if (windowBounds.x < (parentRect.x - 20) || windowBounds.y < (parentRect.y - 20)) {
return false;
}
return true;
}
public static Rectangle getScreenBoundsFor(Rectangle rc) {
final GraphicsDevice[] gds = GraphicsEnvironment.getLocalGraphicsEnvironment()
.getScreenDevices();
final List<GraphicsConfiguration> configs = new ArrayList<GraphicsConfiguration>();
for (int i = 0; i < gds.length; i++) {
GraphicsConfiguration gc = gds[i].getDefaultConfiguration();
if (rc.intersects(gc.getBounds())) {
configs.add(gc);
}
}
GraphicsConfiguration selected = null;
if (configs.size() > 0) {
for (Iterator<GraphicsConfiguration> it = configs.iterator(); it.hasNext();) {
GraphicsConfiguration gcc = it.next();
if (selected == null)
selected = gcc;
else {
if (gcc.getBounds().contains(rc.x + 20, rc.y + 20)) {
selected = gcc;
break;
}
}
}
} else {
selected = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice()
.getDefaultConfiguration();
}
int x = selected.getBounds().x;
int y = selected.getBounds().y;
int w = selected.getBounds().width;
int h = selected.getBounds().height;
return new Rectangle(x, y, w, h);
}
}