Java Tutorial/Swing Event/ComponentListener
Содержание
A ComponentAdapter.
<source lang="java">
import java.awt.event.ruponentAdapter; import java.awt.event.ruponentEvent; import javax.swing.JFrame; class MoveAdapter extends ComponentAdapter {
public void componentMoved(ComponentEvent e) { int x = e.getComponent().getX(); int y = e.getComponent().getY(); System.out.println("x: " + x); System.out.println("y: " + y); }
} public class Adapter {
public static void main(String[] args) { JFrame f = new JFrame(); f.addComponentListener(new MoveAdapter()); f.setSize(310, 200); f.setLocationRelativeTo(null); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); }
}</source>
A position of a window on the screen.
<source lang="java">
import java.awt.event.ruponentEvent; import java.awt.event.ruponentListener; import javax.swing.JFrame; public class MovingWindow extends JFrame implements ComponentListener {
public MovingWindow() { addComponentListener(this); setSize(310, 200); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); } public void componentResized(ComponentEvent e) { } public void componentMoved(ComponentEvent e) { int x = e.getComponent().getX(); int y = e.getComponent().getY(); System.out.println("x: " + x); System.out.println("y: " + y); } public void componentShown(ComponentEvent e) { } public void componentHidden(ComponentEvent e) { } public static void main(String[] args) { new MovingWindow(); }
}</source>
ComponentListener and ComponentEvent
<source lang="java">
/*
* Copyright (c) 1995 - 2008 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: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions 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 nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
/*
* ComponentEventDemo.java requires no other files. */
import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ruponentEvent; import java.awt.event.ruponentListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; public class ComponentEventDemo extends JPanel implements ComponentListener,
ItemListener { static JFrame frame; JTextArea display; JLabel label; String newline = "\n"; public ComponentEventDemo() { super(new BorderLayout()); display = new JTextArea(); display.setEditable(false); JScrollPane scrollPane = new JScrollPane(display); scrollPane.setPreferredSize(new Dimension(350, 200)); JPanel panel = new JPanel(new BorderLayout()); label = new JLabel("This is a label", JLabel.CENTER); label.addComponentListener(this); panel.add(label, BorderLayout.CENTER); JCheckBox checkbox = new JCheckBox("Label visible", true); checkbox.addItemListener(this); checkbox.addComponentListener(this); panel.add(checkbox, BorderLayout.PAGE_END); panel.addComponentListener(this); add(scrollPane, BorderLayout.CENTER); add(panel, BorderLayout.PAGE_END); frame.addComponentListener(this); } public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { label.setVisible(true); // Need to revalidate and repaint, or else the label // will probably be drawn in the wrong place. label.revalidate(); label.repaint(); } else { label.setVisible(false); } } protected void displayMessage(String message) { // If the text area is not yet realized, and // we tell it to draw text, it could cause // a text/AWT tree deadlock. Our solution is // to ensure that the text area is realized // before attempting to draw text. // if (display.isShowing()) { display.append(message + newline); display.setCaretPosition(display.getDocument().getLength()); // } } public void componentHidden(ComponentEvent e) { displayMessage(e.getComponent().getClass().getName() + " --- Hidden"); } public void componentMoved(ComponentEvent e) { displayMessage(e.getComponent().getClass().getName() + " --- Moved"); } public void componentResized(ComponentEvent e) { displayMessage(e.getComponent().getClass().getName() + " --- Resized "); } public void componentShown(ComponentEvent e) { displayMessage(e.getComponent().getClass().getName() + " --- Shown"); } /** * Create the GUI and show it. For thread safety, this method should be * invoked from the event-dispatching thread. */ private static void createAndShowGUI() { // Create and set up the window. frame = new JFrame("ComponentEventDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Create and set up the content pane. JComponent newContentPane = new ComponentEventDemo(); 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(); } }); }
}</source>
extends ComponentAdapter
<source lang="java">
import java.awt.BorderLayout; import java.awt.Point; import java.awt.event.ruponentAdapter; import java.awt.event.ruponentEvent; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JViewport; import javax.swing.SwingUtilities; import javax.swing.table.AbstractTableModel; public class RowAdder extends JFrame {
SimpleModel tableData = new SimpleModel(); JTable table = new JTable(tableData); public static void main(String[] args) { RowAdder ra = new RowAdder(); ra.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ra.setSize(400, 300); ra.setVisible(true); } public RowAdder() { setLayout(new BorderLayout()); table.addComponentListener(new TableScroller()); add(new JScrollPane(table), BorderLayout.CENTER); } class TableScroller extends ComponentAdapter { public void componentResized(ComponentEvent event) { int lastRow = tableData.getRowCount() - 1; int cellTop = table.getCellRect(lastRow, 0, true).y; JScrollPane jsp = (JScrollPane) SwingUtilities.getAncestorOfClass( JScrollPane.class, table); JViewport jvp = jsp.getViewport(); int portHeight = jvp.getSize().height; int position = cellTop - (portHeight - table.getRowHeight() - table.getRowMargin()); if (position >= 0) { jvp.setViewPosition(new Point(0, position)); } } }
} class SimpleModel extends AbstractTableModel {
public void addText(String text) { fireTableDataChanged(); } public int getRowCount() { return 100; } public int getColumnCount() { return 3; } public Object getValueAt(int row, int column) { return row+" "+column; }
}</source>
How to Write a Component Listener
One or more component events are fired after the component is hidden, made visible, moved, or resized.
<source lang="java">
import java.awt.ruponent; import java.awt.event.ruponentEvent; import java.awt.event.ruponentListener; import javax.swing.JCheckBox; import javax.swing.JFrame; public class UsingComponentListener {
public static void main(String[] a) { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JCheckBox checkbox = new JCheckBox("Label visible", true); checkbox.addComponentListener(new ComponentListener() { public void componentHidden(ComponentEvent e) { System.out.println("componentHidden event from " + e.getComponent().getClass().getName()); } public void componentMoved(ComponentEvent e) { Component c = e.getComponent(); System.out.println("componentMoved event from " + c.getClass().getName() + "; new location: " + c.getLocation().x + ", " + c.getLocation().y); } public void componentResized(ComponentEvent e) { Component c = e.getComponent(); System.out.println("componentResized event from " + c.getClass().getName() + "; new size: " + c.getSize().width + ", " + c.getSize().height); } public void componentShown(ComponentEvent e) { System.out.println("componentShown event from " + e.getComponent().getClass().getName()); } }); frame.add(checkbox, "North"); frame.setSize(300, 200); frame.setVisible(true); }
}</source>
Installs/resets a ComponentListener to resize the given window to minWidth/Height if needed
<source lang="java">
/*
* $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.Window; import java.awt.event.ruponentAdapter; import java.awt.event.ruponentListener; import javax.swing.SwingUtilities; public class Utils {
/** * Installs/resets a ComponentListener to resize the * given window to minWidth/Height if needed. * * @param window * @param minWidth * @param minHeight */ public static void setMinimumSizeManager(Window window, int minWidth, int minHeight) { ComponentListener[] listeners = window.getComponentListeners(); ComponentListener listener = null; for (ComponentListener l : listeners) { if (l instanceof MinSizeComponentListener) { listener = l; break; } } if (listener == null) { window.addComponentListener(new MinSizeComponentListener( window, minWidth, minHeight)); } else { ((MinSizeComponentListener) listener).resetSizes(minWidth, minHeight); } } /** * Resets window size to minSize if needed. * * @author Patrick Wright */ public static class MinSizeComponentListener extends ComponentAdapter { private Window window; private int minHeight; private int minWidth; MinSizeComponentListener(Window frame, int minWidth, int minHeight) { this.window = frame; resetSizes(minWidth, minHeight); } public void resetSizes(int minWidth, int minHeight) { this.minWidth = minWidth; this.minHeight = minHeight; adjustIfNeeded(window); } @Override public void componentResized(java.awt.event.ruponentEvent evt) { adjustIfNeeded((Window) evt.getComponent()); } private void adjustIfNeeded(final Window window) { boolean doSize = false; int newWidth = window.getWidth(); int newHeight = window.getHeight(); if (newWidth < minWidth) { newWidth = minWidth; doSize = true; } if (newHeight < minHeight) { newHeight = minHeight; doSize = true; } if (doSize) { final int w = newWidth; final int h = newHeight; SwingUtilities.invokeLater(new Runnable() { public void run() { window.setSize(w, h); } }); } } }
}</source>