2 * Jexer - Java Text User Interface
4 * The MIT License (MIT)
6 * Copyright (C) 2017 Kevin Lamonte
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24 * DEALINGS IN THE SOFTWARE.
26 * @author Kevin Lamonte [kevin.lamonte@gmail.com]
31 import jexer
.TApplication
;
32 import jexer
.backend
.*;
35 * This class shows off the use of MultiBackend and MultiScreen.
42 * @param args Command line arguments
44 public static void main(final String
[] args
) {
48 * In this demo we will create two applications spanning three
49 * screens. One of the applications will have both an ECMA48
50 * screen and a Swing screen, with all I/O mirrored between them.
51 * The second application will have a Swing screen containing a
52 * window showing the first application, also mirroring I/O
53 * between the window and the other two screens.
57 * We create the first screen and use it to establish a
60 ECMA48Backend ecmaBackend
= new ECMA48Backend();
61 MultiBackend multiBackend
= new MultiBackend(ecmaBackend
);
64 * Now we create the first application (a standard demo).
66 DemoApplication demoApp
= new DemoApplication(multiBackend
);
69 * We will need the width and height of the ECMA48 screen, so get
70 * the Screen reference now.
72 Screen multiScreen
= multiBackend
.getScreen();
75 * Now we create the second screen (backend) for the first
76 * application. It will be the same size as the ECMA48 screen,
77 * with a font size of 16 points.
79 SwingBackend swingBackend
= new SwingBackend(multiScreen
.getWidth(),
80 multiScreen
.getHeight(), 16);
83 * Add this screen to the MultiBackend, and at this point we have
84 * one demo application spanning two physical screens.
86 multiBackend
.addBackend(swingBackend
);
87 multiBackend
.setListener(demoApp
);
90 * Time for the second application. This one will have a single
91 * window mirroring the contents of the first application. Let's
92 * make it a little larger than the first application's
95 int width
= multiScreen
.getWidth();
96 int height
= multiScreen
.getHeight();
99 * Make a new Swing window for the second application.
101 SwingBackend monitorBackend
= new SwingBackend(width
+ 5,
105 * Setup the second application, give it the basic file and
108 TApplication monitor
= new TApplication(monitorBackend
);
109 monitor
.addFileMenu();
110 monitor
.addWindowMenu();
113 * Now add the third screen to the first application. We want to
114 * change the object it locks on in its draw() method to the
115 * MultiScreen, that will dramatically reduce (not totally
116 * eliminate) screen tearing/artifacts.
118 TWindowBackend windowBackend
= new TWindowBackend(demoApp
,
119 monitor
, "Monitor Window", width
+ 2, height
+ 2);
120 windowBackend
.setDrawLock(multiScreen
);
121 multiBackend
.addBackend(windowBackend
);
124 * Three screens, two applications: spin them up!
126 (new Thread(demoApp
)).start();
127 (new Thread(monitor
)).start();
128 } catch (Exception e
) {