/* * Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code 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 * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* * @test * @bug 4292099 * @summary AWT Event delivery to processEvent * @library /java/awt/regtesthelpers * @build PassFailJFrame * @run main/manual ProcessEvent */ import java.awt.AWTEvent; import java.awt.AWTEventMulticaster; import java.awt.Adjustable; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.Graphics; import java.awt.ItemSelectable; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.AdjustmentEvent; import java.awt.event.AdjustmentListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.TextEvent; import java.awt.event.TextListener; import java.lang.reflect.InvocationTargetException; public class ProcessEvent extends Frame { static final String INSTRUCTIONS = """ Press each of the four buttons for ActionEvent, AdjustmentEvent, ItemEvent and TextEvent. If a message for each corresponding event appears in the log area and says the event listener was called, then press Pass otherwise press Fail. """; ActionBtn af; AdjustmentBtn adjf; ItemBtn itf; TextBtn txtf; public ProcessEvent() { setLayout(new FlowLayout()); add(af = new ActionBtn()); af.setBackground(Color.green); add(adjf = new AdjustmentBtn()); adjf.setBackground(Color.green); add(itf = new ItemBtn()); itf.setBackground(Color.green); add(txtf = new TextBtn()); txtf.setBackground(Color.green); // These action listeners simply provide feedback of when // the event is delivered properly. af.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { PassFailJFrame.log(af.getText() + ": action listener called: " + ae.toString()); } }); adjf.addAdjustmentListener(new AdjustmentListener() { public void adjustmentValueChanged(AdjustmentEvent ae) { PassFailJFrame.log(adjf.getText() + ": adjustment listener called: " + ae.toString()); } }); itf.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { PassFailJFrame.log(itf.getText() + ": item listener called: " + e.toString()); } }); txtf.addTextListener(new TextListener() { public void textValueChanged(TextEvent e) { PassFailJFrame.log(txtf.getText() + ": text listener called: " + e.toString()); } }); pack(); } public static void main(String[] args) throws InterruptedException, InvocationTargetException { PassFailJFrame.builder() .title("Process Events Test") .testUI(ProcessEvent::new) .instructions(INSTRUCTIONS) .columns(40) .logArea() .build() .awaitAndCheck(); } } class ButtonComponent extends Component implements ItemSelectable, Adjustable { transient protected TextListener textListener; transient ActionListener actionListener; transient AdjustmentListener adjustmentListener; transient ItemListener itemListener; String actionCommand = null; String text = null; public ButtonComponent(String label) { super(); text = label; } public String getText() { return text; } public Dimension getPreferredSize() { return new Dimension(200, 30); } public Dimension getMinimumSize() { return getPreferredSize(); } public String getActionCommand() { if (actionCommand == null) return getText(); else return actionCommand; } public void setActionCommand(String ac) { actionCommand = ac; } // ActionEvent listener support public synchronized void addActionListener(ActionListener l) { if (l == null) { return; } enableEvents(AWTEvent.ACTION_EVENT_MASK); actionListener = AWTEventMulticaster.add(actionListener, l); } public synchronized void removeActionListener(ActionListener l) { if (l == null) { return; } actionListener = AWTEventMulticaster.remove(actionListener, l); } // AdjustmentEvent listener support public synchronized void addAdjustmentListener(AdjustmentListener l) { if (l == null) { return; } enableEvents(AWTEvent.ADJUSTMENT_EVENT_MASK); adjustmentListener = AWTEventMulticaster.add(adjustmentListener, l); } public synchronized void removeAdjustmentListener(AdjustmentListener l) { if (l == null) { return; } adjustmentListener = AWTEventMulticaster.remove(adjustmentListener, l); } // ItemEvent listener support public synchronized void addItemListener(ItemListener l) { if (l == null) { return; } enableEvents(AWTEvent.ITEM_EVENT_MASK); itemListener = AWTEventMulticaster.add(itemListener, l); } public synchronized void removeItemListener(ItemListener l) { if (l == null) { return; } itemListener = AWTEventMulticaster.remove(itemListener, l); } // TextEvent listener support public synchronized void addTextListener(TextListener l) { if (l == null) { return; } enableEvents(AWTEvent.TEXT_EVENT_MASK); textListener = AWTEventMulticaster.add(textListener, l); } public synchronized void removeTextListener(TextListener l) { if (l == null) { return; } textListener = AWTEventMulticaster.remove(textListener, l); } // Implement the processEvent and processXXXEvent methods to // handle reception and processing of the event types. protected void processEvent(AWTEvent e) { if (e instanceof ActionEvent) { processActionEvent((ActionEvent) e); return; } if (e instanceof AdjustmentEvent) { processAdjustmentEvent((AdjustmentEvent) e); return; } if (e instanceof ItemEvent) { processItemEvent((ItemEvent) e); return; } if (e instanceof TextEvent) { processTextEvent((TextEvent) e); return; } super.processEvent(e); } protected void processActionEvent(ActionEvent e) { if (actionListener != null) { actionListener.actionPerformed(e); } } protected void processAdjustmentEvent(AdjustmentEvent e) { if (adjustmentListener != null) { adjustmentListener.adjustmentValueChanged(e); } } protected void processItemEvent(ItemEvent e) { if (itemListener != null) { itemListener.itemStateChanged(e); } } protected void processTextEvent(TextEvent e) { if (textListener != null) { textListener.textValueChanged(e); } } public void paint(Graphics g) { Dimension dim = getSize(); g.clearRect(0, 0, dim.width, dim.height); g.setColor(getForeground()); g.drawString(text, 2, dim.height - 2); } /** * Returns the selected items or null if no items are selected. */ public Object[] getSelectedObjects() { return null; } /** * Gets the orientation of the adjustable object. */ public int getOrientation() { return 0; } /** * Gets the minimum value of the adjustable object. */ public int getMinimum() { return 0; } /** * Sets the minimum value of the adjustable object. * * @param min the minimum value */ public void setMinimum(int min) { } /** * Gets the maximum value of the adjustable object. */ public int getMaximum() { return 0; } /** * Sets the maximum value of the adjustable object. * * @param max the maximum value */ public void setMaximum(int max) { } /** * Gets the unit value increment for the adjustable object. */ public int getUnitIncrement() { return 0; } /** * Sets the unit value increment for the adjustable object. * * @param u the unit increment */ public void setUnitIncrement(int u) { } /** * Gets the block value increment for the adjustable object. */ public int getBlockIncrement() { return 0; } /** * Sets the block value increment for the adjustable object. * * @param b the block increment */ public void setBlockIncrement(int b) { } /** * Gets the length of the propertional indicator. */ public int getVisibleAmount() { return 0; } /** * Sets the length of the proportionl indicator of the * adjustable object. * * @param v the length of the indicator */ public void setVisibleAmount(int v) { } /** * Gets the current value of the adjustable object. */ public int getValue() { return 0; } /** * Sets the current value of the adjustable object. This * value must be within the range defined by the minimum and * maximum values for this object. * * @param v the current value */ public void setValue(int v) { } } class ActionBtn extends ButtonComponent { public ActionBtn() { super("ActionEvent"); addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { ActionEvent ae = new ActionEvent(e.getSource(), ActionEvent.ACTION_PERFORMED, getActionCommand()); Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(ae); } }); } } class AdjustmentBtn extends ButtonComponent { public AdjustmentBtn() { super("AdjustmentEvent"); addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { AdjustmentEvent ae = new AdjustmentEvent((Adjustable) e.getSource(), AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED, 1, 1); Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(ae); } }); } } class ItemBtn extends ButtonComponent { public ItemBtn() { super("ItemEvent"); addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { ItemEvent ae = new ItemEvent((ItemSelectable) e.getSource(), ItemEvent.ITEM_STATE_CHANGED, e.getSource(), 1); Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(ae); } }); } } class TextBtn extends ButtonComponent { public TextBtn() { super("TextEvent"); addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { TextEvent ae = new TextEvent(e.getSource(), TextEvent.TEXT_VALUE_CHANGED); Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(ae); } }); } }