a32c3b43aa
Reviewed-by: prr
355 lines
11 KiB
Java
355 lines
11 KiB
Java
/*
|
|
* Copyright (c) 1998, 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 4146452
|
|
* @summary Tests serialization of peered and lightweight Components.
|
|
* @library /java/awt/regtesthelpers
|
|
* @build PassFailJFrame
|
|
* @run main/manual ComponentSerializationTest
|
|
*/
|
|
|
|
import java.awt.Button;
|
|
import java.awt.Canvas;
|
|
import java.awt.Checkbox;
|
|
import java.awt.CheckboxMenuItem;
|
|
import java.awt.Choice;
|
|
import java.awt.Color;
|
|
import java.awt.Component;
|
|
import java.awt.Dialog;
|
|
import java.awt.Dimension;
|
|
import java.awt.EventQueue;
|
|
import java.awt.FileDialog;
|
|
import java.awt.FlowLayout;
|
|
import java.awt.Font;
|
|
import java.awt.Frame;
|
|
import java.awt.Graphics;
|
|
import java.awt.Insets;
|
|
import java.awt.Label;
|
|
import java.awt.List;
|
|
import java.awt.Menu;
|
|
import java.awt.MenuBar;
|
|
import java.awt.MenuItem;
|
|
import java.awt.Panel;
|
|
import java.awt.ScrollPane;
|
|
import java.awt.Scrollbar;
|
|
import java.awt.TextArea;
|
|
import java.awt.TextField;
|
|
import java.awt.Window;
|
|
import java.awt.event.ActionEvent;
|
|
import java.awt.event.ActionListener;
|
|
import java.io.FileInputStream;
|
|
import java.io.FileOutputStream;
|
|
import java.io.ObjectInputStream;
|
|
import java.io.ObjectOutputStream;
|
|
import java.lang.reflect.InvocationTargetException;
|
|
import java.util.ArrayList;
|
|
import javax.swing.JPanel;
|
|
|
|
public class ComponentSerializationTest extends JPanel {
|
|
private MainFrame mf;
|
|
private MainWindow mw;
|
|
private MainDialog md;
|
|
private MainFileDialog mfd;
|
|
private static final String INSTRUCTIONS = """
|
|
A Frame, a Window, and a Dialog should appear. From the Frame's
|
|
"Serialize" menu, select "Serialize!". Another Frame, Window, and
|
|
Dialog should appear exactly on top of the existing ones. The state
|
|
and functionality of the two sets of Windows should be identical. If
|
|
any errors or exceptions appear in the log area, or if the second set of
|
|
Windows is different from the first, the test fails. Otherwise, the
|
|
test passes.
|
|
""";
|
|
|
|
private static final ArrayList<Window> toDispose = new ArrayList<>();
|
|
|
|
public ComponentSerializationTest() {
|
|
mf = new MainFrame();
|
|
toDispose.add(mf);
|
|
mw = new MainWindow(mf);
|
|
toDispose.add(mw);
|
|
md = new MainDialog(mf);
|
|
toDispose.add(md);
|
|
mfd = new MainFileDialog(mf);
|
|
toDispose.add(mfd);
|
|
}
|
|
|
|
public static void main(String[] argc) throws InterruptedException,
|
|
InvocationTargetException {
|
|
PassFailJFrame.builder()
|
|
.title("Component Serialization Test")
|
|
.splitUI(ComponentSerializationTest::new)
|
|
.instructions(INSTRUCTIONS)
|
|
.columns(40)
|
|
.logArea()
|
|
.build()
|
|
.awaitAndCheck();
|
|
for (Window w : toDispose) {
|
|
if (w != null) {
|
|
EventQueue.invokeAndWait(w::dispose);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void initWindow(Window w) {
|
|
w.setSize(600, 400);
|
|
w.setLayout(new FlowLayout());
|
|
|
|
// peered components
|
|
w.add(new Button("Button"));
|
|
w.add(new TestCanvas());
|
|
w.add(new Checkbox("Checkbox", true));
|
|
Choice choice = new Choice();
|
|
choice.add("Choice 1");
|
|
choice.add("Choice Two");
|
|
w.add(choice);
|
|
w.add(new Label("Label"));
|
|
List list = new List();
|
|
list.add("List 1");
|
|
list.add("List Two");
|
|
w.add(list);
|
|
w.add(new Scrollbar(Scrollbar.VERTICAL));
|
|
w.add(new Scrollbar(Scrollbar.HORIZONTAL));
|
|
ScrollPane scrollpane = new ScrollPane();
|
|
scrollpane.add(new Button("Button in a scrollpane"));
|
|
w.add(scrollpane);
|
|
w.add(new TextArea("TextArea", 3, 30));
|
|
w.add(new TextField("TextField"));
|
|
|
|
// nested components
|
|
Panel panel1 = new Panel();
|
|
panel1.setLayout(new FlowLayout());
|
|
panel1.setBackground(Color.red);
|
|
w.add(panel1);
|
|
|
|
panel1.add(new Button("level 2"));
|
|
|
|
Panel panel2 = new Panel();
|
|
panel2.setLayout(new FlowLayout());
|
|
panel2.setBackground(Color.green);
|
|
panel1.add(panel2);
|
|
|
|
panel2.add(new Button("level 3"));
|
|
|
|
// lightweight components
|
|
w.add(new LWButton("LWbutton") );
|
|
|
|
// overlapping components
|
|
w.add(new ZOrderPanel());
|
|
}
|
|
|
|
class MainWindow extends Window {
|
|
public MainWindow(Frame f) {
|
|
super(f);
|
|
initWindow(this);
|
|
setLocation(650, 0);
|
|
setVisible(true);
|
|
}
|
|
}
|
|
|
|
class MainDialog extends Dialog {
|
|
public MainDialog(Frame f) {
|
|
super(f, "MainDialog", false);
|
|
initWindow(this);
|
|
setLocation(0, 450);
|
|
setVisible(true);
|
|
}
|
|
}
|
|
|
|
class MainFileDialog extends FileDialog {
|
|
public MainFileDialog(Frame f) {
|
|
super(f, "MainFileDialog", FileDialog.SAVE);
|
|
setLocation(650, 450);
|
|
addNotify();
|
|
}
|
|
}
|
|
|
|
class MainFrame extends Frame {
|
|
public MainFrame() {
|
|
super("ComponentSerializationTest");
|
|
initWindow(this);
|
|
|
|
Menu menu = new Menu("Serialize");
|
|
Menu menu2 = new Menu("File");
|
|
Menu menu3 = new Menu("Edit");
|
|
Menu menu4 = new Menu("ReallyReallyReallyReallyReallyReallyReallyReally" +
|
|
"ReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyReallyLong");
|
|
menu2.setFont(new Font("SansSerif", Font.BOLD, 20));
|
|
menu2.setEnabled(false);
|
|
menu3.setFont(new Font("Monospaced", Font.ITALIC, 18));
|
|
menu3.setEnabled(false);
|
|
menu4.setEnabled(false);
|
|
MenuItem itemSerialize = new MenuItem("Serialize!");
|
|
CheckboxMenuItem itemCheck = new CheckboxMenuItem("Check me");
|
|
menu.add(itemSerialize);
|
|
menu.add(itemCheck);
|
|
MenuBar menuBar = new MenuBar();
|
|
menuBar.add(menu);
|
|
menuBar.add(menu2);
|
|
menuBar.add(menu3);
|
|
menuBar.add(menu4);
|
|
setMenuBar(menuBar);
|
|
|
|
itemSerialize.addActionListener(new ActionSerialize());
|
|
|
|
setLocation(0, 0);
|
|
setVisible(true);
|
|
}
|
|
}
|
|
|
|
class ActionSerialize implements ActionListener {
|
|
public void actionPerformed(ActionEvent ev) {
|
|
Frame f2 = null;
|
|
Window w2 = null;
|
|
Dialog d2 = null;
|
|
FileDialog fd2 = null;
|
|
|
|
try {
|
|
FileOutputStream fos = new FileOutputStream("tmp");
|
|
ObjectOutputStream oos = new ObjectOutputStream(fos);
|
|
oos.writeObject(mf);
|
|
oos.writeObject(mw);
|
|
oos.writeObject(md);
|
|
oos.writeObject(mfd);
|
|
oos.flush();
|
|
|
|
FileInputStream fis = new FileInputStream("tmp");
|
|
ObjectInputStream ois = new ObjectInputStream(fis);
|
|
f2 = (Frame)ois.readObject();
|
|
w2 = (Window)ois.readObject();
|
|
d2 = (Dialog)ois.readObject();
|
|
fd2= (FileDialog)ois.readObject();
|
|
} catch (Exception e) {
|
|
PassFailJFrame.log(e.getMessage());
|
|
}
|
|
|
|
if (f2 == null || w2 == null || d2 == null || fd2 == null) {
|
|
PassFailJFrame.log("ERROR: one of the components was not deserialized.");
|
|
PassFailJFrame.log("frame = " + f2);
|
|
PassFailJFrame.log("window = " + w2);
|
|
PassFailJFrame.log("dialog = " + d2);
|
|
PassFailJFrame.log("file dalog = " + fd2);
|
|
}
|
|
|
|
if (f2 != null) {
|
|
toDispose.add(f2);
|
|
f2.setVisible(true);
|
|
}
|
|
if (w2 != null) {
|
|
toDispose.add(w2);
|
|
w2.setVisible(true);
|
|
}
|
|
if (d2 != null) {
|
|
toDispose.add(d2);
|
|
d2.setVisible(true);
|
|
}
|
|
if (fd2 != null) {
|
|
toDispose.add(fd2);
|
|
fd2.addNotify();
|
|
}
|
|
}
|
|
}
|
|
|
|
class LWButton extends Component {
|
|
String label;
|
|
int width = 100;
|
|
int height = 30;
|
|
|
|
public LWButton(String label) {
|
|
super();
|
|
this.label = label;
|
|
}
|
|
|
|
public void paint(Graphics g) {
|
|
Dimension d = getSize();
|
|
g.setColor(Color.orange);
|
|
g.fillRect(0, 0, d.width, d.height);
|
|
g.setColor(Color.black);
|
|
int x = 5;
|
|
int y = (d.height - 5);
|
|
g.drawString(label, x, y);
|
|
}
|
|
|
|
public Dimension getPreferredSize() {
|
|
return new Dimension(width, height);
|
|
}
|
|
}
|
|
|
|
class TestCanvas extends Canvas {
|
|
int width = 100;
|
|
int height = 100;
|
|
|
|
public void paint(Graphics g) {
|
|
g.setColor(Color.blue);
|
|
g.fillRoundRect(10, 10, 50, 50, 15, 30);
|
|
g.setColor(Color.red);
|
|
g.fillOval(70, 70, 25, 25);
|
|
}
|
|
public Dimension getPreferredSize() {
|
|
return new Dimension(width, height);
|
|
}
|
|
}
|
|
|
|
class ZOrderPanel extends Panel {
|
|
public ZOrderPanel() {
|
|
setLayout(null);
|
|
|
|
Component first, second, third, fourth;
|
|
|
|
show();
|
|
first = makeBox("Second", Color.blue, -1);
|
|
second = makeBox("First", Color.yellow, 0);
|
|
fourth = makeBox("Fourth", Color.red, 2);
|
|
third = makeBox("Third", Color.green, 3);
|
|
remove(third);
|
|
add(third, 2);
|
|
validate();
|
|
add(new LWButton("LWButton"), 0);
|
|
}
|
|
|
|
public Dimension preferredSize() {
|
|
return new Dimension(260, 80);
|
|
}
|
|
|
|
public void layout() {
|
|
int i, n;
|
|
Insets ins = insets();
|
|
n = countComponents();
|
|
for (i = n - 1; i >= 0; i--) {
|
|
Component p = getComponent(i);
|
|
p.reshape(ins.left + 40 * i, ins.top + 5 * i, 60, 60);
|
|
}
|
|
}
|
|
|
|
public Component makeBox(String s, Color c, int index) {
|
|
Label l = new Label(s);
|
|
l.setBackground(c);
|
|
l.setAlignment(Label.RIGHT);
|
|
add(l, index);
|
|
validate();
|
|
return l;
|
|
}
|
|
}
|
|
}
|