Java Tutorial/Swing/JLayeredPane

Материал из Java эксперт
Перейти к: навигация, поиск

Implement buttons at different layers

import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
public class Main extends JFrame {
  public Main() {
    setSize(200, 150);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    JLayeredPane lp = getLayeredPane();
    JButton top = new JButton();
    top.setBackground(Color.white);
    top.setBounds(20, 20, 50, 50);
    JButton middle = new JButton();
    middle.setBackground(Color.gray);
    middle.setBounds(40, 40, 50, 50);
    JButton bottom = new JButton();
    bottom.setBackground(Color.black);
    bottom.setBounds(60, 60, 50, 50);
    lp.add(middle, new Integer(2));
    lp.add(top, new Integer(3));
    lp.add(bottom, new Integer(1));
    
    setVisible(true);
  }
  public static void main(String[] args) {
    new Main();
    
  }
}





JLayeredPane Layer Constants

ConstantDescriptionFRAME_CONTENT_LAYERLevel -30,000 for holding the menu bar and content pane; not normally used by developersDEFAULT_LAYERLevel 0 for the normal component levelPALETTE_LAYERLevel 100 for holding floating toolbarsMODAL_LAYERLevel 200 for holding pop-up dialog boxes, on top of palettes, and below pop-upsPOPUP_LAYERLevel 300 for holding pop-up menus and tooltipsDRAG_LAYERLevel 400 for ensuring that dragged objects remain on top


Moves an image of Duke around within a layered pane in response to mouse motion events.

/*
 *
 * Copyright (c) 1998 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
 * modify and redistribute this software in source and binary code form,
 * provided that i) this copyright notice and license appear on all copies of
 * the software; and ii) Licensee does not utilize the software in a manner
 * which is disparaging to Sun.
 *
 * 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 AND ITS LICENSORS SHALL NOT BE
 * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
 * OR DISTRIBUTING THE 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 SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGES.
 *
 * This software is not designed or intended for use in on-line control of
 * aircraft, air traffic, aircraft navigation or aircraft communications; or in
 * the design, construction, operation or maintenance of any nuclear
 * facility. Licensee represents and warrants that it will not use or
 * redistribute the Software for such purposes.
 */

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
public class LayeredPaneDemo extends JPanel implements ActionListener, MouseMotionListener {
  private String[] layerStrings = { "Yellow (0)", "Magenta (1)", "Cyan (2)", "Red (3)", "Green (4)" };
  private Color[] layerColors = { Color.yellow, Color.magenta, Color.cyan, Color.red, Color.green };
  private JLayeredPane layeredPane;
  private JLabel dukeLabel;
  private JCheckBox onTop;
  private JComboBox layerList;
  // Action commands
  private static String ON_TOP_COMMAND = "ontop";
  private static String LAYER_COMMAND = "layer";
  // Adjustments to put Duke"s toe at the cursor"s tip.
  private static final int XFUDGE = 40;
  private static final int YFUDGE = 57;
  public LayeredPaneDemo() {
    setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
    // Create and load the duke icon.
    final ImageIcon icon = new ImageIcon("yourFile.gif");
    // Create and set up the layered pane.
    layeredPane = new JLayeredPane();
    layeredPane.setPreferredSize(new Dimension(300, 310));
    layeredPane.setBorder(BorderFactory.createTitledBorder("Move the Mouse to Move Duke"));
    layeredPane.addMouseMotionListener(this);
    // This is the origin of the first label added.
    Point origin = new Point(10, 20);
    // This is the offset for computing the origin for the next label.
    int offset = 35;
    // Add several overlapping, colored labels to the layered pane
    // using absolute positioning/sizing.
    for (int i = 0; i < layerStrings.length; i++) {
      JLabel label = createColoredLabel(layerStrings[i], layerColors[i], origin);
      layeredPane.add(label, new Integer(i));
      origin.x += offset;
      origin.y += offset;
    }
    // Create and add the Duke label to the layered pane.
    dukeLabel = new JLabel(icon);
    if (icon != null) {
      dukeLabel.setBounds(15, 225, icon.getIconWidth(), icon.getIconHeight());
    } else {
      System.err.println("Duke icon not found; using black square instead.");
      dukeLabel.setBounds(15, 225, 30, 30);
      dukeLabel.setOpaque(true);
      dukeLabel.setBackground(Color.BLACK);
    }
    layeredPane.add(dukeLabel, new Integer(2), 0);
    // Add control pane and layered pane to this JPanel.
    add(Box.createRigidArea(new Dimension(0, 10)));
    add(createControlPanel());
    add(Box.createRigidArea(new Dimension(0, 10)));
    add(layeredPane);
  }
  private JLabel createColoredLabel(String text, Color color, Point origin) {
    JLabel label = new JLabel(text);
    label.setVerticalAlignment(JLabel.TOP);
    label.setHorizontalAlignment(JLabel.CENTER);
    label.setOpaque(true);
    label.setBackground(color);
    label.setForeground(Color.black);
    label.setBorder(BorderFactory.createLineBorder(Color.black));
    label.setBounds(origin.x, origin.y, 140, 140);
    return label;
  }
  // Create the control pane for the top of the frame.
  private JPanel createControlPanel() {
    onTop = new JCheckBox("Top Position in Layer");
    onTop.setSelected(true);
    onTop.setActionCommand(ON_TOP_COMMAND);
    onTop.addActionListener(this);
    layerList = new JComboBox(layerStrings);
    layerList.setSelectedIndex(2); // cyan layer
    layerList.setActionCommand(LAYER_COMMAND);
    layerList.addActionListener(this);
    JPanel controls = new JPanel();
    controls.add(layerList);
    controls.add(onTop);
    controls.setBorder(BorderFactory.createTitledBorder("Choose Duke"s Layer and Position"));
    return controls;
  }
  // Make Duke follow the cursor.
  public void mouseMoved(MouseEvent e) {
    dukeLabel.setLocation(e.getX() - XFUDGE, e.getY() - YFUDGE);
  }
  public void mouseDragged(MouseEvent e) {
  } // do nothing
  public void actionPerformed(ActionEvent e) {
    String cmd = e.getActionCommand();
    if (ON_TOP_COMMAND.equals(cmd)) {
      if (onTop.isSelected())
        layeredPane.moveToFront(dukeLabel);
      else
        layeredPane.moveToBack(dukeLabel);
    } else if (LAYER_COMMAND.equals(cmd)) {
      int position = onTop.isSelected() ? 0 : 1;
      layeredPane.setLayer(dukeLabel, layerList.getSelectedIndex(), position);
    }
  }
  public static void main(String[] args) {
    JFrame frame = new JFrame("LayeredPaneDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    // Create and set up the content pane.
    JComponent newContentPane = new LayeredPaneDemo();
    newContentPane.setOpaque(true); // content panes must be opaque
    frame.setContentPane(newContentPane);
    // Display the window.
    frame.pack();
    frame.setVisible(true);
  }
}





The JLayeredPane serves as the main component container of a JRootPane.

Integer layer = new Integer(20);
aLayeredPane.add(aComponent, layer);