Transcript Document
Informatics– University of Brawijaya
*
Swing [part.1]
Taken from Water Milner
Eriq Muhammad Adams J
[email protected] | http://eriq.lecture.ub.ac.id
* A group of 14 packages to do with the UI
* 451 classes as at 1.4 (!)
* Part of JFC Java Foundation Classes (compare now defunct
MFC)
* AWT = abstract windows toolkit (cross platform)
* AWT = earliest version of Java GUI
* eg Frame AWT not JFrame Swing
* Most Swing components are 'lightweight'
* Do not mix AWT and Swing
* Use Swing
* A thread is a lightweight process
* Most Swing components are not thread-safe
* Solution is to make sure all code that creates and modifies
Swing components executes in the same 'event-dispatching'
thread
* Start a Swing application using the following code..
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI(); // << method to start it
}
});
}
private static void createAndShowGUI()
{
//Create and set up the window.
JFrame frame = new JFrame("Hi..");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Add a label.
JLabel label = new JLabel("Hello World");
frame.getContentPane().add(label);
//Display the window.
frame.pack();
frame.setVisible(true);
Try this out
}
* Most Swing UIs utilise a LayoutManager to control positioning
of items
* There is a choice of these which work in different ways
* Initially we do without one, and position items ourselves:
* frame.setLayout(null);
JFrame frame = new JFrame("I am a JFrame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(20,30,300,100);
frame.setLayout(null);
JButton butt=new JButton("Click me");
frame.getContentPane().add(butt);
butt.setBounds(20, 20, 200,20);
frame.setVisible(true);
Try this out
- start with last example and put this
in CreateandShowGUI()
* Based on an event-handling model
* New component eg a button should have a Listener specified
* The Listener object is programmed to respond to Event
objects coming from the component
* The Listener object needs to implement the appropriate
interface
Event object
interface eg
ActionListener
the listener eg JFrame
when clicked
component eg button
during initialisation, component
selects another object eg a JFrame,
to be the listener
executes appropriate interface
method ie actionPerformed
*An interface is a set of methods
*eg the ActionListener interface has just one method public void actionPerformed(ActionEvent e)
*A class can declare that it implements it eg
public class Main implements ActionListener
*Then it must actually define the methods in that
interface
*Or the compiler will complain
*Classes can implement multiple interfaces
* See source code in Word
* JButton and JLabel
* clickCounts remembers the number of clicks
* Class implements ActionListener
* Make JFrame, JButton and JLabel
* Instantiate application object
* Set to be the listener of the button
* If have several buttons, all must link to actionPerformed
* How to know which button was clicked?
* Use the .getSource method of the ActionEvent object
butt1=new JButton("Button 1");
..
butt2 = new JButton("Button 2");
..
public void actionPerformed(ActionEvent e)
{
if (e.getSource()==butt1)
label.setText("Butt1 clicked");
else
label.setText("Butt2 clicked");
}
Try this out
CDE/Motif
Windows
Available look and feels depend on implementation
Metal
try {
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.motif.MotifLookAndFeel" );
}
catch (Exception e)
{
System.out.println("Cant get laf");
}
..
JFrame frame = new JFrame();
This in main() - set laf as first step
try .. catch.. because could fail
UIManager is in java.lang
Object a[]= UIManager.getInstalledLookAndFeels();
for (int i=0; i<a.length; i++)
System.out.println(a[i]);
JFrame.setDefaultLookAndFeelDecorated(true);
.. call JFrame constructor
containers
things that hold other things
eg JFRame
controls
User I/O widgets
eg JButton
top level containers - JFrame JApplet JDialog
general purpose containers panel
scroll pane
split pane
tabbed pane
tool bar
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("I am a JFrame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(20,30,300,100);
frame.setLayout(null);
//Create a panel
JPanel myPanel = new JPanel();
myPanel.setBackground(new Color(255,3,25));
myPanel.setOpaque(true);
//Make it the content pane.
frame.setContentPane(myPanel);
frame.setVisible(true);
* Is a subclass of JComponent
* So are all the other Swing components except the top-level
containers
* You can add a border
* And a tool-tip
..
myPanel.setOpaque(true);
myPanel.setToolTipText("I'm a JPanel");
myPanel.setBorder(BorderFactory.createLineBorder(Color.wh
ite));
frame.setContentPane(myPanel);
..
..
setLayout(null);
//Create a split pane
JSplitPane myPane = new JSplitPane();
myPane.setOpaque(true);
frame.setContentPane(myPane);
frame.setVisible(true);
//Create a split pane
JSplitPane myPane = new JSplitPane();
myPane.setOpaque(true);
myPane.setDividerLocation(150);
// make two panels
JPanel right = new JPanel();
right.setBackground(new Color(255,0,0));
JPanel left = new JPanel();
left.setBackground(new Color(0,255,0));
// set as left and right in split
myPane.setRightComponent(right);
myPane.setLeftComponent(left);
* Program this
* The buttons set the colour of the left hand pane
* For single-line text input
* Methods getText, setText
* Can use ActionListener, triggered when Enter pressed
*See source in Word doc
*Check Main object fields for label and textfield
*Make a panel, set as content pane
*Make and add text field
*Add actionlistener
*Make and add a label
*Program actionPerformed
JPanel myPanel = new JPanel();
app.textArea = new JTextArea("Type here",5, 20);
myPanel.add(app.textArea);
TextArea expands rows and columns as needed
JTextArea textArea = new JTextArea("Type here",5, 20);
JScrollPane scrollPane = new JScrollPane(textArea);
frame.setContentPane(scrollPane);
* Program this
* Use the selectAll and cut methods of JTextComponent, which
JTextArea inherits
..
Timer t = new Timer(1000, app);
t.start();
app.label = new JLabel("Time");
app.label.setBounds(20,20,200,20);
frame.getContentPane().add(app.label);
..
public void actionPerformed(ActionEvent e)
{
String now = (new java.util.Date()).toString();
label.setText(now);
}
JFrame frame = new JFrame("I am Celsius");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(20,30,200,200);
frame.getContentPane().setLayout(null);
ImageIcon icon = new ImageIcon("c:/celsius.jpg",
"Celsius");
JLabel label = new JLabel(icon);
label.setBounds(20,20,150,150);
frame.getContentPane().add(label);
frame.setVisible(true);
See source code
JScrollBar and JLabel
Constructor arguments
implements AdjustmentListener
adjustmentValueChanged
e.getValue()
* Program this
* The scroll bars determine the red, green and blue components
of the background of the panel
* See source code
* implements ActionListener
* isSelected()
* Program this
* The checkbox determines if the text in the label is left or
right aligned
* Come in groups – only 1 selected per group
* See demo code
* Make radiobuttons
* Make group
* Add radiobuttons to group
* ActionListener
* Modify the demo by adding more colour options
..
JPanel groupPanel = new JPanel();
groupPanel.setBounds(10,10,100,60);
groupPanel.setBorder(BorderFactory.createLineBo
rder(Color.black));
frame.getContentPane().add(groupPanel);
groupPanel.add(app.choice1);
groupPanel.add(app.choice2);
..
* See source code
* Data held in array
* List box shows array
* List box inside scroll pane
* myList.getModel().getElementAt(..
* See source code
* We want to add items to list
* So use a Vector not an array to hold data
* Check methods to delete items and copy to other listbox
* Add a button to the last example which deletes selected items
in the second list box
* A layout manager controls the positioning of components
* Components have a 'preferred size' so can avoid sizing them
* .pack() adjusts size of a container to fit components
from Swing tutorial on
java.sun.com
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("FlowLayout");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new FlowLayout());
JButton b1 = new JButton("Hello");
frame.getContentPane().add(b1);
JButton b2 = new JButton("Two");
frame.getContentPane().add(b2);
JTextField t1 = new JTextField("Text here");
frame.getContentPane().add(t1); Try this
Try re-sizing the frame at runtime
frame.pack();
Add more buttons
Add frame.setBounds
frame.setVisible(true);
Remove pack();
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("Border");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton b1 = new JButton("At the top");
frame.getContentPane().add(b1,BorderLayout.PAGE_STAR
T );
JButton b2 = new JButton("Bottom");
frame.getContentPane().add(b2,BorderLayout.PAGE_END);
JTextField t1 = new JTextField("Left");
frame.getContentPane().add(t1,BorderLayout.LINE_START)
;
JTextField t2 = new JTextField("Right");
Try this
frame.getContentPane().add(t2,BorderLayout.LINE_END);
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("Grid");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new
GridLayout(4,3,5,5));
for (int i=0; i<10; i++)
frame.getContentPane().add(new JButton(""+i));
frame.pack();
frame.setVisible(true);
* See source code
* Frame is null layout
* Frame has an upper and lower panel
* Upper panel null layout
* Lower panel is grid layout
* Note font of display
JMenuBar
JMenu
JMenuItem
Main app = new Main();
..
JMenuBar myMenuBar = new JMenuBar();
JMenu menu1 = new JMenu("File");
JMenuItem item = new JMenuItem("Exit");
item.addActionListener(app);
menu1.add(item);
myMenuBar.add(menu1);
frame.setJMenuBar(myMenuBar);
..
public void actionPerformed(ActionEvent e)
{
System.exit(0);
* See source code
Exercise
Copy this
Add a second option 'Edit' after 'File'
Put choices Undo, Redo, Cut Copy and Paste in it
Use appropriate icons if possible
..
.. frame is BorderLayout
..
JToolBar toolBar = new JToolBar("Test");
JButton butt1 = new JButton(new ImageIcon("icon.gif"));
toolBar.add(butt1);
..
frame.add(toolBar, BorderLayout.PAGE_START);
* JComponents have a paint() method
* This is called by the system when it needs to display the object
* Initially and eg after a re-size
* You can over-ride paint() to control the appearance of the
component
* This implies you sub-class the component
* The paint method has a Graphics object as a parameter
* This is a context eg color, font etc
* You tell the Graphics object to show things
public class MyFrame extends JFrame
{
public MyFrame()
{
super("Some title");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setBounds(20,30,230,180);
myPanel = new MyPanel();
myPanel.setOpaque(true);
public class MyPanel extends JPanel
setContentPane(myPanel);
{
setVisible(true);
public void paint(Graphics g)
}
{
g.drawLine(0,0,getWidth(),getHeight());
MyPanel myPanel;
g.drawString("Hello",getWidth()/2,getHeight()/2);
}
}
}
* Please check these tutorials to learn about matisse.
GUI Building in NetBeans IDE Tutorial
http://netbeans.org/kb/docs/java/quickstart-gui.html
NetBeans IDE GUI Builder Visual Feedback Legend
http://netbeans.org/kb/docs/java/quickstart-gui-legend.html
Handling Images in A GUI Application http://netbeans.org/kb/docs/java/guiimage-display.html
Adding a FileChooser to a GUI Application
http://netbeans.org/kb/docs/java/gui-filechooser.html
Creating a Graphical Client for Twitter
http://netbeans.org/kb/docs/websvc/twitter-swing.html
Designing a Basic Java Form Using the GridBag Customizer
http://netbeans.org/kb/docs/java/gbcustomizer-basic.html
Designing an Advanced Java Form Using the GridBag Customizer
http://netbeans.org/kb/docs/java/gbcustomizer-advanced.html
Designing a Swing GUI in NetBeans IDE Screencast
http://netbeans.org/kb/docs/java/gui-builder-screencast.html
* If you want your application support several languages, you
have to add internationalization.
* Internationalization commonly be called i8n.
* Please check tutorial about i8n with Matisse at
http://netbeans.org/kb/docs/java/gui-automatic-i18n.html
* SwingWorker used when you have background process / task
that time consuming process.
Create
SwingWorker
Procedure for
background
task
Procedure if
background
task completed
Start
background
task