Swing 常用面板
- 在编程中,可以将面板添加到 JFrame 窗体中,也可以将子面板添加到上级面板中,然后将组件添加到面板中。通过面板可以对所有组件进行分层管理,即对不同关系的组件采用不同的布局管理方式, 使组件的布局更合理,软件的界面更美观;
1. JPanel 面板
- 如果将所有的组件都添加到由 JFrame 窗体提供的默认组件容器中,将存在如下两个问题:
- 一个界面中的所有组件只能采用一种布局方式,这样很难得到一个富于变化的界面;
- 有些布局方式只能管理有限个组件,例如 JFrame 窗体默认的 BorderLayout 布局管理器最多只能管理 5 个组件;
- 这两个问题通过 JPanel 面板就可以解决,首先将面板和组件添加到 JFrame 窗体中,然后再将子面板和组件添加到上级面板中,这样就可以向面板中添加数量不限的组件,并且通过对每个面板采用不同的布局管理器,真正解决众多组件的布局问题;JPanel 面板默认采用 FlowLayout 布局管理器;
- javax.swing.JPanel,详见:Class JPanel;
- 使用 JPanel 面板实现带有显示器的计算器界面:
import javax.swing.*;
import java.awt.*;
public class Test extends JFrame {
private final String[][] key = {
{"(", ")", "C", "<"},
{"1", "2", "3", "+"},
{"4", "5", "6", "-"},
{"7", "8", "9", "*"},
{".", "0", "=", "/"}};
private JButton[][] button = new JButton[5][4];
public static void main(String args[]) {
Test frame = new Test();
frame.setVisible(true);
}
public Test() {
super();
setTitle("Regino");
setResizable(false);
setBounds(100, 100, 230, 230);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPanel viewPanel = new JPanel();
getContentPane().add(viewPanel, BorderLayout.NORTH);
JTextField textField = new JTextField();
textField.setEditable(false);
textField.setHorizontalAlignment(SwingConstants.RIGHT);
textField.setColumns(18);
viewPanel.add(textField);
final JPanel buttonPanel = new JPanel();
final GridLayout gridLayout = new GridLayout(5, 0);
gridLayout.setVgap(0);
gridLayout.setHgap(0);
buttonPanel.setLayout(gridLayout);
getContentPane().add(buttonPanel, BorderLayout.CENTER);
for (int row = 0; row < key.length; row++) {
for (int col = 0; col < key[row].length; col++) {
button[row][col] = new JButton(key[row][col]);
buttonPanel.add(button[row][col]);
}
}
final JLabel leftLabel = new JLabel();
leftLabel.setPreferredSize(new Dimension(2, 0));
getContentPane().add(leftLabel, BorderLayout.WEST);
final JLabel rightLabel = new JLabel();
rightLabel.setPreferredSize(new Dimension(2, 0));
getContentPane().add(rightLabel, BorderLayout.EAST);
}
}
- 效果图:
2. JScrollPane 面板
- JScrollPane 类实现了一个带有滚动条的面板, 用来为某些组件添加滚动条;
- javax.swing.JScrollPane,详见:Class JScrollPane;
a. 常用方法
方法 |
说明 |
setViewportView(Component view) |
设置在滚动面板中显示的组件对象 |
setHorizontalScrollBarPolicy(int policy) |
设置水平滚动条的显示策略 |
setVerticalScrollBarPolicy(int policy) |
设置垂直滚动条的显示策略 |
setWheelScrollingEnabled(false) |
设置滚动面板的滚动条是否支持鼠标的滚动轮 |
b. 静态常量
- 在调用方法时,可以选择 JScrollPane 类中与滚动条显示策略对应的静态常量;
静态常量 |
常量值 |
滚动条的显示策略 |
HORIZONTAL_SCROLLBAR_AS_NEEDED |
30 |
设置水平滚动条只在需要时显示(默认策略) |
HORIZONTAL_SCROLLBAR_NEVER |
31 |
设置水平滚动条永远不显示 |
HORIZONTAL_SCROLLBAR_ALWAYS |
32 |
设置水平滚动条一直显示 |
VERTICAL_SCROLLBAR_AS_NEEDED |
20 |
设置垂直滚动条只在需要时显示(默认策略) |
VERTICAL_SCROLLBAR_NEVER |
21 |
设置垂直滚动条永远不显示 |
VERTICAL_SCROLLBAR_ALWAYS |
22 |
设置垂直滚动条一直显示 |
- 在开发应用程序时,对事件的处理是必不可少的,只有这样才能够实现软件与用户的交互。常用事件有动作事件处理、焦点事件处理、鼠标事件处理和键盘事件处理;
c. 应用滚动面板
import javax.swing.*;
import java.awt.*;
public class Test extends JFrame {
public Test() {
final JScrollPane frameScrollPane = new JScrollPane();
frameScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
getContentPane().add(frameScrollPane);
final JPanel framePanel = new JPanel();
framePanel.setLayout(new BorderLayout());
frameScrollPane.setViewportView(framePanel);
final JPanel typePanel = new JPanel();
framePanel.add(typePanel, BorderLayout.NORTH);
final JLabel typeLabel = new JLabel();
typeLabel.setText("Language ");
typePanel.add(typeLabel);
JScrollPane typeScrollPane = new JScrollPane();
typeScrollPane
.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
typePanel.add(typeScrollPane);
String[] items = {"Bash", "C", "C++", "C#", "CLike", "CSS", "Go", "Handlebars", "Java", "JavaScript", "PHP", "Python"};
JList list = new JList(items);
list.setVisibleRowCount(4);
typeScrollPane.setViewportView(list);
final JLabel label = new JLabel();
label.setPreferredSize(new Dimension(0, 0));
typePanel.add(label);
final JPanel contentPanel = new JPanel();
framePanel.add(contentPanel);
final JLabel contentLabel = new JLabel();
contentLabel.setText("Note ");
contentPanel.add(contentLabel);
JScrollPane contentScrollPane = new JScrollPane();
contentScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
contentPanel.add(contentScrollPane);
JTextArea textArea = new JTextArea();
textArea.setRows(3);
textArea.setColumns(0);
textArea.setLineWrap(true);
contentScrollPane.setViewportView(textArea);
}
public static void main(String[] args) {
Test t = new Test();
t.setSize(300, 200);
t.setResizable(false);
t.setTitle("Regino");
t.setVisible(true);
t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
- 在该程序中,为 JFrame 窗口添加了一个滚动面板,窗体中的所有组件都在滚动面板或其子面板中,该面板的水平滚动条在需要时才显示出来,垂直滚动条则一直显示;
- JList 和 JTextArea 组件均添加到了一个滚动面板中:JList 组件的滚动面板的水平滚动条在需要时才显示,垂直滚动条则一直显示;JTextArea 组件的滚动面板的水平滚动条则一直显示,而垂直滚动条则在需要时才显示;
- 效果图: