|
Windowing: Some Advanced Topics
with Examples in Java |
|
Prof. David Bernstein |
| Computer Science Department |
| bernstdh@jmu.edu |
package gui;
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
/**
* A component that contains both a slider and a label
* showing the current value of the slider.
*
* @author Prof. David Bernstein, James Madison University
* @version 1.0
*/
public class SliderPanel extends JPanel implements ChangeListener
{
private JLabel maxLabel, minLabel, valueLabel;
private JSlider slider;
/**
* Explicit Value Constructor.
*
* @param min The minimum value on the slider
* @param max The maximum value on the slider
* @param step The difference between tick marks
*/
public SliderPanel(int min, int max, int step)
{
super();
slider = new JSlider(min, max, min);
slider.setMajorTickSpacing(step);
slider.setSnapToTicks(true);
slider.setPaintTicks(true);
slider.addChangeListener(this);
minLabel = new JLabel(""+min);
maxLabel = new JLabel(""+max);
valueLabel = new JLabel(""+slider.getValue());
valueLabel.setHorizontalAlignment(JLabel.CENTER);
setLayout(new BorderLayout());
add(minLabel, BorderLayout.WEST);
add(maxLabel, BorderLayout.EAST);
add(slider, BorderLayout.CENTER);
add(valueLabel, BorderLayout.NORTH);
}
/**
* Get the current value on the slider.
*
* @return The current value
*/
public int getValue()
{
return slider.getValue();
}
/**
* Handle stateChanged events (required by ChangeListener).
*
* @param evt The ChangeEvent
*/
public void stateChanged(ChangeEvent evt)
{
int value;
value = slider.getValue();
valueLabel.setText(""+value);
valueLabel.repaint();
}
}
package usinggui;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import gui.*;
import inheritance.*;
/**
* A dialog box that is used to enter a TextMessage
*
* @author Prof. David Bernstein, James Madison University
* @version 1.0
*/
public class TextMessageDialog extends JDialog
implements ActionListener
{
private boolean shouldReturnValue;
private JButton cancelButton, okButton;
private JTextArea ta;
private SliderPanel sp;
/**
* Constructor
*
* @param frame The owner
*/
public TextMessageDialog(Frame frame)
{
super(frame, true); // true so it is modal
Container contentPane;
JPanel southPanel;
JScrollPane scrollPane;
shouldReturnValue = false;
setTitle("Enter a priority and message:");
contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
ta = new JTextArea();
scrollPane = new JScrollPane(ta,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
contentPane.add(scrollPane, BorderLayout.CENTER);
sp = new SliderPanel(0, 10, 1);
contentPane.add(sp, BorderLayout.NORTH);
southPanel = new JPanel();
southPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
okButton = new JButton("OK");
okButton.setMnemonic('O');
okButton.addActionListener(this);
cancelButton = new JButton("Cancel");
cancelButton.setMnemonic('C');
cancelButton.addActionListener(this);
southPanel.add(okButton);
southPanel.add(cancelButton);
contentPane.add(southPanel, BorderLayout.SOUTH);
setSize(400,200);
}
/**
* Get the newly-entered TextMessage
*
* @return A new TextMessage
*/
public TextMessage getTextMessage()
{
TextMessage message;
message = null;
if (shouldReturnValue)
{
message = new TextMessage(ta.getText() + " " + sp.getValue());
}
return message;
}
/**
* Handle action events (required by ActionListener)
*
* @param evt The event
*/
public void actionPerformed(ActionEvent evt)
{
boolean done;
String command;
done = false;
command = evt.getActionCommand();
if (command.equals("OK"))
{
shouldReturnValue = true;
done = true;
}
else if (command.equals("Cancel"))
{
done = true;
}
if (done) setVisible(false);
}
}
import java.awt.*;
import javax.swing.*;
import gui.*;
import inheritance.*;
import usinggui.TextMessageDialog;
/**
* An example that uses a custom dialog box
*
* @version 1.0
* @author David Bernstein, James Madison University
*/
public class TextMessageDialogDriver
{
/**
* The entry point
*
* @param args The command line arguments
*/
public static void main(String[] args)
{
CloseableFrame f;
Container contentPane;
TextMessage tm;
TextMessageDialog tmd;
f = new CloseableFrame();
f.setSize(400,200);
contentPane = f.getContentPane();
f.setVisible(true);
tmd = new TextMessageDialog(f);
tmd.setVisible(true);
tm = tmd.getTextMessage();
if (tm != null)
{
System.out.println(tm.getMessage());
}
}
}
SliderPanel
package usinggui;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import gui.*;
import inheritance.*;
/**
* A dialog box that is used to enter a TextMessage
*
* @author Prof. David Bernstein, James Madison University
* @version 1.0
*/
public class TextMessageDialog extends JDialog
implements ActionListener
{
private boolean shouldReturnValue;
private JButton cancelButton, okButton;
private JTextArea ta;
private SliderPanel sp;
/**
* Constructor
*
* @param frame The owner
*/
public TextMessageDialog(Frame frame)
{
super(frame, true); // true so it is modal
Container contentPane;
JPanel southPanel;
JScrollPane scrollPane;
shouldReturnValue = false;
setTitle("Enter a priority and message:");
contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
ta = new JTextArea();
scrollPane = new JScrollPane(ta,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
contentPane.add(scrollPane, BorderLayout.CENTER);
sp = new SliderPanel(0, 10, 1);
contentPane.add(sp, BorderLayout.NORTH);
southPanel = new JPanel();
southPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
okButton = new JButton("OK");
okButton.setMnemonic('O');
okButton.addActionListener(this);
cancelButton = new JButton("Cancel");
cancelButton.setMnemonic('C');
cancelButton.addActionListener(this);
southPanel.add(okButton);
southPanel.add(cancelButton);
contentPane.add(southPanel, BorderLayout.SOUTH);
setSize(400,200);
}
/**
* Get the newly-entered TextMessage
*
* @return A new TextMessage
*/
public TextMessage getTextMessage()
{
TextMessage message;
message = null;
if (shouldReturnValue)
{
message = new TextMessage(ta.getText() + " " + sp.getValue());
}
return message;
}
/**
* Handle action events (required by ActionListener)
*
* @param evt The event
*/
public void actionPerformed(ActionEvent evt)
{
boolean done;
String command;
done = false;
command = evt.getActionCommand();
if (command.equals("OK"))
{
shouldReturnValue = true;
done = true;
}
else if (command.equals("Cancel"))
{
done = true;
}
if (done) setVisible(false);
}
}
import java.awt.*;
import javax.swing.*;
import gui.*;
import inheritance.*;
import usinggui.TextMessageDialog;
/**
* An example that uses a custom dialog box
*
* @version 1.0
* @author David Bernstein, James Madison University
*/
public class TextMessageDialogDriver
{
/**
* The entry point
*
* @param args The command line arguments
*/
public static void main(String[] args)
{
CloseableFrame f;
Container contentPane;
TextMessage tm;
TextMessageDialog tmd;
f = new CloseableFrame();
f.setSize(400,200);
contentPane = f.getContentPane();
f.setVisible(true);
tmd = new TextMessageDialog(f);
tmd.setVisible(true);
tm = tmd.getTextMessage();
if (tm != null)
{
System.out.println(tm.getMessage());
}
}
}
package usinggui;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
/**
* A simple editor that uses a pop-up menu
*
* @author Prof. David Bernstein, James Madison University
* @version 1.0
*/
public class Editor extends JPanel
implements ActionListener, MouseListener
{
Caret caret;
JMenuItem copyItem, cutItem, pasteItem;
JPopupMenu popup;
JTextArea ta;
String clipboard;
/**
* Constructor
*/
public Editor()
{
super();
setLayout(new BorderLayout());
setSize(400,400);
ta = new JTextArea();
caret = ta.getCaret();
ta.setLineWrap(true);
ta.setWrapStyleWord(true);
caret = ta.getCaret();
constructControls();
performLayout();
ta.addMouseListener(this); // To show the popup menu
clipboard = null;
}
/**
* Handle actionPerformed events
*
* @param evt The event
*/
public void actionPerformed(ActionEvent evt)
{
String command;
command = evt.getActionCommand();
if (command.equals("Copy")) copy();
else if (command.equals("Cut")) cut();
else if (command.equals("Paste")) paste();
}
/**
* Construct the JPopupMenu, JMenu, and JToolBar and
* add an array of Action objects to them.
*/
private void constructControls()
{
popup = new JPopupMenu();
copyItem = new JMenuItem("Copy");
copyItem.addActionListener(this);
popup.add(copyItem);
cutItem = new JMenuItem("Cut");
cutItem.addActionListener(this);
popup.add(cutItem);
pasteItem = new JMenuItem("Paste");
pasteItem.addActionListener(this);
popup.add(pasteItem);
}
/**
* Copy text to the "clipboard"
*/
public void copy()
{
int dot, mark;
dot = caret.getDot();
mark = caret.getMark();
clipboard = ta.getSelectedText();
ta.select(-1, -1);
caret.setDot(mark); // Causes a CaretEvent to be fired
caret.setDot(dot); // Positions the Caret at the right position
ta.requestFocus();
}
/**
* Cut text to the "clipboard"
*/
public void cut()
{
int dot;
dot = caret.getDot();
clipboard = ta.getSelectedText();
ta.replaceSelection(null);
ta.select(-1, -1);
caret.setDot(dot);
ta.requestFocus();
}
/**
* Is there any text on the "clipboard"?
*
* @return true if yes; false otherwise
*/
public boolean isClipping()
{
return (clipboard != null);
}
/**
* Is there any text selected?
*
* @return true if yes; false otherwise
*/
public boolean isSelection()
{
return (ta.getSelectedText() != null);
}
/**
* Handle mouseClicked events (required by MouseListener)
*
* @param evt The event
*/
public void mouseClicked(MouseEvent evt)
{
}
/**
* Handle mouseEntered events (required by MouseListener)
*
* @param evt The event
*/
public void mouseEntered(MouseEvent evt)
{
}
/**
* Handle mouseExited events (required by MouseListener)
*
* @param evt The event
*/
public void mouseExited(MouseEvent evt)
{
}
/**
* Handle mousePressed events (required by MouseListener)
*
* @param evt The event
*/
public void mousePressed(MouseEvent evt)
{
}
/**
* Handle mouseReleased events (required by MouseListener)
*
* @param evt The event
*/
public void mouseReleased(MouseEvent evt)
{
if (evt.isPopupTrigger()) showPopup(evt.getPoint());
}
/**
* Layout this Editor.
*/
private void performLayout()
{
JScrollPane scrollPane;
setLayout(new BorderLayout());
setSize(400,400);
scrollPane = new JScrollPane(ta);
scrollPane.setHorizontalScrollBarPolicy(
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS
);
scrollPane.setVerticalScrollBarPolicy(
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS
);
add(scrollPane, BorderLayout.CENTER);
}
/**
* Paste text from the "clipboard".
*/
public void paste()
{
int dot, offset;
dot = caret.getDot();
offset = clipboard.length();
ta.replaceSelection(clipboard);
clipboard = null;
caret.setDot(dot + offset);
ta.requestFocus();
}
/**
* Show the pop-up menu
*
* @param point The location of the pop-up menu
*/
private void showPopup(Point point)
{
copyItem.setEnabled(false);
cutItem.setEnabled(false);
pasteItem.setEnabled(false);
if (isSelection())
{
copyItem.setEnabled(true);
cutItem.setEnabled(true);
}
if (isClipping()) pasteItem.setEnabled(true);
popup.show(this, point.x, point.y);
}
}
import java.awt.*;
import javax.swing.*;
import gui.JListEditor;
import usinggui.Editor;
/**
* An example that uses internal windows
*
* @author Prof. David Bernstein, James Madison University
* @version 1.0
*/
public class InternalWindowDriver
{
/**
* The entry point
*
* @param args The command line arguments
*/
public static void main(String[] args)
{
JFrame f;
Container contentPane;
JInternalFrame i1, i2, i3;
JDesktopPane desk;
f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(600,400);
desk = new JDesktopPane();
desk.setSize(600,400);
i1 = new JInternalFrame("Action/Adventure",
true, true, true, true);
i1.setSize(200,100);
i1.setBounds(0,0,200,100);
i1.getContentPane().add(new Editor());
i1.setVisible(true);
i2 = new JInternalFrame("Comedy",
true, true, true, true);
i2.setSize(200,100);
i2.setBounds(200,100,200,100);
i2.getContentPane().add(new JListEditor());
i2.setVisible(true);
i3 = new JInternalFrame("Romance",
true, true, true, true);
i3.setSize(200,100);
i3.setBounds(400,200,200,100);
i3.getContentPane().add(new JButton("Click me"));
i3.setVisible(true);
desk.add(i1);
desk.add(i2);
desk.add(i3);
f.setContentPane(desk);
f.setVisible(true);
}
}
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
/**
* An example that uses JToolTip
*
* @author Prof. David Bernstein, James Madison University
* @version 1.0
*/
public class JToolTipDriver
{
public static void main(String[] args)
{
JFrame f;
Container contentPane;
JLabel jl;
JPanel p1, p2;
f = new JFrame();
f.setSize(640,480);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
contentPane = f.getContentPane();
contentPane.setLayout(new GridLayout(2,1));
p1 = new JPanel();
p1.setToolTipText("I'm an empty JPanel!");
contentPane.add(p1);
p2 = new JPanel();
p2.setBorder(
BorderFactory.createBevelBorder(
BevelBorder.RAISED
)
);
jl = new JLabel("This JPanel has a raised "+
"BevelBorder");
jl.setToolTipText("I'm a JLabel");
p2.add(jl);
p2.setToolTipText("I'm a JPanel too! ");
contentPane.add(p2);
f.setVisible(true);
}
}