Swing窗體(JFrame)
小問題
之前學過Awt包,繼承Frame類的那個窗體,有個很大的問題是,它不行正常的顯示中文在控件上,這就很難受。經過學習,我發現Swing窗體是沒有這個問題的,當然也可能是我電腦的問題。
Swing&AWT功能
- 界面設計
- 窗體、控件、面板、佈局管理
- 事件處理機制
Swing&AWT區別
- 兩個是圖形界面包
- AWT做圖形,使用本地操系統方法,圖像界面與本地操作系統一致
- Swing做圖形,使用自己的方法,與平臺無關。
- 使用Swing方式
一、Swing概述
1、完成第一個窗體
- 使用java.swing包
- 借用JFrame類
- 繼承
- 設計窗體
- 設置窗體大小
- 設置標題
- 設置關閉窗體按鈕
- 設置窗體顯示
import javax.swing.*;
public class JFrameTextRun {
public static void main(String[] args) {
new JFrameText();
}
}
class JFrameText extends JFrame{
public JFrameText(){
init();
}
public void init(){
setTitle("啦啦啦窗口標題");
setBounds(500,500,400,300);
// setSize(400,300); //大小 //同上
// setLocation(500,500);//啓動方位
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//設置默認的關閉方式
setVisible(true);//窗口是否可見
}
}
運行結果:
2、向窗體添加控件
- 繼承窗體
- 添加自己的控件
- 做爲窗體的成員屬性
- 設置控件的屬性
2.1、JTextField方法:
方法 | 說明 |
---|---|
JTextField() | 構造新的文本輸入框 |
JTextField(String text) | 構造一個新的文本輸入框,以指定文本作爲初始文本 |
getColumns() | 返回文本字段中的列數 |
setColumns(int columns) | 設置最多可顯示內容的列數 |
setHorizontalAlignment(int value) | 設置文本字段中文本的水平對齊方式:JTextField.LEFT JTextField.CENTER JTextField.RIGHT |
import javax.swing.*;
public class JFrameTextRunA{
public static void main(String[] args) {
new JFrameTextA();
}
}
class JFrameTextA extends JFrame{
public JFrameTextA(){
init();
}
public void init(){
setTitle("啦啦啦窗口標題");
setBounds(500,500,400,300);
// setSize(400,300); //大小 //同上
// setLocation(500,500);//啓動方位
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//設置默認的關閉方式
setVisible(true);//窗口是否可見
setResizable(false);
//------------------------------------------------------------------------
//2、向窗體添加控件
// 2.1、JTextField方法:
JTextField JTF1 = new JTextField();//構造新的文本輸入框
JTextField JTF2 = new JTextField("啦啦啦文本輸入框",1);//構造一個新的文本輸入框,以指定文本作爲初始文本
JTextField JTF3 = new JTextField(5);
JTF1.setBounds(20,20,200,50);
JTF2.setBounds(20,80,200,50);
JTF3.setBounds(20,140,200,50);
add(JTF1);
add(JTF2);
JTF3.setColumns(6);
JTF3.setText(String.valueOf(JTF3.getColumns()));//返回文本字段中的列數
JTF3.setColumns(6);
JTF3.setHorizontalAlignment(JTF3.RIGHT);//設置對齊方式
add(JTF3);
}
}
遺留問題:getColumns()
2.2、JButton方法:
方法 | 說明 |
---|---|
JButton() | 創建不帶文本和圖標的按鈕 |
JButton(Icon icon) | 創建帶圖標的按鈕 |
JButton(String text) | 創建帶文本的按鈕 |
JButton(String text,Icon icon) | 創建帶文本和圖標的按鈕 |
setRolloverlcon(Icon img) | 當鼠標經過時,顯示指定的圖標 |
setSelectedlcon(Icon img) | 當選擇按鈕時,顯示img指定的圖標 |
import javax.print.attribute.standard.JobName;
import javax.swing.*;
import java.awt.*;
public class TextJButton {
public static void main(String[] args) {
new winFrame();
}
}
class winFrame extends JFrame{
public winFrame(){
init();
}
public void init(){
setTitle("窗口標題");
setBounds(500,300,500,500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
setResizable(false);
//創建容器
Container container = this.getContentPane();
container.setLayout(null);//絕對佈局
////////////////////////////////////////////////
//創建不帶文本和圖標的按鈕
JButton jButton = new JButton();
// jButton.setText("按鈕A");
jButton.setBounds(0,10,200,50);
container.add(jButton);
/////////////////////////////////////////////////
//創建帶圖標的按鈕
JButton jButton1 = new JButton(new ImageIcon(".\\icon\\如何養豬.jpg"));
jButton1.setBounds(0,70,200,200);
container.add(jButton1);
/////////////////////////////////////////////////
//創建帶文本的按鈕
JButton jButton2 = new JButton("按鈕B,因爲A沒顯示,哈哈哈");
jButton2.setBounds(0,280,200,50);
container.add(jButton2);
/////////////////////////////////////////////////
//創建帶文本和圖標的按鈕
JButton jButton3 = new JButton("按鈕C"/*當圖片不存在時顯示*/,
new ImageIcon(".\\icon\\花瓣.png"));
jButton3.setBounds(0,340,300,100);
container.add(jButton3);
//當鼠標經過時,顯示指定的圖標setRolloverIcon
JButton jButton4 = new JButton();
jButton4.setBounds(210,10,150,200);
jButton4.setRolloverIcon(new ImageIcon(".\\icon\\淋光.jpg"));
jButton4.setSelectedIcon(new ImageIcon(".\\icon\\淋光.jpg"));
container.add(jButton4);
}
}
遺留問題:setRolloverIcon|setSelectedIcon
2.3、JCheckBox
方法 | 說明 |
---|---|
JCheckBox() | 創建初始非選中的複選框,且不帶文本或圖標 |
JCheckBox(String text) | 用指定的文本創建初始非選中的複選框 |
JCheckBox(String text,boolean selected) | 用指定文本創建一個複選框,並指定是否初始選中該複選框 |
import javax.swing.*;
import java.awt.*;
public class JCheckBoxText {
public static void main(String[] args) {
new JFrameText1();
}
}
class JFrameText1 extends JFrame {
public JFrameText1(){
init();
}
public void init(){
setTitle("窗口標題");
setVisible(true);
setBounds(500,300,500,500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
Container container=this.getContentPane();
container.setLayout(null);
/////////////////////////////////////////////
//創建初始非選中的複選框,且不帶文本或圖標
JCheckBox jCheckBox = new JCheckBox();
jCheckBox.setBounds(0,10,50,50);
container.add(jCheckBox);
//////////////////////////////////////////
//用指定的文本創建初始非選中的複選框
JCheckBox jCheckBox1 = new JCheckBox("複選框B");
jCheckBox1.setBounds(0,70,100,50);
container.add(jCheckBox1);
////////////////////////////////////////////
//用指定文本創建一個複選框,並指定是否初始選中該複選框
JCheckBox jCheckBox2 = new JCheckBox("複選框C",true);
jCheckBox2.setBounds(0,130,100,50);
container.add(jCheckBox2);
}
}
2.4、JRadioButton
方法 | 說明 |
---|---|
JRadioButton | 創建初始非選中的單選按鈕,不設置其文本 |
JRadioButton(String text) | 用指定的文本創建非選中的單選按鈕 |
JRadioButton(String text,boolean selected) | 用指定的文本和選中狀態創建單選按鈕 |
import javax.swing.*;
import java.awt.*;
public class JRadioButtonText {
public static void main(String[] args) {
new WindJFrame();
}
}
class WindJFrame extends JFrame {
public WindJFrame(){
init();
}
public void init(){
setTitle("窗口標題");
setVisible(true);
setBounds(500,300,500,500);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container container = this.getContentPane();
container.setLayout(null);
//////////////////////////////////////////
//創建初始非選中的單選按鈕,不設置其文本
JRadioButton jRadioButton = new JRadioButton();
jRadioButton.setBounds(0,10,200,100);
container.add(jRadioButton);
//////////////////////////////////////////
//用指定的文本創建非選中的單選按鈕
JRadioButton jRadioButton1 = new JRadioButton("單選按鈕B");
jRadioButton1.setBounds(0,120,200,100);
container.add(jRadioButton1);
///////////////////////////////////////////
//用指定的文本和選中狀態創建單選按鈕
JRadioButton jRadioButton2 = new JRadioButton("單選按鈕C",true);
jRadioButton2.setBounds(0,230,200,100);
container.add(jRadioButton2);
}
}
2.5、JComboBox
方法 | 說明 |
---|---|
JcomboBox() | 創建一個下拉框實例 |
addItem(Object obj) | 將項添加至項的列表 |
getItemAt(int index) | 返回指定索引位置的列表項 |
getItemCount() | 返回列表(作爲對象)中的項數 |
getSelectedItem() | 將當前選擇的項作爲一個對象返回 |
getSelectedIndex() | 返回當前選擇項的索引位置 |
import javax.swing.*;
import java.awt.*;
public class JComboBoxText {
public static void main(String[] args) {
new WindowJFrame();
}
}
class WindowJFrame extends JFrame{
JButton jButton;
JTextField jTextField1;
JComboBox jComboBox;
public WindowJFrame(){
init();
}
public void init(){
setTitle("窗口標題");
setVisible(true);
setBounds(500,300,500,500);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container container=this.getContentPane();
container.setLayout(null);//設置絕對佈局
//////////////////////////////////////////
//創建一個下拉框實例
//將項添加至項的列表addItem(Object obj)
jComboBox = new JComboBox();
jComboBox.setBounds(0,10,400,30);
jComboBox.addItem(new String("1"));
jComboBox.addItem(new String("2"));
jComboBox.addItem(new String("4"));
container.add(jComboBox);
//返回指定索引位置的列表項getItemAt(int index)
JTextField jTextField = new JTextField(String.valueOf(jComboBox.getItemAt(2)));
jTextField.setBounds(0,80,400,30);
container.add(jTextField);
//返回列表(作爲對象)中的項數getItemCount()
jTextField1 = new JTextField(String.valueOf(jComboBox.getItemCount()));
jTextField1.setBounds(0,120,400,30);
container.add(jTextField1);
System.out.println(jComboBox.getSelectedItem());
System.out.println(jComboBox.getSelectedIndex());
}
}
3、控件共同特性
- 所有控件都繼承Jcomponent類
- 共同方法
- setText();
- getText();
- setFont(font);
- setBackground(Color);
- setBound(x,y,width,length);
4、佈局管理
4.1、BorderLayout佈局
邊界佈局管理器,將容器劃分爲5個部分
- 不是五個部分都必須添加控件
- 中間組件會自動的調節大小(中間部分最強勢)
- JFrame,JDialog默認佈局管理器就是BorderLayout
方法 | 說明 |
---|---|
BorderLayout | 創建新的BorderLayout,組件之間沒有間距 |
setHgap(int hgap) | 將組件間的水平間距設置爲指定的值 |
setVgap(int vgap) | 將組件間的垂直間距設置爲指定的值 |
import javax.swing.*;
import java.awt.*;
public class BorderLayoutText extends JFrame {
private JButton jb1,jb2,jb3,jb4,jb5;
public BorderLayoutText(){
//創建組件
jb1=new JButton("中");
jb2=new JButton("北");
jb3=new JButton("東");
jb4=new JButton("南");
jb5=new JButton("西");
//添加組件
add(jb1, BorderLayout.CENTER);
add(jb2, BorderLayout.NORTH);
add(jb3, BorderLayout.EAST);
add(jb4, BorderLayout.SOUTH);
add(jb5, BorderLayout.WEST);
//設置窗體屬性
//窗口標題
setTitle("邊界佈局案例");
//設置窗體大小
setSize(500,500);
//設置窗體位置
setLocation(500,300);
// setBounds(500,300,500,500);
//設置關閉窗體同時退出JVM
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//顯示窗體
setVisible(true);
//窗口是否可以拖放大
setResizable(false);
}
}
class RunText{
public static void main(String[] args) {
new BorderLayoutText();
}
}
4.2、FlowLayout佈局
流佈局是面板的默認佈局管理器
方法 | 說明 |
---|---|
FlowLayout() | 構造新的中間對齊的FlowLayout,將垂直和水平間距保留爲5個像素 |
setAlignment(int align) | 設置指定佈局的對齊方式 |
setHgap(int hgap) | 設置指定佈局的水平間距 |
setVgap(int vgap) | 設置指定佈局的垂直間距 |
特點:
- 不限制他所管理的組件的大小,允許他們有最佳大小
- 當容器被縮放時,組件的位置可能發生變化,但是組件的大小不變
- 默認組件是居中對齊,可以通過FlowLayout(intalign)函數來指定對齊方式
import javax.swing.*;
import java.awt.*;
public class FlowLayoutText extends JFrame {
public static void main(String[] args) {
new FlowLayoutText();
}
public FlowLayoutText(){
super();
setTitle("流佈局管理器測試");
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(500,300,200,200);
Container container = this.getContentPane();//創建容器
container.setLayout(new FlowLayout(/*FlowLayout.LEFT*/));//設置容器佈局
//創建組件
final JButton jButton = new JButton("金");
final JButton jButton1 = new JButton("木");
final JButton jButton2 = new JButton("水");
final JButton jButton3 = new JButton("火");
final JButton jButton4 = new JButton("土");
//添加組件
container.add(jButton);
container.add(jButton1);
container.add(jButton2);
container.add(jButton3);
container.add(jButton4);
//設置佈局管理器,流式佈局默認是中間對齊
//我們要在new FlowLayout(FlowLayout.LEFT)設置,<-此時設置的左對齊
}
}
4.3、GridLayout佈局
網格佈局特點
- 組件的相對位置不會隨容器變化,但組件的大小會變
- 所有組件的大小是相同的
- 可以通過GridLayout(int rows,int cols,int hgap,int vgap)來指定網格的行/列,水平間隙/垂直間隙
方法 | 描述 |
---|---|
GridLayout() | 創建網格佈局,默認爲每個組件佔用一整列和一單行 |
GridLayout(int rows,int cols) | 用指定的行數和列數創建網格佈局 |
GridLayout(int rows,int cols,int hgap,int vgap) | 用指定的行數和列數、指定的水平個垂直間距創建網格佈局 |
setColumns(int cols) | 將相應的佈局中的列數設置爲指定值 |
setHgap(int hgap) | 將相應的佈局中的水平間距設置爲指定值 |
setVgap(int vgap) | 將相應的佈局中的垂直間距設置爲指定值 |
setRows(int rows) | 將相應佈局中的行數設置爲指定值 |
import javax.swing.*;
import java.awt.*;
public class GridLayoutText extends JFrame {
int size=9;
private JButton jbs[] = new JButton[size];
public static void main(String[] args) {
new GridLayoutText();
}
public GridLayoutText(){
//創建組件
for (int i = 0; i < size; i++) {
jbs[i] = new JButton(String.valueOf(i));
}
Container container = this.getContentPane();
//設置網格佈局管理器,設置3行3列,每個組件間隔水平方向10,垂直方向10個像素
container.setLayout(new GridLayout(3,3,10,10));
//添加組件
for (int i = 0; i < size; i++) {
container.add(jbs[i]);
}
//設置窗體
setTitle("網格佈局測試");
setSize(500,500);
setLocation(500,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
}
5、事件處理
5.1、動作事件ActionEvent
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ActionEventText extends JFrame {
private JLabel label;//標籤
public static void main(String[] args) {
new ActionEventText();
}
public ActionEventText(){
super();//調用父類方法,詳細功能在面向對象一章博客文檔
setTitle("動作事件示例");//標題
setBounds(100,100,500,375);//大小
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//設置關閉方式
setVisible(true);//窗口是否可見
setResizable(false);//窗口是否可以自由調整大小
//以上代碼最後一次備註
///////////////////////////////////////////////////
//添加標籤
label = new JLabel("歡迎登錄");
// label.setText("歡迎登錄");
label.setHorizontalAlignment(JLabel.CENTER);//設置對齊方式
Container container=this.getContentPane();//創建一個容器
container.add(label);
//添加按鈕
final JButton jButton = new JButton("登錄");
// jButton.setText("登錄");
jButton.addActionListener(new ButtonActionText());
container.add(jButton,BorderLayout.SOUTH);
}
//按鈕監聽器
class ButtonActionText implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
//獲得觸發此事件的按鈕對象
JButton jButton= (JButton) e.getSource();
//獲取觸發此事件的標籤文本
String jButtonName=e.getActionCommand();
if (jButtonName.equals("登錄")){
label.setText("您已成功登錄");//修改標籤提示信息
jButton.setText("退出");//修改按鈕提示信息
}else{
label.setText("您已安全退出");
jButton.setText("登錄");
}
}
}
}
5.2、FocusEvent焦點事件
import javax.swing.*;
import java.awt.*;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
public class FocusEventText extends JFrame {
private JTextField textField;
public static void main(String[] args) {
FocusEventText focusEventText = new FocusEventText();
}
public FocusEventText(){
setTitle("焦點事件示例");
setBounds(100,100,500,375);
setVisible(true);
getContentPane().setLayout(new FlowLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JLabel jLabel = new JLabel();//創建標籤
jLabel.setText("出生日期");
getContentPane().add(jLabel);
textField = new JTextField();
textField.setColumns(10);//設置對多可顯示內容的列數
textField.addFocusListener(new TextFocusListener());
getContentPane().add(textField);
final JButton jButton = new JButton();
jButton.setText("確定");
getContentPane().add(jButton);
}
class TextFocusListener implements FocusListener {
@Override
public void focusGained(FocusEvent e) {//獲取焦點時做什麼
textField.setText("");
}
@Override
public void focusLost(FocusEvent e) {//失去焦點時做什麼
textField.setText("2001-01-16");
}
}
}
5.3、鼠標事件
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class MouseEventText extends JFrame {
public static void main(String[] args) {
new MouseEventText();
}
public MouseEventText(){
super();//繼承父類構造器
setTitle("鼠標事件處理");
setBounds(100,100,500,375);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
final JLabel jLabel = new JLabel();//添加標籤
jLabel.setText("Hello");
//MouseAdapter適配器 MouseListener
//MouseAdapter適配器實現了MouseListener接口,
// 這樣做可以讓你不用重寫MouseListener接口中所有的方法
//只需要重寫你需要的方法。
/**jLabel.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("光標移入組件");
}
});*/
jLabel.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("單擊了鼠標按鍵");
int i=e.getButton();//獲取你單擊的鍵,返回一個int值
if (i==MouseEvent.BUTTON1)//1
System.out.println("單擊了左鍵1111");
if (i==MouseEvent.BUTTON2)//2
System.out.println("單擊中鍵2222");
if (i==MouseEvent.BUTTON3)//3
System.out.println("單擊右鍵3333");
int clickCount=e.getClickCount();//獲取鼠標單擊次數
System.out.println(clickCount);
}
//mousePressed鼠標按鍵被按下
//可以判斷是哪個鼠標按鍵
@Override
public void mousePressed(MouseEvent e) {
System.out.println("鼠標按鍵被按下");
int i=e.getButton();//獲取你按下的鍵,返回一個int值
if (i==MouseEvent.BUTTON1)
System.out.println("按下了左鍵1111");
if (i==MouseEvent.BUTTON2)
System.out.println("按下中鍵2222");
if (i==MouseEvent.BUTTON3)
System.out.println("按下右鍵3333");
}
//mouseReleased鼠標按鍵被按下
//可以判斷是哪個鼠標按鍵
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("鼠標按鍵被釋放");
int i=e.getButton();//獲取你釋放的鍵,返回一個int值
if (i==MouseEvent.BUTTON1)//1
System.out.println("釋放了左鍵1111");
if (i==MouseEvent.BUTTON2)//2
System.out.println("釋放中鍵2222");
if (i==MouseEvent.BUTTON3)//3
System.out.println("釋放右鍵3333");
}
//mouseEntered(移入)
//mouseExited(移除)
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("光標移入組件");
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println("光標移出組件");
}
});
getContentPane().add(jLabel, BorderLayout.CENTER);
}
}
5.3、鍵盤事件
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class KeyEventText extends JFrame {
public static void main(String[] args) {
new KeyEventText();
}
public KeyEventText(){
super();
setTitle("鍵盤事件示例");
setBounds(100,100,500,375);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container container = this.getContentPane();
final JLabel jLabel = new JLabel();
jLabel.setText("備註:");
container.add(jLabel, BorderLayout.WEST);
final JScrollPane jScrollPane = new JScrollPane();
container.add(jScrollPane, BorderLayout.CENTER);
final JTextArea jTextArea = new JTextArea();
jTextArea.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {//發生鍵盤事件
System.out.println("此次輸入的是“"+e.getKeyChar()+"”");
}
@Override
public void keyPressed(KeyEvent e) {
//getKeyCode獲取這個鍵對應的Code碼
String keyText = KeyEvent.getKeyText(e.getKeyCode());
if (e.isActionKey()){//是否是動作鍵
System.out.println("你按下的是動作鍵");
}else {
System.out.println("你按下的是非動作鍵“"+keyText+"”");
//getKeyChar 返回每次敲擊的字符,其實看單詞就能看出來了
char keyChar = e.getKeyChar();
switch (keyChar){
case KeyEvent.VK_CONTROL:
System.out.println("你按下了Ctrl");
break;
case KeyEvent.VK_SHIFT:
System.out.println("你按下了SHIFT");
break;
case KeyEvent.VK_ALT:
System.out.println("你按下了ALT");
break;
}
}
}
@Override
public void keyReleased(KeyEvent e) {//鍵盤鍵被釋放
String KeyText = KeyEvent.getKeyText(e.getKeyCode());
System.out.println("你釋放的是“"+KeyText+"”鍵");
System.out.println();
}
});
jTextArea.setLineWrap(true);//設置自動換行
jTextArea.setRows(3);
jTextArea.setColumns(15);
jScrollPane.setViewportView(jTextArea);
}
}
ps:不知道怎麼回事,運行出來窗體控件不會顯示,得拖動一下窗口邊框大小纔可以,如果有看到知道怎麼回事的朋友,還請回復告訴我一下下,嘻嘻。。