1 package GUI_experience; 2 import java.awt.*; 3 import java.awt.Container; 4 import java.awt.FlowLayout; 5 import java.awt.event.ActionEvent; 6 import java.awt.event.ActionListener; 7 import javax.imageio.stream.ImageInputStream; 8 import javax.swing.*; 9 import java.awt.event.FocusEvent; 10 import java.awt.event.FocusListener; 11 import java.net.*; 12 /**class myFrame extends Frame{ 13 myFrame(String s){ 14 super(s); 15 this.setBackground(Color.blue); 16 this.setSize(300,200); 17 this.setVisible(true); 18 } 19 public static void main(String []args){ 20 myFrame mfr=new myFrame("First GUI project"); 21 } 22 }*/ 23 24 /**class MyFrame extends Frame{ 25 static int id=0; 26 MyFrame(int x,int y,int w,int h,Color myColor){ 27 super("MyFrame first project "+(++id)); 28 this.setBackground(myColor); 29 this.setBounds(x,y,w,h); 30 this.setLayout(null); 31 this.setVisible(true); 32 } 33 public static void main(String[]args){ 34 MyFrame mf=new MyFrame(200,300,200,200,Color.gray); 35 } 36 }*/ 37 38 /** 39 * 窗体示例JFrame 40 * 通常继承自JFrame类来使用而不是在类的main函数中创建一个JFrame对象 41 * 42 */ 43 class Demo2 extends JFrame{ 44 Demo2(){ 45 46 setVisible(true);//Visible 47 48 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭按键,直接关闭 49 //setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);//关闭按键等于没用 50 //setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);//关闭但是不停止程序 51 //setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//释放程序资源 52 setBounds(300,500,300,200);//Location and Size 53 //setSize(300,200); 54 //setLocation(300,500); 55 setTitle("This is a Frame."); 56 57 Container c = getContentPane();//获取窗体容器 58 c.setBackground(Color.white); 59 JLabel jl=new JLabel("Right here is a frame."); 60 c.add(jl); 61 // c.remove(jl); 62 c.validate();//验证容器中的组件,等于刷新一下 63 // f.setContentPane(c);//重新载入容器,与上式等效,但是上式更好 64 setResizable(false); 65 System.out.println(getX()); 66 System.out.println(getY()); 67 } 68 69 public static void main(String[] args) { 70 new Demo2(); 71 72 } 73 } 74 75 /** 76 * JDialog对话框示例 77 * 78 */ 79 class Demo3 extends JDialog{ 80 Demo3(JFrame frame){//在对话框的参数列表中就要包含父窗体 81 super(frame,"Title of DIALOG",true);//父窗体对象,对话框标题,是否阻塞父窗体 82 Container c=getContentPane(); 83 JLabel jl=new JLabel("这是一个标签"); 84 jl.setForeground(Color.RED);//设置字体颜色为红色 85 //jl.setText("");更改标签内容 86 //jl.getText();获取标签内容 87 jl.setFont(new Font("宋体",Font.BOLD,15));//设置字体 88 c.add(jl);//添加一段标签 89 90 JLabel pic=new JLabel("这是一个展示图片的标签"); 91 // URL url=Demo3.class.getResource("pycharm_inter.png");//获取图片URL路径,要求图片和此文件在同一包内 92 // Icon icon = new ImageIcon(url); 93 Icon icon = new ImageIcon("src/GUI_experience/pycharm_inter.png");//直接写出图片相应路径也能得到图片 94 // jl.setSize(20,20);//设置标签大小并不能改变图片大小 95 pic.setIcon(icon);//添加图片 96 c.add(pic); 97 setBounds(100,100,500,400); 98 99 }100 101 public static void main(String[] args) {102 JFrame f =new JFrame("Father Frame");103 f.setBounds(50,50,300,300);104 Container c=f.getContentPane();105 JButton btn =new JButton("Push out a DIALOG");106 c.setLayout(new FlowLayout());107 c.add(btn);108 f.setVisible(true);109 f.setDefaultCloseOperation(EXIT_ON_CLOSE);110 /**111 * 重要部分:给按钮添加监听(使按钮生效)112 *113 */114 btn.addActionListener(new ActionListener() {115 public void actionPerformed(ActionEvent actionEvent) {116 Demo3 d =new Demo3(f);117 d.setVisible(true);//对话框最好在main中设置窗体可见118 }119 });120 }121 122 }123 124 class Exp_absoluteLayout extends JFrame{125 Exp_absoluteLayout(){126 setBounds(300,300,200,150);127 setDefaultCloseOperation(EXIT_ON_CLOSE);128 Container c = getContentPane();129 130 c.setLayout(null);//布局参数设置为null即为绝对布局,此时组件大小和位置只由设定的坐标决定(与窗体大小无关)131 JButton jb1 = new JButton("Button_1"), jb2 = new JButton("Button_2");132 jb1.setBounds(10,30,120 ,30);133 jb2.setBounds(60,70,100,20);134 c.add(jb1);135 c.add(jb2);136 137 setVisible(true);138 139 140 }141 public static void main(String[] args) {142 new Exp_absoluteLayout();143 }144 }145 146 class Exp_FlowLayout extends JFrame{147 Exp_FlowLayout(){148 setVisible(true);149 setDefaultCloseOperation(EXIT_ON_CLOSE);150 setBounds(300,300,200,150);151 152 Container c = getContentPane();153 for(int i=0;i<10;i++){154 c.add(new JButton("Button_"+i));155 }156 // setLayout(new FlowLayout());//默认居中对齐157 setLayout(new FlowLayout(FlowLayout.RIGHT,20,20));//设置为右对齐,水平间距20,竖直间距20158 }159 160 public static void main(String[] args) {161 new Exp_FlowLayout();162 }163 }164 165 class Exp_BorderLayout extends JFrame{166 Exp_BorderLayout(){167 setBounds(100,100,350,200);168 setDefaultCloseOperation(EXIT_ON_CLOSE);169 170 171 Container c = getContentPane();172 c.setLayout(new BorderLayout());173 JButton jb1=new JButton("中"),174 jb2=new JButton("东"),175 jb3=new JButton("西"),176 jb4=new JButton("南"),177 jb5=new JButton("北");178 c.add(jb1,BorderLayout.CENTER);179 c.add(jb2,BorderLayout.EAST);180 c.add(jb3,BorderLayout.WEST);181 c.add(jb4,BorderLayout.SOUTH);182 c.add(jb5,BorderLayout.NORTH);183 c.setVisible(true);184 setVisible(true);//tip:只有将设置可见性放在最后才能保证所有组件都可见185 }186 187 public static void main(String[] args) {188 new Exp_BorderLayout();189 }190 }191 192 class Exp_GridLayout extends JFrame{193 Exp_GridLayout(){194 setBounds(100,100,300,300);195 setDefaultCloseOperation(EXIT_ON_CLOSE);196 197 Container c = getContentPane();198 // c.setLayout(new GridLayout(7,3,5,5));//网格布局,7行3列,水平间距5,竖直间距5199 c.setLayout(new GridLayout(6,4));//紧密无缝隙排列200 for(int i=0;i<23;i++){//如果组件数量超过网格布局,每当不足时则多出一列201 c.add(new JButton("Button_"+i));202 }203 setVisible(true);204 }205 206 public static void main(String[] args) {207 new Exp_GridLayout();208 }209 }210 211 class Exp_GridBagFLayout {212 JFrame f = new JFrame();213 Container c= f.getContentPane();214 215 void createFrame(){216 f.setSize(800,600);217 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);218 c.setLayout(new GridBagLayout());219 f.setLocationRelativeTo(null);220 }221 void init(){222 GridBagConstraints g1 = new GridBagConstraints();223 c.add(new JButton("Btn1"),g1);224 225 GridBagConstraints g2 = new GridBagConstraints();226 g2.gridx=1;227 g2.gridy=1;228 c.add(new JButton("Btn2"),g2);229 230 GridBagConstraints g3 = new GridBagConstraints();231 g3.gridx=2;232 g3.gridy=2;233 c.add(new JButton("Btn3"),g3);234 }235 void createButton(){236 for(int i=0;i<9;i++){237 GridBagConstraints g1 = new GridBagConstraints();238 g1.gridx=0;239 g1.gridy=i;//标定位置(左上角)240 c.add(new JButton("Btn"),g1);241 242 GridBagConstraints g2 = new GridBagConstraints();243 g2.gridx=i;244 g2.gridy=0;245 c.add(new JButton("Btn"),g2);246 }247 }248 249 void init2(){250 GridBagConstraints g1 = new GridBagConstraints();251 g1.gridx=1;252 g1.gridy=1;253 c.add(new JButton("Btn1"),g1);254 255 GridBagConstraints g2 = new GridBagConstraints();256 g2.gridx=2;257 g2.gridy=2;258 g2.gridwidth=2;259 g2.gridheight=1;//占据位置:两行一列260 c.add(new JButton("Btn2"),g2);261 262 GridBagConstraints g3 = new GridBagConstraints();263 g3.gridx=4;264 g3.gridy=4;265 g3.gridwidth=2;266 g3.gridwidth=2;267 c.add(new JButton("Btn3"),g3);268 }269 void init3(){270 GridBagConstraints g1 = new GridBagConstraints();271 g1.gridx=1;272 g1.gridy=1;273 g1.gridwidth=2;274 g1.gridheight=2;275 g1.fill=GridBagConstraints.NONE;276 c.add(new JButton("NONE"),g1);277 278 GridBagConstraints g2 = new GridBagConstraints();279 g2.gridx=3;280 g2.gridy=1;281 g2.gridheight=2;282 g2.gridwidth=2;283 g2.fill=GridBagConstraints.HORIZONTAL;//填充方式:水平填充284 c.add(new JButton("HORIZONTAL"),g2);285 286 GridBagConstraints g3 = new GridBagConstraints();287 g3.gridx=5;288 g3.gridy=1;289 g3.gridwidth=2;290 g3.gridheight=2;291 g3.fill=GridBagConstraints.VERTICAL;//填充方式:竖直填充292 c.add(new JButton("VERTICAL"),g3);293 294 GridBagConstraints g4 = new GridBagConstraints();295 g4.gridx=7;296 g4.gridy=1;297 g4.gridwidth=2;298 g4.gridheight=2;299 g4.fill=GridBagConstraints.BOTH;//填充方式:完全填充300 c.add(new JButton("BOTH"),g4);301 }302 void init4(){303 GridBagConstraints g1 = new GridBagConstraints();304 g1.gridx=1;305 g1.gridy=1;306 g1.gridwidth=2;307 g1.gridheight=2;308 g1.fill=GridBagConstraints.NONE;309 g1.anchor=GridBagConstraints.NORTHWEST;//占据方位:所占据区域的左上角(西北角)310 c.add(new JButton("."),g1);311 }312 void init5(){313 GridBagConstraints g1 = new GridBagConstraints();314 g1.gridx=1;315 g1.gridy=1;316 g1.gridwidth=2;317 g1.gridheight=2;318 g1.insets = new Insets(0,0,10,10);//偏移像素值319 c.add(new JButton("."),g1);320 }321 void init6(){322 GridBagConstraints g1 = new GridBagConstraints();323 g1.gridx=1;324 g1.gridy=1;325 g1.gridwidth=2;326 g1.gridheight=2;327 g1.ipadx=10;328 g1.ipady=10;//首选位置329 c.add(new JButton("NONE"),g1);330 }331 void init7(){332 GridBagConstraints g1 = new GridBagConstraints();333 g1.gridx=1;334 g1.gridy=1;335 g1.gridwidth=2;336 g1.gridheight=2;337 g1.weightx=10;338 g1.weighty=10;//当窗体大小足够大时占据的空间(如果不够大则迁就窗体进行回缩339 c.add(new JButton("NONE"),g1);340 }341 public static void main(String[] args) {342 Exp_GridBagFLayout eg = new Exp_GridBagFLayout();343 eg.createFrame();344 eg.createButton();345 eg.init7();346 eg.f.setVisible(true);347 }348 }349 350 class Demo4 extends JFrame{351 Demo4(){352 setBounds(100,100,190,120);353 setDefaultCloseOperation(EXIT_ON_CLOSE);354 Container c = getContentPane();355 c.setLayout(null);356 357 JComboBox<String> cb = new JComboBox<String>();//建立下拉列表,可以使用泛型确定条目类型358 cb.addItem("身份证");359 cb.addItem("学生证");360 cb.addItem("工作证");361 362 String [] items = {"1","2","3"};//利用字符串数组创建下拉列表363 JComboBox<String> cb2 = new JComboBox<>(items);364 365 JComboBox<String> cb3 = new JComboBox<>();366 String [] item = {"学生证","驾驶证","毕业证"};367 ComboBoxModel cm = new DefaultComboBoxModel<>(item);//建立下拉列表模型并向其中加入元素368 cb3.setModel(cm);//利用下拉列表模型创建下拉列表369 370 cb3.setEditable(true);//设定下拉框中值可编辑371 cb3.setBounds(10,10,80,21);372 c.add(cb3);373 374 JButton jb = new JButton("打印");375 jb.addActionListener(new ActionListener() {376 377 public void actionPerformed(ActionEvent actionEvent) {378 System.out.println("索引:"+cb3.getSelectedIndex());379 System.out.println("值:"+cb3.getSelectedItem());380 }381 });382 jb.setBounds(100,10,60,20);383 c.add(jb);384 385 386 setVisible(true);387 }388 389 public static void main(String[] args) {390 Demo4 d4 = new Demo4();391 }392 393 }394 395 class Exp_Jlist extends JFrame{396 Exp_Jlist(){397 setBounds(100,100,217,167);398 setDefaultCloseOperation(EXIT_ON_CLOSE);399 400 Container c = getContentPane();401 c.setLayout(null);402 403 404 String items [] ={"1","2","3","4","5","6","7","8"};405 // JList<String> jl = new JList<>(items);406 407 DefaultListModel<String> mod = new DefaultListModel<>();//创建数据模型408 for(String tmp:items){409 mod.addElement(tmp);//向数据模型中添加元素410 }411 mod.addElement("AnotherElem");412 JList<String> jl = new JList<>();413 jl.setModel(mod);//为创建的列表框提供模型,方便更改元素414 415 // jl.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//选择模式:只能选择1个元素416 // jl.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);//只能选择相邻元素417 jl.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);//选择不受限制(按ctrl)418 419 JButton jb = new JButton("确认");420 jb.setBounds(120,90,70,25);421 jb.addActionListener(new ActionListener() {422 public void actionPerformed(ActionEvent actionEvent) {423 java.util.List<String> str = jl.getSelectedValuesList();//获取列表框中元素424 for(String st:str){425 System.out.println(st);426 }427 }428 });429 c.add(jb);430 431 JScrollPane js = new JScrollPane(jl);//添加滚动条432 js.setBounds(10,10,100,100);//如果添加了滚动条,列表框的大小由滚动条决定433 c.add(js);434 setVisible(true);435 }436 437 public static void main(String[] args) {438 new Exp_Jlist();439 }440 }441 442 class Exp_JTextField extends JFrame{443 Exp_JTextField(){444 setBounds(100,100,250,100);445 setDefaultCloseOperation(EXIT_ON_CLOSE);446 Container c =getContentPane();447 c.setLayout(new FlowLayout());448 449 JTextField jt = new JTextField("aaa",20);//创建文本框,同时可以创建默认文本和长度450 jt.setColumns(20);//也可以通过此方法设置长度451 jt.setText("aaa");//也可以通过此方法设置文本452 jt.setFont(new Font("宋体",Font.PLAIN,20));//设置字体453 c.add(jt);454 455 JButton jb = new JButton("确认");456 jb.addActionListener(new ActionListener() {457 @Override458 public void actionPerformed(ActionEvent actionEvent) {459 System.out.println(jt.getText());//获取文本框中的文本460 jt.setText("");//点击完按钮之后清空文本461 jt.requestFocus();//获取光标462 }463 });464 c.add(jb);465 setVisible(true);466 }467 468 public static void main(String[] args) {469 new Exp_JTextField();470 }471 }472 473 class Exp_JPasswordField extends JFrame{474 Exp_JPasswordField(){475 setBounds(100,100,500,100);476 setDefaultCloseOperation(EXIT_ON_CLOSE);477 Container c = getContentPane();478 c.setLayout(new FlowLayout());479 480 JPasswordField jp = new JPasswordField(20);481 jp.setColumns(20);482 jp.setFont(new Font("Arial",Font.BOLD,20));483 jp.setEchoChar(‘*‘);//设置显式字符,默认为圆点484 jp.addActionListener(new ActionListener() {485 public void actionPerformed(ActionEvent actionEvent) {486 char ch[] = jp.getPassword();//获取密码的字符数组487 String str = new String (ch);488 System.out.println(str);489 }490 });491 c.add(jp);492 493 setVisible(true);494 }495 496 public static void main(String[] args) {497 new Exp_JPasswordField();498 }499 }500 501 class Exp_JTextArea extends JFrame{502 Exp_JTextArea(){503 setBounds(100,100,400,400);504 setDefaultCloseOperation(EXIT_ON_CLOSE);505 Container c = getContentPane();506 c.setLayout(new FlowLayout());507 JTextArea area = new JTextArea("这是一个文本域");//创建一个带默认文本的文本域,不同于文本框,文本域支持多行输入508 area.setText("文本域");509 area.setRows(5);//设定行510 area.setColumns(20);//设定列数511 area.append("添加内容");512 area.insert("插入",3);513 area.setFont(new Font("楷体",Font.PLAIN,20));514 515 JScrollPane js = new JScrollPane(area);//给文本域提供滚动条516 c.add(js);517 518 setVisible(true);519 }520 521 public static void main(String[] args) {522 new Exp_JTextArea();523 }524 }525 526 class JustAExampleForActionListener extends JFrame{//动作事件监听器示例527 JustAExampleForActionListener(){528 setBounds(100,100,500,500);529 setDefaultCloseOperation(EXIT_ON_CLOSE);530 Container c =getContentPane();531 532 JTextField jt = new JTextField();533 JLabel jl = new JLabel("这是一个标签");534 535 JScrollPane js =new JScrollPane(jt);536 js.setBounds(10,10,300,30);537 538 jt.addActionListener(new ActionListener() {539 @Override540 public void actionPerformed(ActionEvent actionEvent) {541 Object obj =actionEvent.getSource();//使用ActionEvent对象获取值542 JTextField jtTmp = (JTextField)obj;543 System.out.println(jtTmp.getText());544 jl.setText("文本框单击了回车");545 }546 });547 548 c.add(js);549 c.add(jl);550 setVisible(true);551 }552 553 public static void main(String[] args) {554 new JustAExampleForActionListener();555 }556 }557 558 class JustAnExampleForFocusListener extends JFrame{//焦点事件监听器示例559 JustAnExampleForFocusListener(){560 setBounds(100,100,500,400);561 setDefaultCloseOperation(EXIT_ON_CLOSE);562 Container c = getContentPane();563 c.setLayout(null);564 565 JTextField jt1 = new JTextField();566 jt1.setBounds(10,10,60,20);567 568 JTextField jt2 = new JTextField();569 jt2.setBounds(10,60,60,20);570 571 JTextField jt3 = new JTextField();572 jt3.setBounds(10,110,60,20);573 574 jt1.addFocusListener(new MyFocusListener() );575 jt2.addFocusListener(new MyFocusListener() );576 jt3.addFocusListener(new MyFocusListener() );577 c.add(jt1);578 c.add(jt2);579 c.add(jt3);580 setVisible(true);581 }582 class MyFocusListener implements FocusListener{//自定义的焦点事件监听类583 public void focusGained(FocusEvent e){//得到焦点事件584 JTextField jtTmp = (JTextField)e.getSource();//获取触发事件的组件585 jtTmp.setBorder(BorderFactory.createLineBorder(Color.GREEN));//给得到焦点的文本框提供绿色边框586 }587 public void focusLost(FocusEvent e){//失去焦点事件588 JTextField jtTmp = (JTextField)e.getSource();589 jtTmp.setBorder(BorderFactory.createLineBorder(Color.red));590 }591 }592 593 public static void main(String[] args) {594 new JustAnExampleForFocusListener();595 }596 }