Swing là gì ? Cách sử dụng các thành phần cơ bản của Swing.

Discussion in 'Bài viết hướng dẫn JSE' started by tranhuyvc, 28/2/10.

  1. tranhuyvc

    tranhuyvc Administrator Staff Member

    Swing là gì ? Cách sử dụng các thành phần cơ bản của Swing.

    Trong loạt bài này Huy cùng các bạn sẽ tìm hiểu những khái niệm về Swing của như cách sử dụng các thành phần cơ bản của Swing.

    1. Swing là gì ?

    Swing là bộ công cụ GUI thế hệ kế tiếp mà Sun Microsystems tạo ra cho phép môi trường phát triển enterprise trong Java.Bằng môi trường phát triển enterprise, chúng ta hiểu rằng, các lập trình viên có thể sử dụng Swing để tạo ra các ứng dụng Java có khả năng mở rộng với một dãy nhiều thành phần mạnh mẽ. Thêm vào đó, bạn có thể kế thừa hoặc chỉnh sửa những thành phần này để điều khiển việc hiển thị và các hành xử của chúng.
    Swing không phải là một từ viết tắt. Đó là tên thay thế cho một tập hợp lựa chọn của nó cho các designer khi dự án được thực hiện vào 1996. Swing thật sự là một phần của gia đình rộng lớn các sản phẩm của Java được biết đến như Java Foundation Classes s(JFC) bao gồm nhiều đặc điểm của Internet Foundation Classes của Netscape cũng như bị ảnh hưởng thiết kế của Taligent và Lighthouse Design của IBM. Swing được phát triển thật sự kể từ thời điểm bản beta của JDK 1.1, khoảng mùa xuân 1997. Swing API bản beta đưa ra khoảng nửa cuối 1997 và được chính thức phát hành vào tháng 3 năm 1998. Khi được phát hành, các thư viện của Swing 1.0 chứa khoảng 250 lớp và 80 giao tiếp. Sự phát triển được tiếp tục khi theo thời gian, bản Swing 1.4 chứa 85 giao tiếp public và 451 lớp public.
    Mặc dù Swing là được phát triển đơn lẻ từ lõi của Java Development Kit, nó yêu cầu phải có tối thiểu JDK 1.1.5 để chạy. Swing được xây dựng dựa trên những mô hình event được giới thiệu trong serie JDK 1.1. Bạn không thể sử dụng Swing với JDK 1.0.2, thêm vào đó bạn phải có Java 1.1 cho phép trình duyệt hỗ trợ Swing Applet. Java 2 SDK 1.4 được phát hành bao gồm nhiều lớp Swing được cập nhật và hỗ trợ một vài đặc điểm mới. Swing được tích hợp đầy đủ trong cả trong bộ công cụ của các nhà phát triển và runtime environment của tất cả các bản phát hành Java 2 (SDK 1.2 và những phiên bản cao hơn) chứa cả Java Plug-in.

    2. JSlider

    JSider là một thành phần của Swing giúp cho người dùng có thể lựa chọn một giá trị số trong khoảng giá trị người lập trình đặt ra. Lợi ích của JSlider là có thể biểu diển giá trị số của người dùng nhập và bằng giao diện trực quan, giúp dữ liệu toàn vẹn.
    - Cách tạo và sử dụng JSlider trong Netbean
    Tạo một Jframe form mới, mình đặt tên là Demo_JSlider, chọn và kéo icon JSlider trong Palette/ Swing Control của Netbean vào trong Jframe
    [​IMG]
    Chúng ta cùng tìm hiều những thuộc tính cơ bản của JSlider trong Netbean
    ------ Thuộc tính maximum : là giá trị lớn nhất của Slider
    ------ Thuộc tính minimum : là giá trị nhỏ nhất của Slider
    ------ Thuộc tính value: là giá trị hiện thời của Slider
    ------ Thuộc tính majorTickSpacing: là khoảng cách của từng giá trị trong Slider
    ------ Thuộc tính paintLabels : dùng để hiện thị giá trị số ở dưới JSlider
    ------ Thuộc tính paintLabels : dùng để hiện thị đánh dấu từng mứcị giá trị của JSlider
    ------ Thuộc tính paintTrack : dùng để hiện thị thanh trượt của JSlider
    Bây giờ chúng ta sẽ tạo ra 1 textfield và khi người dùng thay đổi giá trị của Slider thì giá trị sẽ hiện thị trong Slider
    -- Chọn Event cho JSlider là Statechange : cllick phải vào JSlider chọn events/ change/ statechange
    [​IMG]
    -- Gõ nội dung sự kiện cho statechange
    Note: t1 là Jtextfield, Sli là JSlide
    r---
    Kết quả :
    [​IMG]

    3. Timer


    Swing Timer phát sinh một hoạt nhiều sự kiện ActionEvent sau một khoảng thời gian xác định. Timer có thể được cấu hình để phát sinh sự kiện lập lại nhiều lần hoạt chỉ một lần duy nhất. Để sử dụng Timer bạn phải xác định thời gian phát sinh bằng mini giây và lắng nghe sự kiện ActionListener
    Lợi ích của Timer: nó dùng để đặt bẩy trong một thời gian xác định sẽ phát sinh, chúng ta có thể sử dụng nói để làm soft về thi, quy định thời gian làm bài, chương trình tính giờ, đồng hồ "tự chế"...

    Bây giờ Huy sẽ demo cho các bạn một chương trình nhỏ về timer để đếm thời gian theo giây nhé
    - Tạo Jframe mới (dĩ nhiên rồi).
    - Mình sẽ tạo ra giao diện như thế này.
    [​IMG]
    Khi chúng ta bấm nút bất đầu thì timer bắt đầu chạy, khi bâm nút ngừng hoạt stop thì timer sẽ ngừng.
    Bất đầu nhé !
    Chúng ta tạo một biến Timer và 2 biến Integer đại diện cho phút và giây toàn cục
    Khởi tạo và set đối tượng cho Timer trong hàm khởi tạo
    Hàm trên có y nghĩa sẽ đếm số giây và giây lớn hơn 59 sẽ cộng dồn sang phút và set cho "dem" là biến đếm thời gian
    Khi bấm nút "Bất đầu" thì ta sẽ khởi chạy Timer
    Khi bấm nút "Ngừng" thì ta sẽ tạm ngừng timer, và khi bấm "Bất đầu" lại thì nó đếm tiếp
    Khi bấm nút "Kết Thúc" thì ta sẽ tạm ngừng Timer và đồng tời set 2 biến mini và second thành giá tri 0, nếu bấm lại nút "Bất đầu" thì giá trị sẽ set lại 00:00
    Đây là kết quả của quá tình trên
    [​IMG]
    ------
    Có gì cho huy ý kiến nhé, Huy đang viết tiếp, sẽ share code sau khi hoàn thành bài viết này !
    congnghia likes this.
  2. ducphong

    ducphong Mod học việc

    Swing - Những Phần Nâng Cao

    Điều chỉnh các phạm vi

    Đôi khi một ứng dụng cần điều chỉnh phạm vi của một số widget, như là một Spinner (quay tròn) hoặc Slider (thanh trượt ), một cách động. Điều này có thể phức tạp hơn nó mong đợi. Các Slider, nói cụ thể, có các tính năng thứ cấp -- các dấu thời gian, khoảng cách dấu thời gian và các nhãn -- mà chúng có thể cần phải được điều chỉnh cùng với phạm vi đó để tránh bị lỗi nặng.

    Chương trình giới thiệu (demo) SwingSet2 không trực tiếp làm bất kỳ cái gì về điều này, do đó bạn sẽ thay đổi nó bằng cách gắn một ChangeListener cho một thanh trượt để có thể thay đổi thanh trượt khác. Nhập lớp SliderChangeListener mới, chỉ ra trong Liệt kê 2:

    Liệt kê 2. Thay đổi một phạm vi của thanh trượt
    Code:
    class SliderChangeListener implements ChangeListener {
           JSlider h;
    
           SliderChangeListener(JSlider h) {
                  this.h = h;
           }
    
           public void stateChanged(ChangeEvent e) {
               JSlider js = (JSlider) e.getSource();
               int i = js.getValue();
               h.setMaximum(i);
               h.repaint();
           }
    }
    
    Khi thanh trượt ngang thứ ba được tạo ra (một thanh trượt trong bản demo ban đầu có dấu đánh dấu tất cả các đơn vị và ghi nhãn tại 5, 10 và 11), một SliderChangeListener mới cũng được tạo ra, chuyển qua thanh trượt đó như là đối số hàm tạo (constructor). Khi thanh trượt dọc thứ ba (có phạm vi 0 đến100) được tạo ra, SliderChangeListener mới được thêm vào nó như là một người nghe (listener) thay đổi. Điều này làm việc gần như mong đợi: Điều chỉnh thanh trượt dọc thay đổi phạm vi của thanh trượt ngang.

    Thật không may, các dấu và các nhãn cũng chẳng làm việc tốt. Các nhãn có tối đa năm dấu làm việc tốt miễn là phạm vi này không quá lớn, nhưng nhãn phụ tại 11 nhanh chóng là vấn đề về tính sử dụng, như trong Hình 1:

    Hình 1. Các nhãn chạy cùng nhau
    [​IMG]

    Cập nhật các dấu và các nhãn

    Giải pháp rõ ràng sẽ đơn giản là đặt khoảng cách đánh dấu trên thanh trượt ngang, bất cứ khi nào giá trị tối đa của nó được cập nhật, như thể hiện trong Liệt kê 3:

    Liệt kê 3. Thiết lập khoảng cách đánh dấu
    Code:
    // DOES NOT WORK
    int tickMajor, tickMinor;
    tickMajor = (i > 5) ? (i / 5) : 1;
    tickMinor = (tickMajor > 2) ?  (tickMajor / 2) : tickMajor;
    h.setMajorTickSpacing(tickMajor);
    h.setMinorTickSpacing(tickMinor);
    h.repaint();
    
    Liệt kê 3 đúng theo như nó thực hiện, nhưng nó không dẫn đến sự thay đổi nào cho các nhãn được vẽ trên màn hình. Bạn phải thiết lập các nhãn một cách riêng biệt, sử dụng setLabelTable(). Thêm một dòng nữa để sửa chữa nó:
    Code:
    h.setLabelTable(h.createStandardLabels(tickMajor)); 
    Điều này vẫn còn để mặc cho bạn với các nhãn lẻ tại 11 đã được thiết lập ban đầu. Tất nhiên, mục đích này là phải có một nhãn luôn ở đầu mút phải của thanh trượt. Bạn có thể làm việc này bằng cách loại bỏ nhãn cũ (trước khi thiết lập giá trị tối đa mới) và sau đó thêm một nhãn mới. Mã này hầu như làm việc:

    Liệt kê 4. Thay thế các nhãn
    Code:
    public void stateChanged(ChangeEvent e) {
           JSlider js = (JSlider) e.getSource();
           int i = js.getValue();
    
           // clear old label for top value
           h.getLabelTable().remove(h.getMaximum());
    
           h.setMaximum(i);
    
           int tickMajor, tickMinor;
           tickMajor = (i > 5) ? (i / 5) : 1;
           tickMinor = (tickMajor > 2) ? (tickMajor / 2) : tickMajor;
           h.setMajorTickSpacing(tickMajor);
           h.setMinorTickSpacing(tickMinor);
           h.setLabelTable(h.createStandardLabels(tickMajor));
           h.getLabelTable().put(new Integer(i),
           new JLabel(new Integer(i).toString(), JLabel.CENTER));
           h.repaint();
    }
    

    Nếu tôi đã nói với bạn một lần, thì tôi đã nói với bạn hai lần


    Bởi hầu như tôi muốn nói là, mặc dù các mã trong Liệt kê 4 loại bỏ nhãn ở 11, nó không gắn nhãn mới tại i; thay vào đó, bạn chỉ thấy các nhãn tại các khoảng tickMajor. Giải pháp này ban đầu hơi gây sốc:

    Liệt kê 5. Thúc đẩy cập nhật hiển thị
    Code:
    h.setLabelTable(h.getLabelTable());
    
    rên thực tế hoạt động có vẻ vô nghĩa này có một tác động đáng kể. Các nhãn cho một thanh trượt được tạo ra bất cứ khi nào bảng nhãn được thiết lập. Không có cuộc gọi lại đặc biệt nào đối với các thay đổi trên bảng, do đó các giá trị mới được bổ sung vào bảng không nhất thiết phải có hiệu quả; không có hoạt động nào rõ ràng trong Liệt kê 5 có tác dụng phụ để cho Swing biết nó phải cập nhật hiển thị. (Vì sợ bạn nghĩ rằng tôi đã tự phát minh điều này, hãy chú ý rằng mã gốc SwingSet có lời gọi như vậy).

    Điều này chỉ có một vấn đề. Mong muốn rất hợp lý để đảm bảo rằng một nhãn xuất hiện ở cuối thanh trượt đôi khi đặt hai nhãn ngay liền kề với nhau, hoặc thậm chí còn chồng lên nhau, như trong Hình 2:

    Hình 2. Xếp chồng các nhãn ở cuối thanh trượt
    [​IMG]

    Có thể có một số giải pháp cho vấn đề này. Một là viết mã riêng của bạn để điền các giá trị vào bảng nhãn và dừng trình tự trước, để cho nhãn cuối cùng trong trình tự đó được phân tách một chút khỏi đầu mút của thanh trượt này. Tôi sẽ để lại phần này như là một bài tập cho bạn.

    Cập nhật các trình đơn


    Trong nhiều trường hợp, để hạn chế các thay đổi trình đơn để cho phép và đình chỉ các mục trình đơn là hoàn toàn thực tế. Cách tiếp cận này tùy thuộc vào cảnh báo chung được áp dụng để đình chỉ các mục: Tránh bỏ quên chương trình của bạn trong trạng thái không sử dụng được do vô tình đình chỉ các mục chủ yếu.

    Cũng có thể thêm hoặc xoá các mục trình đơn hoặc các trình đơn con. Thật không dễ dàng để thay đổi một JMenuBar; không có giao diện nào để loại bỏ hoặc thay thế các trình đơn riêng biệt khỏi thanh này. Nếu bạn muốn thay đổi một thanh (để khỏi thêm các trình đơn mới vào đầu mút phải của nó), bạn cần phải tạo một thanh mới và dùng nó thay thế cho một thanh cũ.

    Các thay đổi cho các trình đơn riêng biệt có hiệu lực ngay lập tức; bạn không cần phải xây dựng một trình đơn trước khi gắn nó vào một thanh hoặc trình đơn khác. Khi bạn cần phải thay đổi lựa chọn của mình về các tùy chọn trình đơn, cách dễ nhất là thay đổi một trình đơn cụ thể. Tuy nhiên, bạn có thể muốn thêm vào và loại bỏ toàn bộ các trình đơn và để làm như vậy chẳng có khó khăn đặc biệt nào. Liệt kê 6 cho thấy một ví dụ đơn giản của một phương thức chèn một trình đơn vào thanh trình đơn trước một chỉ mục đã cho. Ví dụ này giả định rằng JMenuBar được thay thế được gắn vào một đối tượng JFrame, nhưng bất cứ điều gì cho phép bạn nhận được và thiết lập các thanh menu sẽ làm việc theo một cách giống như vậy:

    Liệt kê 6. Chèn một trình đơn vào thanh trình đơn
    Code:
    public void insertMenu(JFrame frame, JMenu menu, int index) {
           JMenuBar newBar = new JMenuBar();
           JMenuBar oldBar = frame.getJMenuBar();
           MenuElement[] oldMenus = oldBar.getSubElements();
           int count = oldBar.getMenuCount();
           int i;
    
           for (i = 0; i < count; ++i) {
                  if (i == index)
                         newBar.add(menu);
                  newBar.add((JMenu) oldMenus[i]);
           }
           frame.setJMenuBar(newBar);
    }
    
    Mã này không phải là những gì mà tôi đã nhắm trước tiên; phiên bản cuối cùng này, được sửa chữa cẩn thận để nó hoạt động, phản ánh một vấn đề khó khăn về các thói quen thú vị. Ban đầu có thể có vẻ như cách rõ ràng để thực hiện điều này sẽ là sử dụng getComponentAtIndex(), nhưng điều đó đã bị phản đối. May mắn thay, giao diện getSubElements() là đủ tốt. Khuôn mẫu với JMenu cho newBar.add() có lẽ an toàn, nhưng tôi không thích nó. Giao diện getSubElements() hoạt động trên trình đơn, không chỉ là các thanh trình đơn; các trình đơn có thể có các phần tử con theo một số kiểu, nhưng các JMenu là các phần tử duy nhất mà bạn có thể thêm vào JMenuBar. Vì vậy bạn phải tạo khuôn mẫu phần tử đó cho JMenu để vượt qua nó đến phương thức JMenuBar.add(). Thật không may là nếu bản sửa đổi API trong tương lai cho phép bạn thêm các phần tử của các kiểu khác với JMenu cho một JMenuBar, thì nó sẽ không còn cần thiết nữa, hoặc thậm chí an toàn, để tạo khuôn mẫu các phần tử trả về tới JMenu.

    Mã trong Liệt kê 6 phản ánh một điều khác ngoài thói quen giao diện khôn ngoan; vấn đề trình đơn phải được lưu trữ trước. Khi các trình đơn được thêm vào thanh mới, chúng được tách khỏi thanh cũ. Mã trong Liệt kê 7, mặc dù nó có vẻ tương tự, nhưng không làm việc; vòng lặp chấm dứt sớm:

    Liệt kê 7. Vòng lặp kết thúc quá sớm
    Code:
    // DOES NOT WORK
    for (i = 0; i < oldBar.getMenuCount(); ++i) {
           if (i == index)
                  newBar.add(menu);
           newBar.add((JMenu) oldMenus[i]);
    }
    
    Vòng lặp trong Liệt kê 7 sao chép chỉ một nửa các mục đó. Ví dụ, nếu bốn mục có trên thanh trình đơn để bắt đầu, nó sao chép hai mục đầu tiên. Sau khi sao chép mục thứ nhất, i là 1 và getMenuCount() trả về 3; sau khi sao chép mục thứ hai, i là 2 và getMenuCount() trả về 2, do đó, vòng lặp kết thúc. Tôi không thể tìm thấy bất kỳ tài liệu hướng dẫn về "tính năng" nào, theo đó việc thêm một trình đơn vào một thanh loại bỏ nó khỏi thanh khác, vì vậy nó có thể không phải do cố ý. Vẫn còn, thật dễ dàng đủ để tiến gần đến.

    Loại bỏ một trình đơn từ một thanh trình đơn dễ dàng hơn một chút; chỉ cần sao chép tất cả các trình đơn khác hơn từ thanh cũ đến thanh mới, và bạn đã hoàn tất. Thật dễ dàng!

    Nếu giao diện của bạn sử dụng rất nhiều thông tin cập nhật trình đơn động, có lẽ tốt hơn là tạo ra một bộ các thanh trình đơn và chuyển giữa chúng, thay vì cập nhật chúng lúc đang hoạt động trong tất cả thời gian. Tuy nhiên, nếu bạn thay đổi nhiều trình đơn, bạn cũng có thể khiến người dùng của bạn theo cách hoàn toàn điên rồ.

    Lỗi viết: Trong quá trình soạn thảo bài viết này, tôi đã không chú ý đến danh sách các phương thức kế thừa của lớp JMenuBar. Trong thực tế, nó có cả phương pháp remove (loại bỏ) và add (bổ sung) sẵn sàng để loại bỏ hay chèn một chỉ số đặc biệt. Bài học nữa là: hãy kiểm tra các phương thức kế thừa, không chỉ các phương thức lớp cụ thể.

    Thay đổi lại kích thước cửa sổ


    Một điều rất may mắn là trong đa số trường hợp, việc thay đổi kích thước cửa sổ xảy ra tự động. Nhưng bạn cần phải tính đến một vài tác động về việc thay đổi kích thước. Các thanh nút ấn, các thanh trình đơn và các tính năng tương tự có thể trở thành vấn đề trong một cửa sổ rất nhỏ. Các bảng (panel) đồ họa mà chương trình của bạn quản lý tự nó cần phải đáp ứng các sự kiện thay đổi kích cỡ. Hãy để cho Swing xử lý đóng gói các phần tử UI, nhưng chú ý đến kích thước của các phần tử; không chỉ nhận được kích thước một lần và tiếp tục sử dụng các giá trị đó.

    Khôn khéo hơn, một số quyết định thiết kế, như tần suất của các dấu trên các thanh trượt, có thể được cập nhật hợp lý để đáp ứng với các sự kiện thay đổi kích thước cửa sổ. Độ rộng của một thanh trượt 100 pixel (điểm ảnh) không thể có nhiều nhãn có thể đọc như độ rộng một thanh trượt 400 điểm ảnh. Bạn có thể muốn lấy thêm một số các UI của bạn bằng cách thêm toàn bộ các tính năng tiện lợi mới về hiển thị lớn hơn.

    Tuy nhiên, phần lớn, bạn có thể bỏ qua việc thay đổi kích thước cửa sổ. Những gì bạn không nên làm là ngăn chặn hay ghi đè lên nó không cần thiết. Sự thuận tiện bên lề so với mã thể hiện của bạn không là điều cần thiết. Một kích thước cửa sổ tối thiểu có thể là hợp lý, nhưng hãy cho phép mọi người tạo ra các cửa sổ lớn như họ muốn.

    Nguyên tắc chung


    Bộ công cụ Swing cung cấp rất nhiều tính linh hoạt cho thiết kế giao diện người dùng. Được sử dụng cẩn thận, tùy chọn về cập nhật một giao diện trong lúc đang hoạt động có thể đơn giản hóa giao diện đó đáng kể; việc trình bày một trình đơn chỉ khi tùy chọn của nó áp dụng, ví dụ, có thể dễ dàng hơn cho người sử dụng.

    Thật không may, một số tính năng API làm cho cách tiếp cận này có khả năng là một thói quen nhỏ và những tác dụng phụ và các tương tác không phải lúc nào cũng được tạo tài liệu tốt như bạn mong muốn. Nếu bạn có ý tưởng về giao diện động, thì hãy sẵn sàng dành chút thời gian nữa cho việc gỡ rối. Bạn cũng có thể đang hoạt động ngoài các góc của thư viện Swing và thấy mình cần phải tiến gần đến nắm bắt các hành vi và/hoặc các lỗi.

    Đừng để việc thiếu sự thực hiện rõ ràng ngăn cản bạn. Ví dụ JMenuBar của bài viết này cho thấy, ngay cả khi không có sự hỗ trợ cho một nhiệm vụ trong API, bạn vẫn có thể có khả năng tự mình thực hiện nó, mặc dù có một chút gián tiếp.

    Đừng quá nhiệt tình. Các UI động lúc tốt nhất của chúng là khi chúng làm cho các hạn chế vốn có rõ ràng hơn cho người dùng. Lý tưởng, một người dùng có thể thậm chí không nhận thấy rằng một giao diện đang thay đổi. Nếu thời gian duy nhất mà chúng có thể sử dụng trình đơn Object (Đối tượng) của chương trình là khi chúng có một đối tượng được chọn, thì chúng sẽ không nhớ rằng trình đơn đó không có phần thời gian còn lại ở đó.

    Mặt khác, nếu có một khả năng tồn tại là người dùng không thể đoán được lí do không có sẵn một tùy chọn, tốt hơn là để người dùng thử một hành động và nhận được thông báo lỗi thông tin. Điều này đặc biệt quan trọng đối với một số hành động. Nếu tùy chọn save bị đình chỉ, điều đó không giúp gì nhiều, khi tôi muốn lưu dữ liệu của mình. Chương trình này rất có thể nghĩ rằng nó đã được lưu lại, nhưng tại sao không cho tôi lưu nó! Và nếu có một lý do cụ thể tại sao tôi không thể lưu tệp này, có lẽ tôi muốn biết đó là gì.

    Thiết kế giao diện, mặc dù đã nhiều năm nghiên cứu, vẫn còn là một lĩnh vực trẻ theo nhiều cách khác nhau. Hãy thử nghiệm một chút. Các thay đổi động cho các UI có thể là một tính năng tuyệt vời làm cho chúng rõ ràng hơn, đơn giản hơn, và phản ứng nhanh hơn. Việc thêm các tính năng động yêu cầu bất cứ thứ gì từ công việc cần một vài phút đến một nhiệm vụ cần thời gian đáng kể.
  3. kekedaine

    kekedaine Member

    Ðề: Swing là gì ? Cách sử dụng các thành phần cơ bản của Swing.

    bài viết rất có ý nghĩa, cố gắng hoàn thành sớm đi bác !
    tham gia 4rum ni lâu rồi mà giờ mới reg đc 1 cái acc
  4. MUforever107

    MUforever107 New Member

    Ðề: Swing là gì ? Cách sử dụng các thành phần cơ bản của Swing.

    Viết tiếp đi các pro ơi :D Mà share code với cho anh em tham khảo với :D
  5. kekedaine

    kekedaine Member

    Ðề: Swing là gì ? Cách sử dụng các thành phần cơ bản của Swing.

    híc, lâu quá bro ơi !
  6. cocain

    cocain New Member

    Ðề: Swing là gì ? Cách sử dụng các thành phần cơ bản của Swing.

    Swing giống hệt WinForm trong .Net. Rất hay!
  7. lethiminhchau

    lethiminhchau New Member

    Ðề: Swing là gì ? Cách sử dụng các thành phần cơ bản của Swing.

    Chào mọi người mình đang làm đề tài có liên quan đến timer mình đã làm theo hướng dẫn của tranhuyvc nhưng chưa được.Hy vong bạn có thể post code lên cho mình tham khảo với.
    Than!
  8. monday0rsunday

    monday0rsunday Active Member

    Ðề: Swing là gì ? Cách sử dụng các thành phần cơ bản của Swing.

    Đơn giản nhất là bạn lập 1 topic trợ giúp, post code lên và mọi người sẽ giúp bạn. Vấn đề này ko phải là phức tạp cho lắm .
  9. lethiminhchau

    lethiminhchau New Member

    Ðề: Swing là gì ? Cách sử dụng các thành phần cơ bản của Swing.

    hi.Mới tham gia diễn đàn nên còn chưa biết nhiều thứ.:-$
    new topic chỗ nào vậy bạn mình không thấy.???:-?
    mình đưa code lên cho mọi người xem giúp.
  10. boy1988na

    boy1988na New Member

    Ðề: Swing là gì ? Cách sử dụng các thành phần cơ bản của Swing.

    Mong pro viết tiếp. đọc đang hứng :-B
  11. hoangtu8811

    hoangtu8811 Member

    Ðề: Swing là gì ? Cách sử dụng các thành phần cơ bản của Swing.

    Đây là demo của mình về đồng hồ bấm giờ...share lên để nhờ mọi người chỉ giáo...vừa mới học được Timer..hihhi:o3
    PHP:
    import javax.swing.*;
    import java.awt.*;
    import java.util.*;
    import java.awt.event.*;
    import javax.swing.Timer;
    public class 
    DongHoDoTG extends JFrame implements ActionListener{
        
    JFrame frame = new JFrame();
        
    JLabel lb1,lb2,lb3;
        
    JButton bt1,bt2,bt3;
        
    JPanel pn1,pn2,pn3;
        private 
    int hour=0,min=0,sec=0,ptsec=0;
        private 
    String gio,phut,giay,ptgiay;
        
    Timer t =  new Timer(10,new ActionListener(){
            @
    Override
                
    public void actionPerformed(ActionEvent e)
                {
                    ++
    ptsec;
                    if(
    ptsec==100)
                    {
                        
    ptsec=0;
                        ++
    sec;
                        if(
    sec==60)
                         {
                            
    sec=0;
                            
    min++;
                             if(
    min==60)
                               {
                                  
    min=0;
                                  
    hour++;
                               }
                         }
                  }    
                if(
    ptsec<10ptgiay="0" String.valueOf(ptsec); else ptgiayString.valueOf(ptsec);
                if(
    sec<10giay="0"String.valueOf(sec); else giayString.valueOf(sec);
                if(
    min<10phut="0"String.valueOf(min); else phutString.valueOf(min);
                if(
    hour<10gio="0" String.valueOf(hour); else gioString.valueOf(hour);
                    
    lb3.setText(gio " : "phut " : " giay " : " ptgiay);
                }
        });
        
    DongHoDoTG(){
            
    super("Dong Ho Do Thoi Gian");
            
    setLayout(new GridLayout(3,1));
            
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            
    pn1= new JPanel(new FlowLayout(FlowLayout.CENTER));
            
    pn2= new JPanel(new FlowLayout(FlowLayout.CENTER));
            
    pn3= new JPanel(new FlowLayout(FlowLayout.CENTER));
            
    lb1= new JLabel("Demo Timer QuangHuy",JLabel.CENTER);
            
    lb1.setFont(new Font("Times New Roman",Font.BOLD,15));
            
    lb1.setForeground(Color.blue);
            
    pn1.add(lb1);
            
    lb2= new JLabel("Time: ");
            
    pn2.add(lb2);
            
    lb3 = new JLabel("00 : 00 : 00 : 00");
            
    lb3.setFont(new Font("Arial",Font.BOLD,20));
            
    lb3.setForeground(Color.red);
            
    pn2.add(lb3);
            
    bt1 = new JButton("Start");
            
    bt2 = new JButton("Stop");
            
    bt3 = new JButton("Reset");
            
    bt1.addActionListener(this);
            
    bt2.addActionListener(this);
            
    bt3.addActionListener(this);
            
    pn3.add(bt1);
            
    pn3.add(bt2);
            
    pn3.add(bt3);
            
    add(pn1);
            
    add(pn2);
            
    add(pn3);
            
    setSize(400,200);
            
    setVisible(true);
            
    setLocationRelativeTo(null);
            
    show();
        }
        public 
    void actionPerformed(ActionEvent e)
        {
            if(
    e.getSource()==bt1t.start();
            else if(
    e.getSource()==bt2t.stop();
            else if(
    e.getSource()==bt3)
            {
                
    t.stop();
                
    sec=min=0;
                
    lb3.setText("00 : 00 : 00 : 00")    ;
            }
        }
        public static 
    void main(String[] args) {
          new 
    DongHoDoTG()    ;
        }
    }

  12. doantrinhnhat

    doantrinhnhat New Member

    mình cũng mới học java,đang học swing.làm được cái menu,đơn giản chỉ thây đổi hình nền,dùng phím tắt và popupmenu.
    và mình cũng muốn phát triển nó hơn xíu nữa,nên mong mọi người góp ý kiến nha!!thank tất cả...

    //**************************************************************************************************************
    package chuong9;
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import javax.swing.Icon; // interface used to manipulate images
    import javax.swing.ImageIcon;
    public class JMenuSum{
    public static void main(String []args){
    JFrame frame=new JFrame("JMenuDemo");

    //JPanel
    final JPanel panel=new JPanel();
    frame.add(panel);
    ActionListener listener=new MenuItemActionListener(panel);
    JMenuBar mybar=new JMenuBar();
    frame.setJMenuBar(mybar);

    //file
    JMenu file=new JMenu("File");
    file.add(phimtat("New",listener,"new",'N',KeyEvent.VK_N));
    file.add(phimtat("Open",listener,"open",'O',KeyEvent.VK_O));
    file.addSeparator();
    file.add(phimtat("Save",listener,"save",'S',KeyEvent.VK_S));
    file.add(phimtat("Save As",listener,"saveas",'A',KeyEvent.VK_A));
    file.addSeparator();
    file.add(phimtat("Red",listener,"red",'R',KeyEvent.VK_R));
    file.addSeparator();
    file.addSeparator();
    file.add(phimtat("Exit",listener,"exit",'E',KeyEvent.VK_E));

    mybar.add(file);

    //edit
    JMenu edit =new JMenu("Edit");
    edit.add(phimtat("Cut",listener,"cut",0,0));
    edit.add(phimtat("Copy",listener,"copy",0,0));
    edit.add(phimtat("Paste",listener,"paste",0,0));
    edit.addSeparator();
    edit.addSeparator();
    edit.add(phimtat("Blue",listener,"blue",0,0));

    mybar.add(edit);

    //popupmenu
    final JPopupMenu popup=new JPopupMenu();
    popup.add(phimtat("Green",listener,"green",0,0));
    popup.add(phimtat("Font",listener,"font",0,0));
    popup.addSeparator();
    popup.addSeparator();

    //submenu
    JMenu color =new JMenu("Color");
    popup.add(color);
    ButtonGroup btg =new ButtonGroup();
    color.add(radioitem("Yellow",listener,"yellow",btg));
    color.add(radioitem("Cyan",listener,"cyan",btg));

    //xu li chuot phai
    frame.addMouseListener(new MouseAdapter() {
    public void mousePressed(MouseEvent e) {
    // Nếu click chuột phải
    if (e.getButton()==3)
    popup.show((Component)e.getSource(), e.getX(), e.getY());
    }
    });

    //JFrame
    frame.setSize(700,400);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    //thuc thi phimtat()
    public static JMenuItem phimtat(String label,ActionListener listener,String command,int mnemonic,int acceleratorKey){
    JMenuItem item = new JMenuItem(label);
    item.addActionListener(listener);
    item.setActionCommand(command);
    if (mnemonic != 0)
    item.setMnemonic((char) mnemonic);
    if (acceleratorKey != 0)
    item.setAccelerator(KeyStroke.getKeyStroke(acceleratorKey,java.awt.Event.CTRL_MASK));
    return item;
    }

    //thuc thi submenu
    public static JMenuItem radioitem(String label, ActionListener listener,
    String command, ButtonGroup mutExGroup) {
    JMenuItem item = new JRadioButtonMenuItem(label);
    item.addActionListener(listener);
    item.setActionCommand(command);
    mutExGroup.add(item);
    return item;
    }

    //xu li su kien
    public static class MenuItemActionListener implements ActionListener {
    Component parent;
    public MenuItemActionListener(Component parent) {
    this.parent = parent;
    }
    public void actionPerformed(ActionEvent e) {
    JMenuItem item = (JMenuItem) e.getSource();
    String cmd = item.getActionCommand();
    if (cmd.equals("exit"))
    System.exit(0);
    if (cmd.equals("red"))
    this.parent.setBackground(Color.RED);
    if (cmd.equals("blue"))
    this.parent.setBackground(Color.BLUE);
    if (cmd.equals("green"))
    this.parent.setBackground(Color.GREEN);
    if (cmd.equals("yellow"))
    this.parent.setBackground(Color.YELLOW);
    if (cmd.equals("cyan"))
    this.parent.setBackground(Color.CYAN);
    else
    JOptionPane.showMessageDialog(parent, cmd + " chua cai dat");

    }
    }
    }

Chia sẻ trang này


Quan ly con cai |Viet Track |Giam sat dien thoai