Java GUI

高洛峰
リリース: 2016-11-19 09:22:40
オリジナル
1590 人が閲覧しました

1. GUI の概要

GUI:

グラフィカル ユーザー インターフェイス グラフィカル ユーザー インターフェイス。

グラフィックを使用して、より便利で直感的なコンピューター操作インターフェイスを表示します。

CLI:

コマンド ライン ユーザー インターフェイス コマンド ライン ユーザー インターフェイス

これは一般的な Dos コマンド ライン操作です。いくつかの一般的なコマンドを覚える必要があり、操作は直感的ではありません。

GUI 用に Java によって提供されるオブジェクトは、java.awt と javax.swing の 2 つのパッケージに格納されます。


2. awt およびスイング パッケージの概要

java.awt: Abstract Window ToolKit 抽象ウィンドウ ツール キット。関数を実装するためにローカル システム メソッドを呼び出す必要があり、重量のあるコントロールです。

javax.swing: AWT に基づくグラフィカル インターフェイス システム。より多くのコンポーネントを提供し、完全に Java で実装されているため、移植性が向上し、軽量なコントロールです。


3. GUI 継承システム

Java GUI

コンテナ: 特別なコンポーネントであるコンテナです。add メソッドを通じてこのコンポーネントに他のコンポーネントを追加できます。

package cn5;
 
import java.awt.Frame;
/**
 * 创建一个最简单的窗体  
 */
public class AWTDemo {
    public static void main(String[] args) {
        //创建一个最初不可见的窗体对象
        Frame f = new Frame();
        //设置窗体标题
        f.setTitle("哈哈 呵呵 嘻嘻 笨笨");
        //设置窗体大小
        f.setSize(400, 300);//单位:默认像素
        //设置窗体坐标
        f.setLocation(400, 200);
        //让窗体可见
        f.setVisible(true);
    }
 
}
ログイン後にコピー

Java GUI

上の図の効果を達成する他の方法

package cn5;
 
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Point;
 
public class AWTDemo2 {
    public static void main(String[] args) {
        //创建一个不可见的窗体
        Frame f = new Frame();
        //设置标题
        f.setTitle("哈哈");
        //设置位置
        f.setLocation(new Point(400, 200));
        //设置大小
        f.setSize(new Dimension(400, 300));
        //使得窗体可见
        f.setVisible(true);
    }
 
}
ログイン後にコピー
rreee

ウィンドウを閉じるには

package cn5;
 
import java.awt.Frame;
 
public class AWTDemo2 {
    public static void main(String[] args) {
        //创建一个不可见的窗体
        Frame f = new Frame();
        //设置标题
        f.setTitle("哈哈");
        f.setBounds(400,200,400,300);
        //使得窗体可见
        f.setVisible(true);
    }
 
}
ログイン後にコピー

上記のコードによると、冗長なコードがたくさんあるのはなぜですか?以下の内訳を見てみましょう。

4. アダプターモード

package cn5;
 
import java.awt.Frame;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
/**
 * 事件监听机制
 *        事件源:事件发生的地方。
 *        事件:就是要发生的事情。
 *        事件处理:就是针对发生的事情做出的处理方案。
 *        事件监听:就是把事件源和事件关联起来。
 * 
 * 举例:人受伤事件
 *        事件源:人(具体的对象)
 *            Person p1 = new Person("张三");
 *            Person p2 = new Person("李四");
 *        事件:受伤
 *            interface 受伤接口{
 *                一拳();
 *                一脚();
 *                一板砖();
 *            }
 *        事件处理:
 *            事件处理类 implements 受伤接口{
 *                一拳(){
 *                    System.out.println("鼻子流血了,去医院");
 *                }
 *                一脚(){
 *                    System.out.println("晕倒了");
 *                }
 *                一板砖(){
 *                    System.out.println("头破血流");
 *                }
 *            }
 *     事件监听:
 *         p1.注册监听(受伤接口)
 *         p2.注册监听(受伤接口)
 */
public class AWTDemo3 {
    public static void main(String[] args) {
        //创建一个最初不可见的窗体对象
        Frame f = new Frame("窗体关闭");
        //设置窗体属性
        f.setBounds(400, 200, 400, 300);
         
        //让窗体关闭
        //事件源:窗体f
        //事件:对窗体的处理
        //事件处理:关闭窗体(System.exit(0))
        //事件监听:
        f.addWindowListener(new WindowListener() {
             
            @Override
            public void windowOpened(WindowEvent e) {
                 
            }
             
            @Override
            public void windowIconified(WindowEvent e) {
                 
            }
             
            @Override
            public void windowDeiconified(WindowEvent e) {
                 
            }
             
            @Override
            public void windowDeactivated(WindowEvent e) {
            }
             
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
             
            @Override
            public void windowClosed(WindowEvent e) {
                 
            }
             
            @Override
            public void windowActivated(WindowEvent e) {
                 
            }
        });
        //使得窗体可见
        f.setVisible(true);
         
    }
 
}
ログイン後にコピー
rreerree

ユーザー追加

ユーザー削除

ユーザークエリ

ユーザー変更

しかし、ユーザーに機能を追加してほしいだけなら、現時点ではdeleteを呼び出さないと思うでしょう( )、検索 () メソッドと update() メソッドでは十分ではありませんか?

package cn6;
 
public interface IUserDAO {
    /**
     * 增加用户
     */
    public void add();
    /**
     * 删除用户
     */
    public void delete();
    /**
     * 修改用户
     */
    public void update();
    /**
     * 查询用户
     */
    public void find();
 
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
package cn6;
 
public class UserDAOImpl implements IUserDAO {
 
    @Override
    public void add() {
        System.out.println("用户增加");
    }
 
    @Override
    public void delete() {
        System.out.println("用户删除");
    }
 
    @Override
    public void update() {
        System.out.println("用户修改");
    }
 
    @Override
    public void find() {
        System.out.println("用户查询");
    }
 
}
ログイン後にコピー
ログイン後にコピー
package cn6;
 
public class Test {
    public static void main(String[] args) {
        IUserDAO userDAO = new UserDAOImpl();
        userDAO.add();
        userDAO.delete();
        userDAO.find();
        userDAO.update();
    }
 
}
ログイン後にコピー

はい、しかし、特定の実装を書かなくても、インターフェイスの実装クラスでインターフェイスに定義されたメソッドをオーバーライドする必要がありますか?しかし、私は冗長なコードをたくさん書くのが嫌いです。私は恐怖症です。どうすればよいでしょうか?


ふん、インターフェースと具体的な実装クラスの間に抽象クラス(アダプタークラス)を追加します。

インターフェース - アダプター (抽象クラス) - 具象実装クラス

package cn6;
 
public interface IUserDAO {
    /**
     * 增加用户
     */
    public void add();
    /**
     * 删除用户
     */
    public void delete();
    /**
     * 修改用户
     */
    public void update();
    /**
     * 查询用户
     */
    public void find();
 
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
package cn6;
 
public class UserDAOImpl implements IUserDAO {
 
    @Override
    public void add() {
        System.out.println("用户增加");
    }
 
    @Override
    public void delete() {
        System.out.println("用户删除");
    }
 
    @Override
    public void update() {
        System.out.println("用户修改");
    }
 
    @Override
    public void find() {
        System.out.println("用户查询");
    }
 
}
ログイン後にコピー
ログイン後にコピー
package cn6;
 
public class Test {
    public static void main(String[] args) {
        IUserDAO userDAO = new UserDAOImpl();
        userDAO.add();
         
    }
 
}
ログイン後にコピー

注: この時点で UserDAOAddImpl クラスにメソッドを記述しない場合、エラーは報告されません。これは、抽象クラス UserAdapter が既にインターフェースを実装しているためです。それは単なる空の実装です。

package cn6;
 
public interface IUserDAO {
    /**
     * 增加用户
     */
    public void add();
    /**
     * 删除用户
     */
    public void delete();
    /**
     * 修改用户
     */
    public void update();
    /**
     * 查询用户
     */
    public void find();
 
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

でも、私はユーザーに機能を追加してもらいたいだけなので、それでどうなるでしょうか?ユーザー追加機能を実装するクラスを作成しただけなので、もう 4 つのメソッドを実装する必要はありません。

package cn6;
 
public abstract class UserAdapter implements IUserDAO {
 
    @Override
    public void add() {
         
    }
 
    @Override
    public void delete() {
         
    }
 
    @Override
    public void update() {
         
    }
 
    @Override
    public void find() {
         
    }
     
 
}
ログイン後にコピー

今ユーザー削除機能だけが必要な場合は、ユーザー削除機能を実装するクラスを作成するだけです。 もちろん、この抽象クラスを継承する必要があります。

package cn6;
 
public class UserDAOAddImpl extends UserAdapter {
 
    @Override
    public void add() {
        System.out.println("用户添加");
    }
     
     
     
     
 
}
ログイン後にコピー

その他は順番に推測できます。

rreee

でも、こうしてみると、最初から変わっていない気がしてきます。

package cn6;
 
public class UserDAOAddImpl extends UserAdapter {
 
}
ログイン後にコピー

ただし、実際にはそうではありません。ユーザーに機能を追加してもらいたいだけなので、大量のゴミコードが生成されますが、ユーザーの追加、ユーザーの削除などはこの時点で実行できます。ユーザーに機能を追加してもらいたい、そう思いますよね?以下のコードを見てください。

package cn6;
 
public class UserDAOAddImpl extends UserAdapter {
    @Override
    public void add() {
        System.out.println("用户增加");
    }
     
     
     
     
 
}
ログイン後にコピー

しかし、ユーザーに機能を追加したり変更したりするのは面倒ではありませんか? 顧客は初心者であり、顧客のニーズは常に変化します。できることは、変化に直面しても変わらないことです。では、アダプター モードを使用する場合、要件をどのように変更しますか? はい、機能を満たす実装クラスを作成しますので、何も言う必要はありません。

【注意】インターフェースに機能が1つしかない場合、アダプターモードを使用する必要はありません。使用する場合と使用しない場合に違いはありますか?


5. アダプターパターンを使用してウィンドウを閉じる冗長なコードを解決します

Java GUI

Java GUI

Java GUI

package cn6;
 
public class UserDAODeleteImpl extends UserAdapter {
    @Override
    public void delete() {
        System.out.println("用户删除");
    }
}
ログイン後にコピー

6. フォームにボタンを追加し、クリックイベントを追加します

Java GUI

醜い私は食事もできないのに、どうしてこんな大きなボタンがあるのでしょう?そして、ボタンのサイズを設定したのに、なぜ機能しないのですか?

Java GUIりー

Java GUI

7.
package cn8;
 
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
 
public class AWTDemo {
    public static void main(String[] args) {
        //创建窗体对象
        Frame f = new Frame("数据转移");
        //设置窗体属性
        f.setBounds(400, 200, 400, 300);
        //设置窗体布局
        f.setLayout(new FlowLayout());
         
        //创建文本框
        final TextField tf = new TextField(20);
        //创建按钮
        Button bt = new Button("数据转移");
        //创建文本域
        final TextArea tx = new TextArea(10,40);
         
        //把组件添加到窗体
        f.add(tf);
        f.add(bt);
        f.add(tx);
         
        //设置关闭事件
        f.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
         
        //对按钮添加事件
        bt.addActionListener(new ActionListener() {
             
            @Override
            public void actionPerformed(ActionEvent e) {
                //获取文本框的值
                String tf_str = tf.getText().trim();
                //清空数据
                tf.setText("");
                //设置给文本库并换行
                tx.append(tf_str+"\r\n");
                //文本框获取光标
                tf.requestFocus();
            }
        });
        //让窗体显示
        f.setVisible(true);
    }
 
}
ログイン後にコピー

Java GUI

package cn9;
/**
*鼠标点击事件
*/
import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
 
public class AWTDemo {
    public static void main(String[] args) {
        final Frame f = new Frame("更改背景色");
        f.setBounds(400, 200, 400, 300);
        f.setLayout(new FlowLayout());
         
        //创建按钮
        Button bt1 = new Button("红色");
        Button bt2 = new Button("黑色");
        Button bt3 = new Button("绿色");
        Button bt4 = new Button("黄色");
         
        //添加按钮
        f.add(bt1);
        f.add(bt2);
        f.add(bt3);
        f.add(bt4);
         
         
        f.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        bt1.addActionListener(new ActionListener() {
             
            @Override
            public void actionPerformed(ActionEvent e) {
                f.setBackground(Color.RED);
            }
        });
        bt2.addActionListener(new ActionListener() {
             
            @Override
            public void actionPerformed(ActionEvent e) {
                f.setBackground(Color.BLACK);
            }
        });
        bt3.addActionListener(new ActionListener() {
             
            @Override
            public void actionPerformed(ActionEvent e) {
                f.setBackground(Color.GREEN);
            }
        });
        bt4.addActionListener(new ActionListener() {
             
            @Override
            public void actionPerformed(ActionEvent e) {
                f.setBackground(Color.YELLOW);
            }
        });
        f.setVisible(true);
    }
}
ログイン後にコピー

Java GUI

package cn9;
 
import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
 * 鼠标移动事件
 */
public class AWTDemo {
    public static void main(String[] args) {
        final Frame f = new Frame("更改背景色");
        f.setBounds(400, 200, 400, 300);
        f.setLayout(new FlowLayout());
         
        //创建按钮
        Button bt1 = new Button("红色");
        Button bt2 = new Button("黑色");
        Button bt3 = new Button("绿色");
        Button bt4 = new Button("黄色");
         
        //添加按钮
        f.add(bt1);
        f.add(bt2);
        f.add(bt3);
        f.add(bt4);
         
         
        f.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        bt1.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                f.setBackground(Color.RED);
            }
        });
        bt2.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                f.setBackground(Color.BLACK);
            }
        });
        bt3.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                f.setBackground(Color.GREEN);
            }
        });
        bt4.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                f.setBackground(Color.YELLOW);
            }
        });
        f.setVisible(true);
    }
}
ログイン後にコピー

Java GUI

package cn10;
 
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
 
public class AWTDemo {
    public static void main(String[] args) {
        Frame f = new Frame("QQ校验");
        f.setBounds(400, 200, 400, 300);
        f.setLayout(new FlowLayout());
         
        Label l = new Label("请输入你的QQ号码,不能是非数字");
        TextField tf = new TextField(30);
        f.add(l);
        f.add(tf);
         
        tf.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                char c = e.getKeyChar();
                if(!(c >= &#39;0&#39; && c <=&#39;9&#39;)){
                    e.consume();
                }
            }
        });
         
         
        f.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        f.setVisible(true);
    }
 
}
ログイン後にコピー

八、菜单组件

Java GUI

菜单组件概述

MenuBar,Menu,MenuItem

先创建菜单条,再创建菜单,每一个菜单中建立菜单项。

也可以菜单添加到菜单中,作为子菜单。

通过setMenuBar()方法,将菜单添加到Frame中。

package cn11;
 
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
 * 一级菜单
 */
public class Demo {
    public static void main(String[] args) {
        Frame f = new Frame("一级菜单");
        f.setBounds(400, 200, 400, 300);
         
        //创建菜单栏
        MenuBar bar = new MenuBar();
        //创建菜单
        Menu m = new Menu("文件");
        //创建菜单项
        MenuItem mi = new MenuItem("退出系统");
         
        //设置菜单栏
        f.setMenuBar(bar);
        bar.add(m);
        m.add(mi);
         
         
        mi.addActionListener(new ActionListener() {
             
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
                 
            }
        });
         
        f.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        f.setVisible(true);
         
         
    }
 
}
ログイン後にコピー

Java GUI

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!