検索

Java GUI

Nov 19, 2016 am 09:22 AM
java

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

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Java開発のどの側面がプラットフォームに依存していますか?Java開発のどの側面がプラットフォームに依存していますか?Apr 26, 2025 am 12:19 AM

javadevelopmentisnotentirelylylypratform-IndopentDuetoseveralfactors.1)jvmvariationsaffectperformanceandbehavioracrossdifferentos.2)nativeLibrariesviajniintroducePlatform-specificissues.3)giaiasystemsdifferbeTioneplateplatifflics.4)

さまざまなプラットフォームでJavaコードを実行するときにパフォーマンスの違いはありますか?なぜ?さまざまなプラットフォームでJavaコードを実行するときにパフォーマンスの違いはありますか?なぜ?Apr 26, 2025 am 12:15 AM

Javaコードは、さまざまなプラットフォームで実行するときにパフォーマンスの違いがあります。 1)JVMの実装と最適化戦略は、OracleJDKやOpenJDKなどとは異なります。 2)メモリ管理やスレッドスケジューリングなどのオペレーティングシステムの特性もパフォーマンスに影響します。 3)適切なJVMを選択し、JVMパラメーターとコード最適化を調整することにより、パフォーマンスを改善できます。

Javaのプラットフォームの独立性の制限は何ですか?Javaのプラットフォームの独立性の制限は何ですか?Apr 26, 2025 am 12:10 AM

java'splatformindepentedencehaslimitationsincludingporformanceoverhead、versioncompatibulisisues、changleSwithnativeLibraryIntegration、プラットフォーム固有の機能、およびjvminStallation/maintenation。

プラットフォームの独立性とクロスプラットフォーム開発の違いを説明します。プラットフォームの独立性とクロスプラットフォーム開発の違いを説明します。Apr 26, 2025 am 12:08 AM

PlatformEndependEncealLowsProgramStorunonAnyPlatformWithOdification、whilecross-platformdevelopmentReadreessomeplatform-specificAdjustments.platformindependence、explifiedByjava、unableSiversAlexecutionButMayCompromperformance

ジャストインタイム(JIT)コンピレーションは、Javaのパフォーマンスとプラットフォームの独立性にどのような影響を与えますか?ジャストインタイム(JIT)コンピレーションは、Javaのパフォーマンスとプラットフォームの独立性にどのような影響を与えますか?Apr 26, 2025 am 12:02 AM

jitcompalilationinjavaenhancesperformance whelemaintaining formindepence.1)itdynamicallyTrantesiNTODENATIVEMACHINECODEATRUNTIME、最適化されたコードを最適化すること、

Javaがクロスプラットフォームデスクトップアプリケーションを開発するための人気のある選択肢なのはなぜですか?Javaがクロスプラットフォームデスクトップアプリケーションを開発するための人気のある選択肢なのはなぜですか?Apr 25, 2025 am 12:23 AM

javaispopularforsoss-platformdesktopapplicationsduetoits "writeonce、runaynay" philosophy.1)itusesbytecodatiTatrunnanyjvm-adipplatform.2)ライブラリリケンディンガンドジャヴァフククレアティック - ルルクリス

Javaでプラットフォーム固有のコードを作成する必要がある場合がある状況について話し合います。Javaでプラットフォーム固有のコードを作成する必要がある場合がある状況について話し合います。Apr 25, 2025 am 12:22 AM

Javaでプラットフォーム固有のコードを作成する理由には、特定のオペレーティングシステム機能へのアクセス、特定のハードウェアとの対話、パフォーマンスの最適化が含まれます。 1)JNAまたはJNIを使​​用して、Windowsレジストリにアクセスします。 2)JNIを介してLinux固有のハードウェアドライバーと対話します。 3)金属を使用して、JNIを介してMacOSのゲームパフォーマンスを最適化します。それにもかかわらず、プラットフォーム固有のコードを書くことは、コードの移植性に影響を与え、複雑さを高め、パフォーマンスのオーバーヘッドとセキュリティのリスクをもたらす可能性があります。

プラットフォームの独立性に関連するJava開発の将来の傾向は何ですか?プラットフォームの独立性に関連するJava開発の将来の傾向は何ですか?Apr 25, 2025 am 12:12 AM

Javaは、クラウドネイティブアプリケーション、マルチプラットフォームの展開、および言語間の相互運用性を通じて、プラットフォームの独立性をさらに強化します。 1)クラウドネイティブアプリケーションは、GraalvmとQuarkusを使用してスタートアップ速度を向上させます。 2)Javaは、埋め込みデバイス、モバイルデバイス、量子コンピューターに拡張されます。 3)Graalvmを通じて、JavaはPythonやJavaScriptなどの言語とシームレスに統合して、言語間の相互運用性を高めます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、