本文提到了如下内容:
Using Layout Managers
Compound Borders
Combo Boxes
Multiple Images
该程序的主框架如下:
//Create the phase selection and display panels.
selectPanel = new JPanel();
displayPanel = new JPanel();
//Add various widgets to the sub panels.
addWidgets();
//Create the main panel to contain the two sub panels.
mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS));
mainPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
//Add the select and display panels to the main panel.
mainPanel.add(selectPanel);
mainPanel.add(displayPanel);
还比较好理解。
常见的布局管理器有:BorderLayout, BoxLayout, FlowLayout, GridLayout, GridBagLayout和SpringLayout。
边框:
selectPanel.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder("Select Phase"),
BorderFactory.createEmptyBorder(5,5,5,5)));
下拉选框:
JComboBox phaseChoices = null;
...
//Create combo box with lunar phase choices.
String[] phases = { "New", "Waxing Crescent", "First Quarter",
"Waxing Gibbous", "Full", "Waning Gibbous",
"Third Quarter", "Waning Crescent" };
phaseChoices = new JComboBox(phases);
phaseChoices.setSelectedIndex(START_INDEX);
下拉选框的事件处理:
phaseChoices.addActionListener(this);
...
public void actionPerformed(ActionEvent event) {
if ("comboBoxChanged".equals(event.getActionCommand())) {
//Update the icon to display the new phase
phaseIconLabel.setIcon(images[phaseChoices.getSelectedIndex()]);
}
}
多图片操作:
final static int NUM_IMAGES = 8;
final static int START_INDEX = 3;
ImageIcon[] images = new ImageIcon[NUM_IMAGES];
...
//Get the images and put them into an array of ImageIcon.
for (int i = 0; i < NUM_IMAGES; i++) {
String imageName = "images/image" + i + ".jpg";
System.out.println("getting image: " + imageName);
URL iconURL = LunarPhases.class.getResource(imageName);
ImageIcon icon = new ImageIcon(iconURL);
images[i] = icon;
}
importjava.awt.event.*;
import javax.swing.*;
public class LunarPhases implements ActionListener {
final static int NUM_IMAGES = 8;
final static int START_INDEX = 3;
ImageIcon[] images = new ImageIcon[NUM_IMAGES];
JPanel mainPanel, selectPanel, displayPanel;
JComboBox phaseChoices = null;
JLabel phaseIconLabel = null;
public LunarPhases() {
//创建状态选择面板和显示面板。
selectPanel = new JPanel();
displayPanel = new JPanel();
//增加组件到子面板。
addWidgets();
//创建主面板来包含上面的两个子面板。
mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS));
mainPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
//把两个子面板增加到主面板中。
mainPanel.add(selectPanel);
mainPanel.add(displayPanel);
}
/*
* 获取图片并安装组件。
*/
private void addWidgets() {
//获取图片并把他们放入一个 ImageIcons 数组中。
for (int i = 0; i < NUM_IMAGES; i++) {
images[i] = createImageIcon("/images/image" + i + ".jpg");
}
/*
* 创建一个用来显示图片的 label 并给他边框。
*/
phaseIconLabel = new JLabel();
phaseIconLabel.setHorizontalAlignment(JLabel.CENTER);
phaseIconLabel.setVerticalAlignment(JLabel.CENTER);
phaseIconLabel.setVerticalTextPosition(JLabel.CENTER);
phaseIconLabel.setHorizontalTextPosition(JLabel.CENTER);
phaseIconLabel.setBorder(
BorderFactory.createCompoundBorder(
BorderFactory.createLoweredBevelBorder(),
BorderFactory.createEmptyBorder(5, 5, 5, 5)));
phaseIconLabel.setBorder(
BorderFactory.createCompoundBorder(
BorderFactory.createEmptyBorder(0, 0, 10, 0),
phaseIconLabel.getBorder()));
//创建一个可以选择月亮状态的 combo box 。
String[] phases =
{
"New",
"Waxing Crescent",
"First Quarter",
"Waxing Gibbous",
"Full",
"Waning Gibbous",
"Third Quarter",
"Waning Crescent" };
phaseChoices = new JComboBox(phases);
phaseChoices.setSelectedIndex(START_INDEX);
//显示第一副图片。
phaseIconLabel.setIcon(images[START_INDEX]);
phaseIconLabel.setText("");
//给选择面板增加边框。
selectPanel.setBorder(
BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder("Select Phase"),
BorderFactory.createEmptyBorder(5, 5, 5, 5)));
//给显示面板增加边框。
displayPanel.setBorder(
BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder("Display Phase"),
BorderFactory.createEmptyBorder(5, 5, 5, 5)));
//增将 combo box 到选择面板以及图像 label 到显示面板。
displayPanel.add(phaseIconLabel);
selectPanel.add(phaseChoices);
//给 combo box 增加事件。
phaseChoices.addActionListener(this);
}
public void actionPerformed(ActionEvent event) {
if ("comboBoxChanged".equals(event.getActionCommand())) {
//更新图标以便显示新的状态。
phaseIconLabel.setIcon(images[phaseChoices.getSelectedIndex()]);
}
}
/** Returns an ImageIcon, or null if the path was invalid. */
protected static ImageIcon createImageIcon(String path) {
java.net.URL imageURL = LunarPhases.class.getResource(path);
if (imageURL == null) {
System.err.println("Resource not found: " + path);
return null;
} else {
return new ImageIcon(imageURL);
}
}
/**
* 创建图形用户界面以便显示,为了线呈得安全,这里使用了 event-dispatching thread 调用
*/
private static void createAndShowGUI() {
//Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);
//Create a new instance of LunarPhases.
LunarPhases phases = new LunarPhases();
//Create and set up the window.
JFrame lunarPhasesFrame = new JFrame("Lunar Phases");
lunarPhasesFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
lunarPhasesFrame.setContentPane(phases.mainPanel);
//Display the window.
lunarPhasesFrame.pack();
lunarPhasesFrame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}