2015/6/19
1、在Swing中的所有组件均继承自javax.swing.JComponent
2、在Swing中,几乎所有的组件上都能够安置其他的组件,同时也可以注册各种监控事件。
3、布局管理器是个特定组件相关联的java对象,它大多数是背景组件。布局管理器用来控制所关联组件上携带的其他组件。
布局管理器有几种不同的类型,每个背景组件都可以有自定义规则的布局管理器。
布局管理器对组件大小的设定,按照实际情况来定。
(1)BorderLayout
这个管理器把背景组件分割成5个区域,每个区域只能放上一个组件。由此管理员安置的组件通常不会取得默认的大小。
*这是框架默认的布局管理器。
frame.getContentPane().add(BorderLayout.EAST,button);
如果组件添加到东西两侧,那么布局管理器只会考虑他们的宽度,如果是添加到南北两侧,则之后考虑他们的高度。
而中间的区域要看周围的限制还剩下什么。
(2)FlowLayout
这个管理器将组件依照理想的大小呈现,并且从左到右依次加入,以可能会换行的方式排列。
*这是面板默认的布局管理器。
panel.add();
面板本身是没有高度和宽度的,她的高度和宽度要由它内部的组件决定。
如果添加两个组件的话,两个组件会并列排为一排,面板的宽度也会增加,直到达到背景frame的宽度
(3)BoxLayout
按照理想大小已加入的顺序排列,但是是以垂直的方向来排列的。不会自动换行,需要插入某种类似换行的机制来强制组件换行。
与FlowLayout布局不同,及时水平宽度足以容纳组件,他还是会用新的行来排列组件。组件会自动的排成一列。面板的宽与最宽的组件相当。
panel.setLayout(new BoxLayout(panel,BoxLayout.Y-AXIS));
//换掉布局管理器,构造函数为:管理的组件、使用的坐标轴
//setLayout()方法用来替换布局管理器。
4、一般情况下,我们不在JFrame上直接添加组件,而是通过JPanel。
Swing组件
1、JTextField(单行文本框)
(1)构造函数:
JTextField field=new JTextField(20);//20代表字符
JTextField field=new JTextField("Your Name");
(2)取得文本
field.getText();
(3)取得用户输入完毕按下“回车”的事件
field.addActionListener(this);
(4)设定内容
field.setText("whatever");
field.setText("");
(5)选取文本段的内容(即全选功能)
field.selectAll();
(6)将GUI的焦点设置为文本框,以方便用户输入
field.requestFocus();
2、JTextArea(多行文本框)
多行文本框需要添加到ScrollPanel上才能实现滚动条的功能。
(1)构造函数
JTextArea text=new JTextArea(10,20);
10行20个字符宽度
(2)滚动条的设置
滚动条构造函数:(将多行文本框添加到滚动条对象上)
JScrollPanel scroller=new JScrollPanel(text);
启动文本框的自动换行
text.setLineWrap(true);
设置垂直方向在任何情况下都显示滚动条:
scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AWAYS);
设置在水平方向上不显示滚动条:
scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
将多行文本框添加到面板上(要添加滚动条对象到面板上)
panel.add(scroller);
(3)
替换文字内容:
text.setText("...");
加入文字
text.append("...");
(4)全选
text.selectAll();
(5)将GUI的焦点设置为文本框,以方便用户输入
text.requestFocus();
package learn_swing;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class TextArea1 implements ActionListener{
JTextArea text;
public static void main(String[] args){
TextArea1 gui=new TextArea1();
gui.go();
}
void go(){
JFrame frame=new JFrame();
JPanel panel=new JPanel();
JButton button=new JButton("Just click it");
button.addActionListener(this);
text=new JTextArea(10,20);
text.setLineWrap(true);
JScrollPane scroller=new JScrollPane(text);
scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
panel.add(scroller);
frame.getContentPane().add(BorderLayout.CENTER,panel);
frame.getContentPane().add(BorderLayout.SOUTH,button);
frame.setSize(350,300);
frame.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自动生成的方法存根
text.append("button clicked \n");
}
}
(1)构造函数
JCheckBox check=new JCheckBox("goes to 11");
(2)监听item事件
check.addItemListener(this);
(3)处理事件
public void itemStateChanged(ItemEvent ev){
}
(4)返回check是否被选中,选中为true,否则为false
check.isSelected()
(5)用程序来选择
check.setSelected(true);
(1)构造函数
JList的构造函数需要一个任意类型的数组,不一定是String,但会用String来显示项目
String[] listString={"1","2","3","4"};
JList list=new JList(listString);
(2)显示垂直的滚动条
JScrollPane scroller=new JScrollPane(list);
scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
(3)设置显示的行数:
list.setVisibleRowCount(4);
(4)限制用户只能选择一个项目
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
(5)对事件注册
list.addListSelectionListener(this);
(6)处理事件:
public void valueChanged(ListSelectionEvent lse){
if(!lse.getValueIsAdjusting()){
String selection=(String)list.getSelectedValue();
}
}
getValueIsAdjusting() 如果该值在进行一系列更改,则返回 true。 setValueIsAdjusting(boolean valueIsAdjusting) 如果将来对该模型的值的更改被视为单个事件,则此属性为 true。此处的例子中必须要有 if(!lse.getValueIsAdjusting()) ,否则会得到两次事件的相应
list.getSelectedValue()用于取到用户选中的值,这个值不一定是String类型的,所以需要转换