Javaの学習記録Day19(NIOフロー、GUIプログラミング)

19日目

2019年5月25日。
これは私がJavaの19日目学ぶものです。
この日、私は、次の知識を学びました。

NIOの流れ

NIOストリームは、バッファはIOチャネル動作に基づいて、配向され、このライブラリは、唯一のJDK1.4で導入されます。NIO IOとは、同一の目的および効果を有するが、異なる実装で、主な用途はNIOブロック、IOよりもはるかに高いNIO効率で
コピーファイルがNIOストリームを記述されたクラスファイルのコピーと以下、。コピーファイルは、3つの基本的な操作を実行する:バッファを作成し、バッファにソース・ファイルからデータを読み取り、コピー先ファイル・バッファに書き込まれます。
NIOストリーム詳細な説明は、参照があってもよい。https://www.cnblogs.com/zailushang1996/p/8916017.html

public static void copyFile(String src,String dst) throws IOException{
        //声明源文件和目标文件
        FileInputStream fi=new FileInputStream(new File(src));
        FileOutputStream fo=new FileOutputStream(new File(dst));
        //获得传输通道channel
        FileChannel inChannel=fi.getChannel();
        FileChannel outChannel=fo.getChannel();
        //获得容器buffer
        ByteBuffer buffer=ByteBuffer.allocate(1024);
        while(true){
        //判断是否读完文件
        int eof =inChannel.read(buffer);
        if(eof==-1){
        break;
        }
        //重设一下buffer的position=0,limit=position
        buffer.flip();
        //开始写
        outChannel.write(buffer);
        //写完要重置buffer,重设position=0,limit=capacity
        buffer.clear();
        }
        inChannel.close();
        outChannel.close();
        fi.close();
        fo.close();
}

GUIプログラミング

GUI、すなわち、グラフィカルユーザインタフェース(グラフィカル・ユーザ・インターフェース・プログラミング)は、グラフィカル表示されるユーザインタフェースを操作するコンピュータの使用を指します。
JavaのGUIプログラミングは、基本的には、スイングとAWTの使用で、ここではAWTが導入されています。

  • AWT(アブストラクト・ウィンドウ・ツールキット)は、JavaアプリケーションのGUI(グラフィックユーザインタフェースのグラフィカルユーザインタフェース)プログラミングのためのクラスおよびインタフェースの数を含みます
  • Javaクラスによって実装される:(等ウィンドウ、ボタン、テキストボックスなど)様々なGUI要素
  • 一般的にjava.awtパッケージとそのサブパッケージの使用に関与AWTクラス
  • 容器(コンテナ)と成分(成分)はAWT 2つのコアクラスであります

コンポーネントおよびコンテナダイアグラム、次のように:
ここに画像を挿入説明
次に、導入され、LayoutManagerのコンテナ(レイアウトマネージャ)とGUIプログラムは、コンポーネントを説明します

  • コンテナ(容器)
    容器ウィンドウとパンネルに分割されています。
    ウィンドウは、通常我々は、別のアプリケーションウィンドウとウィンドウが表示され、アプリケーションのウィンドウ多種多様なウィンドウ呼び出すことができます参照して、独立して表示することができます。ウィンドウ自体は、フレームとダイアログに分けることができ、これは、フレームは、我々は通常、一般の窓を見るものである、とダイアログが表示されますのみ、ダイアログボックス(たとえば、ドロップダウンメニュー内の項目をクリックするなど)特定の操作を実行するユーザーを必要とするものですダイアログの種類は、ダイアログです。
    パンネルは、他のグラフィック要素を収容することができますが、一般的にパンネル、パンネルは、アプリケーション実行の別のウィンドウとして表示することはできません見ることができない、パンネルが出てくると自分自身を表示することができるウィンドウにロードさを示すために持っていると思います。

    • フレーム
      枠のWindowsは、フォームとして、フレームまたはサブクラスによって作成されたオブジェクトのサブクラスで
      コンストラクタ:public Frame()私たちは、最初は不可視のフレームの新しいインスタンスを構築します
      public Frame(String title)Frameオブジェクトは、指定されたタイトルで、新しい、最初は不可視を構築します
      メンバーの方法
      public void setBounds(int x, int y, int width, int height)位置の形とサイズを設定し、X、左上、幅、および高さのy座標は、幅と高さ
      public void setSize(int width, int height)フォームのサイズを設定します。
      public void setLocation(int x, int y)フォームの位置を設定します
      public void setBackground(Color c)背景色、オブジェクトパラメータの色を設定します。
      public void setVisible(boolean b)フォームが表示されている設定し、デフォルトでは表示されません
      public void setTitle(String title)設定されたフレームのタイトル
      public String getTitle()タイトルフレームを取得するには
      public void setResizable(boolean resizable)サイズを変更することができます設定されています
      フレームコード例:
    public class MyTest {
    public static void main(String[] args) {
    	//这里只是在内存里面创建了一个窗口对象 还不能真正显示出来让我们看到
        Frame frame = new Frame("JAVA图形界面窗口");
    
    	//设置窗体的背景颜色
        frame.setBackground(Color.blue);
    
    	//设置窗体是否可见
        //要想看到在内存里面创建出来的窗口对象
        //必须调用setVisble()方法
        //并且把参数true传入才能看得见窗体
        //如果传入的参数是false
        //那么窗体也是看不见的
        frame.setVisible(true);
    
    	//设置窗体的初始大小
        frame.setSize(500,500);
    
    	//设置窗体出现时的位置,如果不设置则默认在左上角(0,0)位置显示
        frame.setLocation(200,200);
    
    	// 设置窗体能否被改变大小
        // 设置为false后表示不能改变窗体的显示大小
        // 这里将窗体显示的大小设置为200X200
        // 那么窗体的显示只能是这个大小了,不能再使用鼠标拖大或者缩小
        frame.setResizable(false);
    
    	//设置窗体在点击右上角的“X”按钮时可以退出程序
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }}
    
    • パネル
      オブジェクトを受信するためのパネルスペースは、コンポーネントとみなすことができ、かつ独自のレイアウトマネージャを持つことができ、この方法は、親クラスから継承したの
      コンストラクタ:public Panel()デフォルトのレイアウトマネージャを使って新しいパネルを作成します。
      public Panel(LayoutManager layout)Frameオブジェクトは、指定されたタイトルで、新しい、最初は不可視を構築します
      メンバーの方法
      public void setBounds(int x, int y, int width, int height)位置とパネルのサイズは、Xの設定、左上、幅、および高さのy座標は、幅と高さ
      public void setSize(int width, int height)パネルのサイズを設定します。
      public void setLocation(int x, int y)パネルの位置を設定します
      public void setBackground(Color c)背景色、オブジェクトパラメータの色を設定します。
      public void setLayout(LayoutManager mgr)設定パネルのレイアウトマネージャ
      パネルのコード例:
public class TestPanel {
    public static void main(String[] args) {
        Frame frame = new Frame("JAVA Frame With Panel");
        Panel panel = new Panel(null);
        frame.setLayout(null);

        //这里设置的坐标(300,300)是相对于整个屏幕的
        frame.setBounds(300,300,500,500);

        //设置背景颜色时使用三基色(红,绿,蓝)的比例来调配背景色
        frame.setBackground(new Color(0,0,102));

        //这里设置的坐标(50,50)是相对于Frame窗体的
        panel.setBounds(50,50,400,400);
        panel.setBackground(new Color(204,204,255));

        //把Panel容器装入到Frame容器中,使其能在Frame窗口中显示出来
        frame.add(panel);

        frame.setVisible(true);

        //解决关闭问题
        frame.addWindowListener(new WindowListener() {
            @Override
            public void windowOpened(WindowEvent e) {

            }

            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }

            @Override
            public void windowClosed(WindowEvent e) {

            }

            @Override
            public void windowIconified(WindowEvent e) {

            }

            @Override
            public void windowDeiconified(WindowEvent e) {

            }

            @Override
            public void windowActivated(WindowEvent e) {

            }

            @Override
            public void windowDeactivated(WindowEvent e) {

            }
        });
    }
}
  • LayoutManger(レイアウトマネージャ)
    Javaで、コンテナレイアウトの管理コンポーネント月レイアウトマネージャオブジェクトクラスを提供し、直接コンポーネントない位置とサイズを行い、それぞれがコンテナレイアウトマネージャオブジェクトを有する、場合コンテナ検索またはコンポーネントのサイズの大きさを決定するために必要な場合には、そのレイアウトマネージャオブジェクトを変更する方法setLayoutのコンテナを呼び出し、それに対応するレイアウトマネージャを呼び出します。

    • FlowLayoutの(フローレイアウト)
      FlowLayoutのデフォルトのレイアウトマネージャパネルのクラスは、以下の特性を有しています。

      • FlowLayoutのレイアウトマネージャ・コンポーネントは、右、ライン内の充填ラインラップに左側に配置されています。
      • コンポーネントのサイズを変更することなく、元のサイズの表示部品に係る部品は、異なる部品が間隔、行間隔、及び位置合わせを提供することができます。
      • デフォルトの配置が中央に配置されます。

      コンストラクタ:public FlowLayout()デフォルトの中央揃え、デフォルト値に水平方向および垂直方向の間隔(5)
      public FlowLayout(int align)アライメント指定された値を合わせなければなりません:FlowLayout.LEFT、FlowLayout.RIGHT、FlowLayout.CENTER、FlowLayout.LEADINGまたはFlowLayout.TRAILING
      public FlowLayout(int align, int hgap, int vgap)指定された水平および垂直配向及び間隔は、値が整列されなければならない:FlowLayout.LEFT、FlowLayout.RIGHT、FlowLayout.CENTER、FlowLayout.LEADING又はFlowLayout.TRAILING
      FlowLayoutのコード例:

    public class TestFlowLayout {
    public static void main(String[] args) {
        Frame frame = new Frame("FlowLayout");
    
        //使用Button类创建按钮
        // 按钮类的其中一个构造方法:Button(String label) label为按钮显示的文本
        Button button1 = new Button("button1");
        Button button2 = new Button("button2");
        Button button3 = new Button("button3");
    
        // setLayout方法的定义:public void setLayout(LayoutManager mgr)
        // 使用流水(Flow)线般的布局
        frame.setLayout(new FlowLayout());
        // 使用了布局管理器FlowLayout,这里的布局采用默认的水平居中模式
    
        // frame.setLayout(new FlowLayout(FlowLayout.LEFT));
        // 这里在布局的时候使用了FlowLayout.LEFT常量,这样就将按钮设置为左对齐
    
        // frame.setLayout(new FlowLayout(FlowLayout.RIGHT));
        //这里在布局的时候使用了FlowLayout.RIGHT常量,这样就将按钮设置为右对齐
    
    
        frame.setSize(200,200);
    
        frame.add(button1); // 把创建出来的按钮放置到Frame窗体中
        frame.add(button2); // 这里并没有设置按钮的大小与位置
        frame.add(button3); // 设置按钮的大小与位置都是由布局管理器来做的
        
        frame.setVisible(true);
     }
    }
    
    • BorderLayout(ボーダレイアウト)
      のBorderLayoutは、デフォルトのレイアウトマネージャフレームクラスで、次の特徴があります。

      • BorderLayoutのレイアウトマネージャ容器全体をに分けられる:イースト(東)、西(WEST)、サウス(南)、ノース(北)、中央(CENTER)5つの領域、コンポーネントは、指定された領域に追加することができます。
      • あなたは追加のコンポーネントの場所を指定しない場合、デフォルトはCENTER領域に追加しました。
      • 以前に追加の、複数の添加だけ一つの成分、各領域が上書きされます。

      コンストラクタ:public BorderLayout()構造アセンブリとの間に間隔を設けずに、新しいボーダレイアウト
      public BorderLayout(int hgap, int vgap)フレーム構造、指定されたコンポーネントのレイアウトのピッチを有します
      BorderLayoutのコード例:

    public class TestBorderLayout {
    public static void main(String[] args) {
        Frame frame = new Frame("TestBorderLayout");
    
        Button buttonEast = new Button("East");
        Button buttonWest = new Button("West");
        Button buttonSouth = new Button("South");
        Button buttonNorth = new Button("North");
        Button buttonCenter = new Button("Center");
    
        //把按钮放置到Frame窗体时按照东西南北中五个方向排列好,推荐使用这种方式去排列窗体元素
        //这样容易检查出错误 因为这样写如果写错了编译器会提示出错
    
        frame.add(buttonEast,BorderLayout.EAST);
        frame.add(buttonWest,BorderLayout.WEST);
        frame.add(buttonSouth,BorderLayout.SOUTH);
        frame.add(buttonNorth,BorderLayout.NORTH);
        frame.add(buttonCenter,BorderLayout.CENTER);
    
        //也可以使用这样的方式排列按钮 在把按钮放置到Frame窗体时使用方向定位的字符串指定按钮的放置位置
        //这种使用方向定位的字符串指定按钮的放置方式不推荐使用 一旦写错了方向字符串就不好检查出来
        //因为即使是写错了仍然可以编译通过
        /*
        frame.add(buttonEast,"EAST");
        frame.add(buttonWest,"West");
        frame.add(buttonSouth,"South");
        frame.add(buttonNorth,"North");
        frame.add(buttonCenter,"Center");
        */
    
        frame.setSize(200,200);
        frame.setVisible(true);
      }
    }
    
    • グリッドレイアウト(表レイアウト)
      グリッドレイアウトレイアウトマネージャ型空間正規長方形のネットワークは、各セルの範囲等しいサイズに。コンポーネントは、上から下へ、次いで、左から右に充填包装に最初の行の各セルに添加されます。
      コンストラクタ:public GridLayout()各コンポーネントは、行を占有するデフォルト値でテーブルレイアウトを作成
      public GridLayout(int rows, int cols)行と列レイアウトの数を指定するためのフォームを作成します。
      GridLayoutのコード例:
    public class TestGridLayout {
    public static void main(String[] args) {
        Frame frame = new Frame("TestGridLayout");
    
        Button btn1 = new Button("btn1");
        Button btn2 = new Button("btn2");
        Button btn3 = new Button("btn3");
        Button btn4 = new Button("btn4");
        Button btn5 = new Button("btn5");
        Button btn6 = new Button("bnt6");
    
        // 把布局划分成3行2列的表格布局形式
        frame.setLayout(new GridLayout(3,2));
    
        frame.add(btn1);
        frame.add(btn2);
        frame.add(btn3);
        frame.add(btn4);
        frame.add(btn5);
        frame.add(btn6);
    
        // Frame.pack()是JAVA语言的一个函数
        // 这个函数的作用就是根据窗口里面的布局及组件的preferredSize来确定frame的最佳大小。
        frame.pack();
        frame.setVisible(true);
    	}
    }
    
    • ネストレイアウト
      レイアウトマネージャのこれらのタイプは、パネルに設けられていてもよいフレーム、内部に設けられていてもよい、パネル自体も内部フレームに付加することができるので、より複雑なレイアウトはパネルフレームと入れ子にすることによって達成することができます。
      コードは以下の通りであります:
    public class TestTenButtons {
    public static void main(String[] args) {
        //这里主要是对显示窗体进行设置
        Frame frame = new Frame("布局管理器的嵌套使用");
    
        //把整个窗体分成2行1列的表格布局
        frame.setLayout(new GridLayout(2,1));
    
        frame.setLocation(300,400);
        frame.setSize(400,300);
        frame.setVisible(true);
        frame.setBackground(new Color(204,204,255));
    
        //这里主要是对Panel进行布局的设置
        Panel p1 = new Panel(new BorderLayout());
        //p2使用2行1列的表格布局
        Panel p2 = new Panel(new GridLayout(2,1));
        Panel p3 = new Panel(new BorderLayout());
        //p4使用2行2列的表格布局
        Panel p4 = new Panel(new GridLayout(2,2));
    
        //这里主要是把按钮元素加入到Panel里面
        p1.add(new Button("East(p1-东)"),BorderLayout.EAST);
        p1.add(new Button("West(p1-西)"),BorderLayout.WEST);
    
        p2.add(new Button("p2-Button1"));
        p2.add(new Button("p2-Button2"));
    
        //p1里面嵌套p2,把p2里面的按钮作为p的中间部分装入到p1里面
        //把p2作为元素加入到p1里面
        p1.add(p2,BorderLayout.CENTER);
    
        p3.add(new Button("East(p3-东)"),BorderLayout.EAST);
        p3.add(new Button("West(p3-西)"),BorderLayout.WEST);
    
        for(int i=0;i<4;i++){
            p4.add(new Button("p4-Button"+i));
        }
    
        //p3里面嵌套p4,把p4里面的按钮作为p的中间部分装入到p3里面
        p3.add(p4,BorderLayout.CENTER);
    
        //把Panel装入Frame里面,以便于在Frame窗体中显示出来
        frame.add(p1);
        frame.add(p3);
    	}
    }
    

    結果は以下の通りであります:
    ここに画像を挿入説明

  • 成分(コンポーネント)
    コンポーネント、すなわち、コンポーネントは、様々な特別な機能を実装することができます。

    • ボタン(ボタン)
      本明細書リスナーボタンを使用する方法について説明
      :次のように図であるが
      ここに画像を挿入説明
      、以下のようにコードの例です。
    public class TestActionEvent {
    public static void main(String[] args) {
        Frame frame = new Frame("TestActionEvent");
    
        Button button = new Button("Press Me");
        // 创建一个监听对象
        MyActionListener listener = new MyActionListener();
    
        // 把监听加入到按钮里面,监听按钮的动作,
        // 当按钮触发打击事件时,就会返回一个监听对象e
        // 然后就会自动执行actionPerformed方法
        button.addActionListener(listener);
    
        frame.add(button, BorderLayout.CENTER);
        frame.pack();
    
        addWindowClosingEvent(frame);
    
        frame.setVisible(true);
    
    }
    
    //点击窗体上的关闭按钮关闭窗体
    
    private static void addWindowClosingEvent(Frame frame){
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
    }
    
    // 自定义Monitor(监听)类实现事件监听接口ActionListener
    // 一个类要想成为监听类,那么必须实现ActionListener接口
    class MyActionListener implements ActionListener{
    
    //重写ActionListener接口里面的actionPerformed(ActionEvent e)方法
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("A Button has been Pressed");
     }
    }
    
    • テキストフィールド(テキストエディットボックス)
      メインテキストは、リスナーの使用について説明し
      、次のように図がある:
      ここに画像を挿入説明
      次のようにコード例は以下のとおりです。
    public class TestTextField {
    public static void main(String[] args) {
        new MyFrameTextField();
    }
    }
    
    class MyFrameTextField extends Frame{
    MyFrameTextField(){
        TextField textField = new TextField();
        add(textField);
        textField.addActionListener(new MyMonitor2());
    
        //这个setEchoChar()方法是设置文本框输入时显示的字符,这里设置为*,
        //这样输入任何内容就都以*显示出来,不过打印出来时依然可以看到输入的内容
        textField.setEchoChar('*');
        setVisible(true);
        pack();
    }
    }
    
    class MyMonitor2 implements ActionListener{
    
    //接口里面的所有方法都是public(公共的)
    //所以从API文档复制void actionPerformed(ActionEvent e)时 要在void前面加上public
    @Override
    public void actionPerformed(ActionEvent e) {
        //事件的相关信息都封装在了对象e里面,通过对象e的相关方法就可以获取事件的相关信息
    
        //getSource()方法是拿到事件源,注意:拿到这个事件源的时候
        //是把它当作TextField的父类来对待
        //getSource()方法的定义是:“public Object getSource()”返回值是一个Object对象
        //所以要强制转换成TextField类型的对象
        //在一个类里面想访问另外一个类的事件源对象可以通过getSource()方法
        TextField textField = (TextField) e.getSource();
    
        // textField.getText()是取得文本框里面的内容
        System.out.println(textField.getText());
    
        // 把文本框里面的内容清空
        textField.setText("");
    }
    }
    
    • ペイント(描画方法)
      各コンポーネントは、図面の目的を達成するための塗料(グラフィックスg)を有し、各塗料方法は、自動的にコンポーネントの再描画を要求する
      コード例は以下の通りです。
public class TestPaint {
    public static void main(String[] args) {
        new MyPaint().launchFrame();
        //在main()方法里面并没有显示调用paint(Graphics g)方法
        //可是当创建出Frame窗体后却可以看到Frame窗体上画出了圆和矩形
        //这是因为paint()方法是一个比较特殊的方法
        //在创建Frame窗体时会自动隐式调用
        //当我们把Frame窗体最小化又再次打开时
        //又会再次调用paint()方法重新把圆和矩形在Frame窗体上画出来
        //即每次需要重画Frame窗体的时候就会自动调用paint()方法
    }
}

class MyPaint extends Frame{
    public void launchFrame(){
        setBounds(200,200,640,480);
        setVisible(true);
    }

    public void paint(Graphics g){
        //paint(Graphics g)方法有一个Graphics类型的参数g
        //我们可以把这个g当作是一个画家,这个画家手里拿着一只画笔
        //我们通过设置画笔的颜色与形状来画出我们想要的各种各样的图像

        /*设置画笔的颜色*/
        g.setColor(Color.red);
        g.fillOval(100,100,100,100);/*画一个实心椭圆*/
        g.setColor(Color.green);
        g.fillRect(150,200,200,200);/*画一个实心矩形*/

        //这下面的两行代码是为了写程序的良好编程习惯而写的
        //前面设置了画笔的颜色,现在就应该把画笔的初始颜色恢复过来
        //就相当于是画家用完画笔之后把画笔上的颜色清理掉一样
        Color c = g.getColor();
        g.setColor(c);

        System.out.println("gogoogo");

    }

}

おすすめ

転載: blog.csdn.net/qq_41151659/article/details/90607570