java.awt.event.MouseEvent鼠標事件的定義和使用 以及 Java Swing-JTextArea的使用


最近發現一個CSDN大佬寫的Java-Swing全部組件的介紹:Java Swing 圖形界面開發(目錄)

 

JTextArea

文本區域。JTextArea 用來編輯多行的文本。JTextArea 除了允許多行編輯外,其他基本用法和 JTextField(文本框) 基本一致。

文本框就一行,文本區域是一個多行區域。

 

JTextArea構造方法

/** * 參數說明: * text: 默認顯示的文本 * rows: 默認可見的行數 * columns: 默認可見的列數 * * 默認由 rows 和 columns 決定首選大小 */ JTextArea() JTextArea(String text) JTextArea(int rows, int columns) JTextArea(String text, int rows, int columns)

 

JTextArea的一些函數

// 是否自動換行,默認為 false。自動換行也就是一行內可寫字符是有限的,如果你超過這個數量不用你回車就會自動切到下一行
void setLineWrap(boolean wrap) // 設置自動換行方式。如果為 true,則將在單詞邊界(空白)處換行; 如果為 false,則將在字符邊界處換行。默認為 false。
void setWrapStyleWord(boolean word) // 獲取文本框中的文本
String getText() // 追加文本到文檔末尾
void append(String str) // 替換部分文本
void replaceRange(String str, int start, int end) // 設置文本框的 文本、字體 和 字體顏色
void setText(String text) void setFont(Font font) void setForeground(Color fg) // 獲取內容的行數(以換行符計算,滿行自動換下一行不算增加行數)
int getLineCount() // 獲取指定行(行數從0開始)的行尾(包括換行符)在全文中的偏移量
int getLineEndOffset(int line) // 獲取指定偏移量所在的行數(行數從0開始)
int getLineOfOffset(int offset) // 設置顏色,分別為: 光標顏色、呈現選中部分的背景顏色、選中部分文本的顏色、不可用時文本的顏色
void setCaretColor(Color c) void setSelectionColor(Color c) void setSelectedTextColor(Color c) void setDisabledTextColor(Color c) // 設置文本框是否可編輯
void setEditable(boolean b) /* 下面方法定義在 java.awt.Component 基類中 */

// 判斷組件當前是否擁有焦點
boolean isFocusOwner() // 設置組件是否可用
void setEnabled(boolean b)

 

 

MouseEvent事件

處理在任何組件上都可以發生的按住、釋放、移入組件、移出組件、單擊觸發的MouseEvent事件,應讓監聽器實現MouseListener接口。

如果要處理任何組件上都可以發生的拖動鼠標和移動鼠標時候觸發的MouseEvent事件,應讓監聽器實現MouseMotionListener接口。

 

先用一個程序說MouseListener

MousePolice.java

import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JTextArea; import javax.swing.JTextField; //作為MouseEvent事件的監聽器,需要實現接口中的5個方法
public class MousePolice implements MouseListener{ JTextArea jta; //獲取所需資源
    public void setTextArea(JTextArea jta) { this.jta=jta; } //單擊
 @Override public void mouseClicked(MouseEvent e) { //多次單擊即是連擊
        if(e.getClickCount()>=2) jta.append("連擊在:"+e.getX()+","+e.getY()+"\n"); } //進入
 @Override public void mouseEntered(MouseEvent e) { //getSource直接獲得事件源實例
        if(e.getSource() instanceof JButton) jta.append("進入按鈕在:"+e.getX()+","+e.getY()+"\n"); if(e.getSource() instanceof JTextField) jta.append("進入文本框在:"+e.getX()+","+e.getY()+"\n"); if(e.getSource() instanceof JFrame) jta.append("進入窗口在:"+e.getX()+","+e.getY()+"\n"); } //退出
 @Override public void mouseExited(MouseEvent e) { jta.append("退出在:"+e.getX()+","+e.getY()+"\n"); } //按下
 @Override public void mousePressed(MouseEvent e) { jta.append("按下在:"+e.getX()+","+e.getY()+"\n"); } //松開
 @Override public void mouseReleased(MouseEvent e) { jta.append("釋放在:"+e.getX()+","+e.getY()+"\n"); } }

 

WindowMouse.java

import java.awt.FlowLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; public class WindowMouse extends JFrame { JTextField jtf; JButton jb; JTextArea jta; MousePolice mp; WindowMouse() { init(); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } private void init() { // 當new FlowLayout()換成null時,就會變成絕對布局 // null,絕對布局。絕對布局沒有特定一個布局管理器類來表示,給容器的布局管理器設置為 null,就表示使用絕對布局, // 即通過設置組件的坐標和寬高來布置組件。 // 絕對布局需要明確指定每一個組件的坐標和寬高,否則不顯示。
        this.setLayout(new FlowLayout()); jtf = new JTextField(8); // 文本框。JTextField 用來編輯單行的文本。
        jb = new JButton("按鈕"); jta = new JTextArea(2, 28); /* * JTextArea(String text, int rows, int columns) 參數說明: text: 默認顯示的文本 rows: * 默認可見的行數 columns: 默認可見的列數 默認由 rows 和 columns 決定首選大小 */ mp = new MousePolice(); mp.setTextArea(jta);// 為監聽器傳入資源 // 注冊監聽器
 jb.addMouseListener(mp); jta.addMouseListener(mp); jtf.addMouseListener(mp); this.addMouseListener(mp); this.add(jb); this.add(jtf); this.add(new JScrollPane(jta)); } }

 

Main.java

// 設置自動換行,就是在輸入的時候,如果輸入內容超過一行所能容納最多字符,就跳出 // textArea.setLineWrap(true); 

public class Main { public static void main(String[] args) { WindowMouse wm=new WindowMouse(); wm.setTitle("處理MouseEvent事件"); wm.setBounds(300,300,360,200); wm.setLocationRelativeTo(null);  //自動把對話框弄到屏幕中間
 } }

 

 

MouseMotionListener接口的例子

JLayeredPane(層次面板)

JLayeredPane為容器添加了深度,允許組件在需要時互相重疊。

JLayeredPane將深度范圍按 層 划分,在同一層內又對組件按位置進一步划分,將組件放入容器時需要指定組件所在的層,以及組件在該層內的 位置(position/index)。

層的編號越大越顯示在前面;同層內位置編號越大越靠近底部(位置編號取值范圍: [-1, n - 1],n 表示層內組件數量,其中 -1 表示最底,0 表示最頂)。

通過 setLayer(Component c, int layer) 可設置組件所在的層數。

同一層內的組件,可通過調用 moveToFront(Component)、moveToBack(Component) 和 setPosition(int) 調整層內的位置。

PS: 添加到 JLayeredPane 內的組件需要明確指定組在位置和寬高,否則不顯示(類似絕對布局)。

 

常用方法

/** * 添加組件到指定的層(默認放到層內最底部),參數說明: * comp: 待添加的組件 * layer: 所在的層, 層數是int類型, 由於該方法與另一個 add(Component, int) 方法類似, 直接使用會有沖突, 所以使 * 用該方法傳遞 layer 參數時, 必須使用 Integer 類型來明確調用的是下面 add(Component, Object) 方法。 */
void add(Component comp, Object layer) // 添加組件到指定的層和層內的位置
void add(Component comp, Object layer, int position) // 設置組件所在層(默認放到層內最底部)
void setLayer(Component c, int layer) // 設置組件所在層,以及在層內的位置
void setLayer(Component c, int layer, int position) // 移動組件到其所在層的最頂部位置
void moveToFront(Component c) // 移動組件到其所在層的最底部位置
void moveToBack(Component c) // 設置組件在其所在層的位置,其中 position 取值范圍為: [-1, n - 1],n 表示層內組件數量,其中 -1 表示最底,0 表示最頂
void setPosition(Component c, int position)

 

構造方法

JLayeredPane()

 

 

Swing的面板層次(參考鏈接:https://blog.csdn.net/kewbblog/article/details/8625917)

         |Grass Pane
         |
Root Pane|
         |            |Content Pane
         |Layered Pane|
                      |Menu Bar

Root Pane可以看成是虛擬的容器,包含着Grass Pane、Layered Pane、Content Pane與Menu Bar.Swing的容器包括JApplet ,JFrame,JDialog,JWindow與JInternalFrame都是構造在此結構上,JApplet、JFrame、JDialog、JWindow都是heavyweight容器,只 有JInternalFrame是lightweight容器。當我們要加入某個組件到Swing的容器中時,並不是直接加入到Root Pane,而是加入到 RootPane下面的某一成員(Layered Pane或Content Pane)

 

Content Pane與Menu Bar只是Layered Pane的其中一層,我們稱此層為Frame-Content Layer.若你想知道Frame-Content Layer 在Layered Pane的層次是什么?你可以由JLayeredPane類中的Frame_Content_layer類常數取得。

由此我們可以知道,Layered Pane基本上可擁有非常多的“層”(Layer),那么如何分辨哪一層是在哪一層的上面或下面呢? 答案是Z_order.Z_order本身具有兩個整數值,一個是代表層(Layer)的深度,另一個代表同層的相關位置(Position),當Z_order 的Layer數值越小時,表示其位置就在越底層,當Z_order的Layer數值越大時,表示其位置就在越上層。在JLayeredPane類中,共定 義了6個Z_order常數供用戶參考,如下所示:

DEFAULT_LAYER:Z_order的Layer數值為0,以整數對象Integer(0)來表示,一般我們加入的組件若沒有標記是第幾層,默認值就 把組件放在此Default Layer中。

PALETTE_LAYER:Z_order的Layer數值為100,以整數對象Integer(100)來表示,位於Default Layer之上,一般用於放置可移動的 工具欄(Floatable Toolbar).

MODAL_LAYER:Z_order的Layer數值為200,以整數對象Integer(200)來表示,位於PALETTE_LAYER之上,一般用於放置對話框 (Dialog Box).

POPUP_LAYER:Z_order的Layer數值為300,以整數對象Integer(300)來表示,位於MODAL_LAYER之上,一般用於快捷菜單(Poup Menu)與工具欄提示(Tool Tips)中.

DRAG_LAYER:Z_order的Layer數值為400,以整數對象Integer(400)來表示,位於POPUP_LAYER之上,一般用於拖曳組件使其在不同 區域上.

FRAME_CONTENT_LAYER:Z_order的Layer數值為-30000,以整數對象Integer(-30000)來表示,一般來說,Frame Content Layer 最底層的是Layer,用來表示Content Pane與Menu Bar的位置,大部份情況我們不會更改到這個數值。

一般程序會提供良好的Z-order自動管理機制,當然java也不例外,因此大部份情況我們不會使用到Z-order,因為系統會自動 幫我們管理得好好的。用戶只需將所需的組件直接加入Content Pane即可,不需要知道它們之間的順序關系。但如果今天您必須處 理對象之間的層次關系時,例如Word中你可以把某個繪圖對象下推至下一層,你就必須親自處理Z-order的關系了。

 

下面用代碼展示MouseMotionListener接口的例子

MousePolice.java

import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLayeredPane;

//中間容器層次面板,直接實現了監聽器該實現的接口
//所以其中的組件按鈕直接拿自己這個類做監聽器就可以了
//這也是比較方便的編程方式
public class MousePolice extends JLayeredPane
    implements MouseListener,MouseMotionListener{

    JButton jb;
    int x,y,a,b,x0,y0;

    MousePolice(){
        jb=new JButton("被拖動的按鈕");
        jb.addMouseListener(this);
        jb.addMouseMotionListener(this);
        //setLayout設置布局管理器的布局為流式布局
        this.setLayout(new FlowLayout());
        //把按鈕添加進來
        this.add(jb, JLayeredPane.DEFAULT_LAYER);   
    }

    //MouseListener:按下
    @Override
    public void mousePressed(MouseEvent e) {
        //除頂層容器外所有Swing組件的基類
        JComponent jc=null;
        jc=(JComponent)e.getSource();//獲得事件源,並向上轉換
        
        //使用setLayer方法把組件設置在層次面板中的哪一層中出現
        //但是程序並沒 有把該組件添加到該層中
        //在使用setLayer方法后還應使用add方法把組件添加進層面板的這一層中
        //而且add方法 應出現在setLayer方法之后
        //層級面板,設置出現層級。更多內置層級變量見:
        //https://blog.csdn.net/kewbblog/article/details/8625917
        this.setLayer(jc, JLayeredPane.DRAG_LAYER);

        //獲取事件源(左上角)位置坐標
        a=jc.getBounds().x;
        b=jc.getBounds().y;
        //獲取鼠標在事件源中的位置坐標
        //這里的x0,y0也就是按下時候的坐標
        x0=e.getX();
        y0=e.getY();
    }

    //MouseListener:釋放
    @Override
    public void mouseReleased(MouseEvent e) {
        JComponent jc=null;
        jc=(JComponent)e.getSource();
        //拖拽完成后,放回原來那一層去  default_layer
        this.setLayer(jc, JLayeredPane.DEFAULT_LAYER);
    }

    //MouseListener:進入
    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    //MouseListener:單擊
    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    //MouseListener:退出
    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    //MouseMotionListener:移動
    @Override
    public void mouseMoved(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    //MouseMotionListener:拖動
    @Override
    public void mouseDragged(MouseEvent e) {
        Component cpnt=null;//最大的組件類
        //如果事件源是組件,也不管是什么組件
        if(e.getSource() instanceof Component) {
            cpnt=(Component)e.getSource();//先向上轉換成組件類對象
            //組件(左上角)坐標
            a=cpnt.getBounds().x;
            b=cpnt.getBounds().y;
            //拖動的實時坐標x,y
            x=e.getX();
            /*
             * Java中的mouseReleased(MouseEvent e)中坐標(e.getX(),e.getY())
              *   確定的是Pressed的時候的坐標
             * */
            y=e.getY();
            //拖動的坐標影響組件的坐標,則看起來是動態的拖動
            a=a+x;
            b=b+y;
            //設置其新位置
            //也就是說,新的位置坐標=剛才位置坐標+(當前鼠標坐標-鼠標按下坐標)
            //注意!組件的坐標是在容器坐標系中的!
            //而鼠標的坐標是在其下的組件的坐標系中的!
            cpnt.setLocation(a-x0,b-y0);
        }
    }
}

 

WindowMouse.java

import java.awt.BorderLayout;

import javax.swing.JFrame;

public class WindowMouse extends JFrame{
    //往組件里裝好監聽器的層次面板
    MousePolice lp;

    WindowMouse() {
        lp=new MousePolice();
        this.add(lp,BorderLayout.CENTER);//方位布局的中央
        this.setVisible(true);
        this.setBounds(12,12,300,300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

 

main.java

public class Main {

    public static void main(String[] args) {
        WindowMouse wm=new WindowMouse(); 
        wm.setTitle("處理MouseEvent事件");
        wm.setBounds(10,10,400,300);
    }

}

 

setLayout函數作用:設置布局管理器的布局為什么布局

Java中的mouseReleased(MouseEvent e)中坐標(e.getX(),e.getY())確定的是Pressed的時候的坐標(如果你一直按着鼠標移動,那么這個值就會跟着改變)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM