text:
Máy phát điện 200kva
Chuyên mua bán máy phát điện cũ 200kva nhập khẩu từ nhật, máy phát điện cũ 200kva Denyo, máy phát điện cũ 200kva hàng bãi của nhật, máy phát điện cũ 200kva công nghiệp giá rẻ tại tphcm, máy phát điện cũ 200kva 3 pha động cơ mitsubishi đã qua sử dụng. Cho thuê máy phát điện cũ 200kva, thanh lý máy phát điện cũ. Nhận sửa chữa bảo trì máy phát điện cũ 200kva tận nơi.
Máy phát điện cũ 200kva
Máy phát điện cũ 200kva (Máy phát điện Nhật bãi). Mua bán máy phát điện cũ...
Máy phát điện cũ 200kva Komatsu
Máy phát điện cũ 200kva Komatsu (Máy phát điện Nhật bãi). Mua bán máy phát...
Máy phát điện cũ 200kva Mitsubishi
Máy phát điện cũ 200kva Mitsubishi (Máy phát điện Nhật bãi). Mua bán máy phát...
Máy phát điện cũ 200kva Nissan
Máy phát điện cũ 200kva Nissan (Máy phát điện Nhật bãi). Mua bán máy phát...
Máy phát điện cũ 200kva Isuzu
Máy phát điện cũ 200kva Isuzu (Máy phát điện Nhật bãi). Mua bán máy phát điện...
Máy phát điện cũ 200kva Yanmar
Máy phát điện cũ 200kva Yanmar (Máy phát điện Nhật bãi). Mua bán máy phát...
Máy phát điện cũ 200kva Hino
Máy phát điện cũ 200kva Hino (Máy phát điện Nhật bãi). Mua bán máy phát điện...
Máy phát điện cũ 200kva Denyo
Máy phát điện cũ 200kva Denyo (Máy phát điện Nhật bãi). Mua bán máy phát điện...

markdown:
# Máy phát điện 200kva
Chuyên mua bán máy phát điện cũ 200kva nhập khẩu từ nhật, máy phát điện cũ 200kva Denyo, máy phát điện cũ 200kva hàng bãi của nhật, máy phát điện cũ 200kva công nghiệp giá rẻ tại tphcm, máy phát điện cũ 200kva 3 pha động cơ mitsubishi đã qua sử dụng. Cho thuê máy phát điện cũ 200kva, thanh lý máy phát điện cũ. Nhận sửa chữa bảo trì máy phát điện cũ 200kva tận nơi.
[Máy phát điện cũ 200kva](https://mayphatdiencu.info.vn/may-phat-dien-cu-200kva/)
Máy phát điện cũ 200kva (Máy phát điện Nhật bãi). Mua bán máy phát điện cũ...
[Máy phát điện cũ 200kva Komatsu](https://mayphatdiencu.info.vn/may-phat-dien-cu-200kva-komatsu/)
Máy phát điện cũ 200kva Komatsu (Máy phát điện Nhật bãi). Mua bán máy phát...
[Máy phát điện cũ 200kva Mitsubishi](https://mayphatdiencu.info.vn/may-phat-dien-cu-200kva-mitsubishi/)
Máy phát điện cũ 200kva Mitsubishi (Máy phát điện Nhật bãi). Mua bán máy phát...
[Máy phát điện cũ 200kva Nissan](https://mayphatdiencu.info.vn/may-phat-dien-cu-200kva-nissan/)
Máy phát điện cũ 200kva Nissan (Máy phát điện Nhật bãi). Mua bán máy phát...
[Máy phát điện cũ 200kva Isuzu](https://mayphatdiencu.info.vn/may-phat-dien-cu-200kva-isuzu/)
Máy phát điện cũ 200kva Isuzu (Máy phát điện Nhật bãi). Mua bán máy phát điện...
[Máy phát điện cũ 200kva Yanmar](https://mayphatdiencu.info.vn/may-phat-dien-cu-200kva-yanmar/)
Máy phát điện cũ 200kva Yanmar (Máy phát điện Nhật bãi). Mua bán máy phát...
[Máy phát điện cũ 200kva Hino](https://mayphatdiencu.info.vn/may-phat-dien-cu-200kva-hino/)
Máy phát điện cũ 200kva Hino (Máy phát điện Nhật bãi). Mua bán máy phát điện...
[Máy phát điện cũ 200kva Denyo](https://mayphatdiencu.info.vn/may-phat-dien-cu-200kva-denyo/)
Máy phát điện cũ 200kva Denyo (Máy phát điện Nhật bãi). Mua bán máy phát điện...


text:
Luật giáo dục đại học (ban hành năm 2012, có hiệu lực từ đầu năm 2013) quy định trường đại học được phân tầng thành ba loại: định hướng nghiên cứu, định hướng ứng dụng và định hướng thực hành. Từ đó đến nay, định hướng nghiên cứu đang là chiến lược và mục tiêu phát triển của nhiều trường ở Việt Nam. Để thực hiện thành công mô hình này, công tác nghiên cứu khoa học phải được xem là ưu tiên hàng đầu và đội ngũ giảng viên ở các trường cần được tạo điều kiện tốt nhất để phát huy tối đa tiềm lực sáng tạo, khả năng nghiên cứu khoa học.
Trước hết, các trường nên phân giảng viên thành hai ngạch, đó là giảng viên với nhiệm vụ trọng tâm là nghiên cứu khoa học (có tham gia giảng dạy nhưng số giờ được giảm thiểu), và ngạch còn lại sẽ chú trọng công tác giảng dạy (vẫn cần có tham gia nghiên cứu khoa học nhưng yêu cầu ít hơn), để tránh sự quá tải trong công việc. Thực tế bên cạnh phải đảm bảo số giờ dạy nhiều, giảng viên còn chịu áp lực khá lớn đối với yêu cầu nghiên cứu khoa học, thể hiện bằng chỉ tiêu bắt buộc số bài báo công bố hoặc số đề tài nghiên cứu thực hiện, trong điều kiện còn rất nhiều khó khăn.
Họ còn phải dành thời gian cho công tác phục vụ kiểm định chất lượng giáo dục theo các tiêu chuẩn (của Bộ Giáo dục, tiêu chuẩn AUN, ABET…) mà nhiều trường đang triển khai, hay phải tham dự các khóa học cải cách sư phạm, đổi mới khung chương trình đào tạo, hoặc những công việc hành chính không tên khác theo yêu cầu của nhà trường. Việc quá tải và chịu áp lực liên tục, trong khi thu nhập lại không tương xứng như hiện nay, có thể khiến nhiều giảng viên không thể hoàn thành công việc một cách tốt nhất theo đúng sở thích, khả năng cũng như tâm huyết của mình, mà dễ làm họ sẽ “chạy” theo công việc một cách đối phó, miễn cưỡng và mang tính hình thức.
Vì vậy, việc phân ngạch giảng viên theo đam mê, nguyện vọng và thế mạnh của mỗi cá nhân sẽ giúp họ phát huy tối đa năng lực trong từng mảng việc cụ thể.
Trong quá trình thực hiện mục tiêu đại học định hướng nghiên cứu, một vấn đề khác cần được chú trọng là đẩy mạnh sự liên kết giữa giảng viên trong cùng một trường và giữa các trường với nhau để tạo thành những nhóm nghiên cứu mạnh, hoạt động hiệu quả và thực chất. Sự gắn kết này không chỉ giúp giảng viên, nhà khoa học trao đổi học thuật, cùng tham gia hợp tác nghiên cứu cho ra những sản phẩm khoa học được cộng đồng quốc tế thừa nhận (thể hiện qua việc xuất bản các bài báo trên tạp chí chuyên ngành uy tín của thế giới), mà còn giúp các nhóm nghiên cứu chứng minh được năng lực để có thể xin được nguồn tài trợ với kinh phí lớn cho các đề tài. Từ đó tạo điều kiện để nâng cao thu nhập cho đội ngũ giảng viên này. Bởi khi không tham gia giảng dạy nhiều mà dành thời gian chính cho công tác nghiên cứu thì thu nhập cá nhân của họ sẽ sụt giảm đáng kể, do không còn nhận khoản tiền đứng lớp.
Cần ghi nhận rằng, từ năm 2008, sự ra đời của quỹ phát triển khoa học và công nghệ quốc gia (Nafosted), cùng với chương trình trọng điểm cấp nhà nước đã thúc đẩy nghiên cứu khoa học ở Việt Nam đạt được những bước tiến, cả về chất và lượng, cũng như cải thiện thu nhập của người làm khoa học. Tuy nhiên, để tạo nên những bước đột phá trong lĩnh vực này, cần có sự đầu tư kinh phí mạnh mẽ và lâu dài hơn cho các đề tài khoa học, thay vì thông thường 2-3 năm cho một đề tài như hiện nay. Điều này sẽ được thực hiện một cách hiệu quả thông qua mô hình trung tâm xuất sắc (centre of excellence), được hình thành dựa trên sự liên kết, hợp tác giữa giảng viên, nhà khoa học thuộc các cơ sở giáo dục đại học khác nhau, nhưng cùng chia sẻ một dự án nghiên cứu có quy mô lớn và được Nhà nước đồng ý hỗ trợ kinh phí sau khi đã xét duyệt đề cương.
Trung tâm xuất sắc tạo ra từ mô hình trên chắc chắn sẽ là “con gà đẻ trứng vàng” về thành tựu khoa học cho các trường theo định hướng nghiên cứu. Các trung tâm này có thể duy trì hoạt động trong 5-10 năm, tùy theo quy mô của dự án nghiên cứu và nguồn tiền được Nhà nước đầu tư. Nếu so sánh với kinh phí Nhà nước đã chi tiêu vào một số đề án giáo dục và khoa học công nghệ, ví dụ đề án tin học hóa hành chính vào đầu những năm 2000 là hơn 1.500 tỷ đồng và đề án ngoại ngữ quốc gia 2020 là cỡ gần 10.000 tỷ đồng, thì kinh phí cho một trung tâm nghiên cứu hoặc một nhóm nghiên cứu hoạt động hiệu quả trong khoảng vài năm ở Việt Nam không phải là điều bất khả thi.
Nghiên cứu khoa học của Việt Nam chỉ có thể có sự chuyển biến lớn, làm nền tảng để xây dựng các trường đại học định hướng nghiên cứu, một khi chúng ta chịu đổi mới cơ chế quản lý, phân ngạch cán bộ giảng viên, nhằm giảm thiểu áp lực công việc và tối ưu hóa hiệu quả làm việc của đội ngũ này. Bên cạnh đó, Nhà nước cần có sự đầu tư thích đáng hơn nữa, tạo điều kiện khuyến khích sự gắn kết giữa các giảng viên, nhà khoa học của các trường, cho họ không gian tự do học thuật, lành mạnh, để từ đó hình thành các trung tâm, nhóm nghiên cứu đủ sức tiếp cận được với trình độ của các nước phát triển trên thế giới.
TS Đinh Bá Khương
Đại học Hoàng gia London (Imperial College London)
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.

markdown:
Luật giáo dục đại học (ban hành năm 2012, có hiệu lực từ đầu năm 2013) quy định trường đại học được phân tầng thành ba loại: định hướng nghiên cứu, định hướng ứng dụng và định hướng thực hành. Từ đó đến nay, định hướng nghiên cứu đang là chiến lược và mục tiêu phát triển của nhiều trường ở Việt Nam. Để thực hiện thành công mô hình này, công tác nghiên cứu khoa học phải được xem là ưu tiên hàng đầu và đội ngũ giảng viên ở các trường cần được tạo điều kiện tốt nhất để phát huy tối đa tiềm lực sáng tạo, khả năng nghiên cứu khoa học.
Trước hết, các trường nên phân giảng viên thành hai ngạch, đó là giảng viên với nhiệm vụ trọng tâm là nghiên cứu khoa học (có tham gia giảng dạy nhưng số giờ được giảm thiểu), và ngạch còn lại sẽ chú trọng công tác giảng dạy (vẫn cần có tham gia nghiên cứu khoa học nhưng yêu cầu ít hơn), để tránh sự quá tải trong công việc. Thực tế bên cạnh phải đảm bảo số giờ dạy nhiều, giảng viên còn chịu áp lực khá lớn đối với yêu cầu nghiên cứu khoa học, thể hiện bằng chỉ tiêu bắt buộc số bài báo công bố hoặc số đề tài nghiên cứu thực hiện, trong điều kiện còn rất nhiều khó khăn.
Họ còn phải dành thời gian cho công tác phục vụ kiểm định chất lượng giáo dục theo các tiêu chuẩn (của Bộ Giáo dục, tiêu chuẩn AUN, ABET…) mà nhiều trường đang triển khai, hay phải tham dự các khóa học cải cách sư phạm, đổi mới khung chương trình đào tạo, hoặc những công việc hành chính không tên khác theo yêu cầu của nhà trường. Việc quá tải và chịu áp lực liên tục, trong khi thu nhập lại không tương xứng như hiện nay, có thể khiến nhiều giảng viên không thể hoàn thành công việc một cách tốt nhất theo đúng sở thích, khả năng cũng như tâm huyết của mình, mà dễ làm họ sẽ “chạy” theo công việc một cách đối phó, miễn cưỡng và mang tính hình thức.
Vì vậy, việc phân ngạch giảng viên theo đam mê, nguyện vọng và thế mạnh của mỗi cá nhân sẽ giúp họ phát huy tối đa năng lực trong từng mảng việc cụ thể.
|
|
Ảnh minh họa.
Trong quá trình thực hiện mục tiêu đại học định hướng nghiên cứu, một vấn đề khác cần được chú trọng là đẩy mạnh sự liên kết giữa giảng viên trong cùng một trường và giữa các trường với nhau để tạo thành những nhóm nghiên cứu mạnh, hoạt động hiệu quả và thực chất. Sự gắn kết này không chỉ giúp giảng viên, nhà khoa học trao đổi học thuật, cùng tham gia hợp tác nghiên cứu cho ra những sản phẩm khoa học được cộng đồng quốc tế thừa nhận (thể hiện qua việc xuất bản các bài báo trên tạp chí chuyên ngành uy tín của thế giới), mà còn giúp các nhóm nghiên cứu chứng minh được năng lực để có thể xin được nguồn tài trợ với kinh phí lớn cho các đề tài. Từ đó tạo điều kiện để nâng cao thu nhập cho đội ngũ giảng viên này. Bởi khi không tham gia giảng dạy nhiều mà dành thời gian chính cho công tác nghiên cứu thì thu nhập cá nhân của họ sẽ sụt giảm đáng kể, do không còn nhận khoản tiền đứng lớp.
Cần ghi nhận rằng, từ năm 2008, sự ra đời của quỹ phát triển khoa học và công nghệ quốc gia (Nafosted), cùng với chương trình trọng điểm cấp nhà nước đã thúc đẩy nghiên cứu khoa học ở Việt Nam đạt được những bước tiến, cả về chất và lượng, cũng như cải thiện thu nhập của người làm khoa học. Tuy nhiên, để tạo nên những bước đột phá trong lĩnh vực này, cần có sự đầu tư kinh phí mạnh mẽ và lâu dài hơn cho các đề tài khoa học, thay vì thông thường 2-3 năm cho một đề tài như hiện nay. Điều này sẽ được thực hiện một cách hiệu quả thông qua mô hình trung tâm xuất sắc (centre of excellence), được hình thành dựa trên sự liên kết, hợp tác giữa giảng viên, nhà khoa học thuộc các cơ sở giáo dục đại học khác nhau, nhưng cùng chia sẻ một dự án nghiên cứu có quy mô lớn và được Nhà nước đồng ý hỗ trợ kinh phí sau khi đã xét duyệt đề cương.
Trung tâm xuất sắc tạo ra từ mô hình trên chắc chắn sẽ là “con gà đẻ trứng vàng” về thành tựu khoa học cho các trường theo định hướng nghiên cứu. Các trung tâm này có thể duy trì hoạt động trong 5-10 năm, tùy theo quy mô của dự án nghiên cứu và nguồn tiền được Nhà nước đầu tư. Nếu so sánh với kinh phí Nhà nước đã chi tiêu vào một số đề án giáo dục và khoa học công nghệ, ví dụ đề án tin học hóa hành chính vào đầu những năm 2000 là hơn 1.500 tỷ đồng và đề án ngoại ngữ quốc gia 2020 là cỡ gần 10.000 tỷ đồng, thì kinh phí cho một trung tâm nghiên cứu hoặc một nhóm nghiên cứu hoạt động hiệu quả trong khoảng vài năm ở Việt Nam không phải là điều bất khả thi.
Nghiên cứu khoa học của Việt Nam chỉ có thể có sự chuyển biến lớn, làm nền tảng để xây dựng các trường đại học định hướng nghiên cứu, một khi chúng ta chịu đổi mới cơ chế quản lý, phân ngạch cán bộ giảng viên, nhằm giảm thiểu áp lực công việc và tối ưu hóa hiệu quả làm việc của đội ngũ này. Bên cạnh đó, Nhà nước cần có sự đầu tư thích đáng hơn nữa, tạo điều kiện khuyến khích sự gắn kết giữa các giảng viên, nhà khoa học của các trường, cho họ không gian tự do học thuật, lành mạnh, để từ đó hình thành các trung tâm, nhóm nghiên cứu đủ sức tiếp cận được với trình độ của các nước phát triển trên thế giới.
**TS Đinh Bá Khương**
*Đại học Hoàng gia London (Imperial College London)*
## 0 comments:
## Post a Comment
Note: Only a member of this blog may post a comment.

WARC-Type: response

Content-Type: application/http; msgtype=response

WARC-Identified-Payload-Type: application/xhtml+xml

Server: GSE

X-Content-Type-Options: nosniff

Connection: close

Cache-Control: private, max-age=0

X-XSS-Protection: 1; mode=block

Content-Type: text/html; charset=UTF-8


text: Bấm ngay Subscribe / Đăng Ký xem video hay mới nhất >> Cafe Mậu Dịch nằm trong một con ngõ nhỏ ở phố Tô Hiệu- Cầu Giấy- Hà Nội. Lặng lẽ và yên bình, quán gợi nhớ cho chúng ta về thời bao cấp của Hà Nội. Bên trong quán là một không gian mở, không khí thoáng đãng vô cùng. Bạn có thể chọn cho mình một góc nhỏ để vừa nhâm nhi cốc café và vừa ngắm cảnh đường phố. Ngồi ở Cafe Mậu Dịch, bạn có thể nghe tiếng lá rơi theo chiều gió, tiếng quạt trần cổ kêu lạ tai, vài câu ca trữ tình, một bản nhạc không lời nhẹ nhàng, êm ái. Mọi thứ đều đơn sơ, mộc mạc như hồi ức của quá khứ. Từng vật dụng trang trí ở đây đều nhuộm màu thời gian. Từ chiếc tivi, loa, đài cổ cho đến bát đĩa tráng men, tem phiếu, phích, balo,... được chủ quán cất công tìm kiếm và giữ gìn rất cẩn thận. Đồ uống ở đây rất đa dạng, từ trà, café, sinh tố, kem, sữa chua. Ngoài ra, quán còn có bánh ngọt ăn kèm rất ngon. Phương châm của café Mậu Dịch chính là BÌNH TĨNH SỐNG. Đến đây, mọi người sẽ cảm nhận rõ nét hoài cổ của Hà Nội một thời bao cấp. Sống chậm, thư thái và nhẹ nhàng, bạn hãy đến và cảm nhận để gợi những ký ức về thời xưa cũ. VietBao.vn

WARC-Identified-Payload-Type: text/html

Server: LiteSpeed

X-Frame-Options: SAMEORIGIN

Accept-Ranges: bytes

Set-Cookie: xf_session=ad2ceb97e0f9f11ee27e4eefa022c664; path=/; secure; httponly

Vary: Accept-Encoding


text:
Một trong những điểm mạnh của hệ điều hành Android chính là tính năng thông báo tiện lợi và hữu ích. Tuy nhiên có một số ứng dụng lợi dụng điều này và liên tục gửi tin nhắn rác hoặc quảng cáo. Hãy tham khảo qua hướng dẫn cách tắt thông báo cho các phiên bản Android dưới đây.
Phiên bản Android 8.0 Oreo
Phiên bản này có nhiều lựa chọn hữu ích nhất đối với các thông báo từ ứng dụng. Bạn có thể vuốt từ phải qua trái để đóng thông báo hoặc bấm vào để mở ứng dụng. Nếu chỉ vuốt qua một phần sẽ thấy hai biểu tượng: hình răng cưa để chặn thông báo hoặc hình đồng hồ để tạm thời tắt thông báo và có thể chọn thời gian thông báo lại.
Chi tiết hơn, hãy vào từng mục Settings > Apps & notifications > Notifications > App notifications, bấm vào từng ứng dụng một để tùy chọn thông báo theo ý muốn. Bạn cũng có thể tắt thông báo khi khóa màn hình tại Settings > Apps & notifications > Notifications > On the lock screen > Don’t show notifications at all.
Phiên bản Android 7.0 Nougat
Tương tự như Oreo, bạn có thể vuốt từ phải qua trái để đóng thông báo hoặc bấm vào để mở ứng dụng. Nếu chỉ vuốt qua một phần sẽ thấy biểu tượng răng cưa để chặn thông báo từ ứng dụng đó. Để chỉnh nhiều ứng dụng cùng lúc, hãy vào Settings > Notifications rồi chọn All apps từ trình đơn thả xuống.
Phiên bản Android 5.0 Lollipop và cao hơn
Khi thông báo xuất hiện, hãy bấm vào thông báo và giữ trong vài giây để mở trang cài đặt thông báo. Bạn cũng có thể vào mục này lần lượt từ Settings > Sound & notification > App notifications. Chọn từng ứng dụng một và dùng nút bật tắt để tùy chỉnh thông báo.
Một lựa chọn khác đó là Priority. Hãy vào Settings > Sound & notification > Interruptions > When notifications arrive > Allow only priority interruptions để hiển thị thông báo trên đầu màn hình. Chế độ Sensitive vẫn hiển thị thông báo ở màn hình khóa nhưng sẽ không hiện nội dung.

markdown:
Một trong những điểm mạnh của hệ điều hành Android chính là tính năng thông báo tiện lợi và hữu ích. Tuy nhiên có một số ứng dụng lợi dụng điều này và liên tục gửi tin nhắn rác hoặc quảng cáo. Hãy tham khảo qua
**hướng dẫn cách tắt thông báo cho các phiên bản Android** dưới đây.
## Phiên bản Android 8.0 Oreo
Phiên bản này có nhiều lựa chọn hữu ích nhất đối với các thông báo từ
[. Bạn có thể ứng dụng](https://www.androidout.vn/list/android-apps/c/android-apps/) **vuốt từ phải qua trái để đóng thông báo hoặc bấm vào để mở ứng dụng**. Nếu chỉ vuốt qua một phần sẽ thấy hai biểu tượng: hình răng cưa để chặn thông báo hoặc hình đồng hồ để tạm thời tắt thông báo và có thể chọn thời gian thông báo lại.
Chi tiết hơn, hãy vào từng mục
*bấm vào từng ứng dụng một để tùy chọn thông báo theo ý muốn. Bạn cũng có thể tắt thông báo khi khóa màn hình tại Settings > Apps & notifications > Notifications > App notifications, * **.** *Settings > Apps & notifications > Notifications > On the lock screen > Don’t show notifications at all*
## Phiên bản Android 7.0 Nougat
Tương tự như Oreo, bạn có thể vuốt từ phải qua trái để đóng thông báo hoặc bấm vào để mở ứng dụng. Nếu chỉ vuốt qua một phần sẽ thấy biểu tượng răng cưa để chặn thông báo từ ứng dụng đó. Để
**chỉnh nhiều ứng dụng cùng lúc, hãy vào Settings > Notifications rồi chọn All apps** từ trình đơn thả xuống.
## Phiên bản Android 5.0 Lollipop và cao hơn
Khi thông báo xuất hiện, hãy
**bấm vào thông báo và giữ trong vài giây** để mở trang [ thông báo. Bạn cũng có thể vào mục này lần lượt từ cài đặt](https://www.androidout.vn/list/android-apps/c/tools/) **. Chọn từng ứng dụng một và dùng nút bật tắt để tùy chỉnh thông báo.** *Settings > Sound & notification > App notifications*
Một lựa chọn khác đó là Priority. Hãy vào
**Settings > Sound & notification > Interruptions > When notifications arrive > Allow only priority interruptions** để hiển thị thông báo trên đầu màn hình. **Chế độ Sensitive** vẫn hiển thị thông báo ở màn hình khóa nhưng sẽ không hiện nội dung.

Server: nginx

Vary: Cookie

Set-Cookie: pll_language=vi; expires=Thu, 20-Jun-2019 17:09:16 GMT; Max-Age=31536000; path=/


text:
Nữ ca sĩ đại diện hãng thời trang mà cô làm đại sứ góp mặt tại sự kiện âm nhạc từ thiện vào cuối tuần qua.
Dựa trên quan điểm lấy độc giả làm trung tâm, chúng tôi mong rằng sẽ nhận được những góp ý và mong muốn của bạn về 2 tiêu chí:Thiết kế giao diện Trải nghiệm đọc tin

markdown:
Nữ ca sĩ đại diện hãng thời trang mà cô làm đại sứ góp mặt tại sự kiện âm nhạc từ thiện vào cuối tuần qua.
|
|![]()
|
|
Sau chuyến lưu diễn châu Âu, Hồ Ngọc Hà về Việt Nam để ra mắt DVD liveshow 'Love songs 2017', ngay sau đó lại lên đường sang Mỹ. Lần này, ngoài việc mang đêm nhạc 'Love songs' sang biểu diễn cho cộng đồng người Việt tại New York xem, nữ ca sĩ còn dự sự kiện 'Global Citizen Festival' theo lời mời của ban tổ chức vào cuối tuần qua. Hồ Ngọc Hà mặc rất trẻ trung, năng động khi đến sự kiện.
|
|![]()
|
|
'Global Citizen Festival' là sự kiện âm nhạc gây quỹ từ thiện thường niên được khởi xướng bởi tổ chức Global Citizen, diễn ra lần đầu tiên vào năm 2012 tại New York. Chương trình được tổ chức nhằm nâng cao nhận thức của cộng đồng về nạn đói và bất bình đẳng xã hội đang diễn ra nhiều nơi trên thế giới. Từ năm 2015, những mục tiêu chính của đại nhạc hội luôn song hành cùng mục tiêu phát triển bền vững của Liên Hợp Quốc.
|
|![]()
|
|
'Global Citizen Festival 2017' được tổ chức tại Central Park New York với sự tham gia của hơn 60.000 người cùng sự có mặt của hơn 100 người nổi tiếng là các nghệ sĩ Hollywood và các chính trị gia.
Hồ Ngọc Hà đại diện chiến dịch 'Chime For Change' của thương hiệu thời trang mà cô làm đại sứ. Chiến dịch toàn cầu này được thành lập vào năm 2013, cũng là đơn vị đồng hành cùng quỹ từ thiện. Hồ Ngọc Hà chia sẻ: 'Là nghệ sĩ Việt Nam tham gia kêu gọi công dân toàn cầu ủng hộ quỹ từ thiện là một vinh dự của tôi. Vì vậy tôi đã gác lại công việc và những lời mời tham dự các sự kiện thời trang khác tại châu Âu cùng thời điểm để đến New York'.
|
|![]()
|
|
Dự sự kiện có huấn luyện viên The Voice Mỹ Pharrell Williams (trái) và huyền thoại âm nhạc Mỹ Stevie Wonder.
|
|![]()
|
|
Diễn viên Hugh Jackman (trái) và bà xã lớn hơn anh 13 tuổi Deborra-Lee Furness.
|
|![]()
|
|
Diễn viên Lupita N'Yongo.
|
|![]()
|
|
Hoa hậu thế giới 2000 - diễn viên Priyanka Chopra.
|
|![]()
|
|
Rapper Big Sean.
|
|![]()
|
|
Diễn viên Michelle Monaghan.
|
|![]()
|
|
Cựu thủ tướng Australia Julia Gillard.
Dựa trên quan điểm lấy độc giả làm trung tâm, chúng tôi mong rằng sẽ nhận được những góp ý và mong muốn của bạn về 2 tiêu chí:Thiết kế giao diện Trải nghiệm đọc tin

Cache-Control: max-age=0, no-cache

Set-Cookie: device_env=4; expires=Wed, 27-Jun-2018 17:36:17 GMT; path=/; domain=ngoisao.net

Content-Type: text/html; charset=utf-8


text:
13/06/2018 17:11
Chủ nhân siêu phẩm Despacito biểu diễn tại Việt Nam
Tổng đạo diễn chương trình, đạo diễn Việt Tú, chia sẻ: "Cocofest là liên hoan âm nhạc mang tinh thần của Coachelle tại Việt Nam. Nghĩa là người yêu nhạc không chỉ đến đó hòa mình vào âm nhạc mỗi tối rồi về mà họ còn có thể đắm mình vào một bầu không khí hội hè 24/24 giờ. Vì vậy, với Cocofest 2018, ngoài dàn line up (dàn âm thanh, ánh sáng) khủng, chúng tôi còn tạo ra các hoạt động như: indie stage, bikini party, đặc biệt là khu lều lưu trú qua đêm tại khu vực Beach Club ngay sát biển, các hoạt động vui chơi của lễ hội âm nhạc sẽ diễn ra gần như liên tục từ đêm đến sáng. Điều này càng trở nên cưc kỳ thú vị khi địa điểm tổ chức sự kiện đặc biệt này diễn ra tại một trong những bãi biển đẹp nhất hành tinh".
Để mời được Luis Fonsi, mọi tiêu chuẩn kỹ thuật phải được đảm bảo
Để có thể mời được Luis Fonsi, chủ nhân của siêu phẩm 5 tỉ lượt người xem, ban tổ chức chương trình phải đầu tư dàn line up hoành tráng, ấn tượng và sân khấu được đầu tư khủng cùng với các hiệu ứng hiện đại theo tiêu chuẩn tour diễn toàn cầu 2018 đang diễn ra của Luis Fonsi với tên gọi Love + Dance World Tour.
Đây là tour diễn thứ 9 của Luis Fonsi, bắt đầu từ ngày 1-7-2017, tại Andújar (Tây Ban Nha). Tour diễn diễn ra khắp thế giới với 40 buổi diễn tại khu vực Mỹ Latin, 32 buổi diễn ở châu Âu, 15 buổi diễn ở Bắc Mỹ, 1 buổi diễn ở châu Phi, 1 show diễn ở châu Á. Tổng cộng tour diễn bao gồm 89 buổi diễn. Theo dự kiến ban đầu, chương trình kết thúc bằng buổi diễn vào ngày 1-7 tại San Juan, Puerto Rico. Nhưng nay, chương trình tiếp tục kéo dài đến ngày 7-7 tại Việt Nam.
Tour lưu diễn vòng quanh thế giới của Luis Fonsi kéo dài 1 năm và dự kiến sẽ kết thúc tại Việt Nam
Ca khúc Despacito
Phụ trách: TRẦN ĐOÀN TRUNG - Phó Chủ tịch Liên đoàn Lao động TP.HCM
Phó Tổng Biên tập: DƯƠNG QUANG, BÙI THANH LIÊM
Tổng Thư ký Tòa soạn: LÊ CƯỜNG
Giấy phép số 1872/GP- BTTTT cấp ngày 9 tháng 10 năm 2012 của Bộ Thông tin và Truyền thông
Địa chỉ: 127 Võ Văn Tần, Phường 6, Quận 3 - TPHCM, Điện thoại:
028-3930.6262 / 028-3930.5376, Fax: 028-3930.4707
Bản quyền thuộc về Báo Người Lao Động. Các website khác đã được chúng
tôi đồng ý cho khai thác thông tin, khi đăng lại phải ghi rõ nguồn:
Theo Báo Người Lao Động (www.nld.com.vn).
Hotline: 0942.86.11.33
Email: doanhnghiep@admicro.vn

Server: nld-rp

FilterID: ft

Cache-Control: private


text:
Tuyển dụng
-
CHUYÊN VIÊN KINH DOANH - CÔNG TY CỔ PHẦN ĐẦU TƯ XÂY DỰNG PHÁT TRIỂN PACIFICLANDTuyển Dụng Chuyên Viên Kinh Doanh Bất Động Sản Số Lượng: 30 Chuyên Viên Thu nhập: Lương Cơ bản cao (Thỏa thuận) + hoa hồng cao. Hạn nộp hồ sơ: 30/4/2018

markdown:
# Tuyển dụng
-
### CHUYÊN VIÊN KINH DOANH - CÔNG TY CỔ PHẦN ĐẦU TƯ XÂY DỰNG PHÁT TRIỂN PACIFICLANDTuyển Dụng Chuyên Viên Kinh Doanh Bất Động Sản Số Lượng: 30 Chuyên Viên Thu nhập: Lương Cơ bản cao (Thỏa thuận) + hoa hồng cao. Hạn nộp hồ sơ: 30/4/2018

Pragma: no-cache

Cache-Control: no-cache, must-revalidate


text:
Event (sự kiện) là một phần quan trọng của bất kỳ ứng dụng GUI nào. Tất cả các ứng dụng dạng GUI xử lý event trong suốt thời gian mà nó chạy. Event phần lớn được tạo ra bởi người dùng, nhưng cũng có lúc được tạo ra bởi chính ứng dụng. Có ba thành phần tham gia vào hệ thống event:
- Event nguồn
- Đối tượng event
- Đối tượng lắng nghe event
Event nguồn là đối tượng tạo ra sự thay đổi. Cứ có gì đó trong ứng dụng tạo ra sự thay đổi nào đó thì nó chính là event nguồn. Đối tượng event là chính bản thân cái event đó đã được mã hóa. Đối tượng lắng nghe event làm công việc xử lý event đó.
Đối tượng Event
Mỗi khi có thứ gì đó xảy ra thì một đối tượng event sẽ được tạo. Chẳng hạn như khi bạn click vào một button hay chọn một item trong một danh sách. Đối tượng event lưu trữ thông tin về loại sự kiện đã xảy ra. Chúng ta sẽ xem xét thông tin đó trong ví dụ dưới đây.
import java.awt.Container; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.text.DateFormat; import java.util.Date; import java.util.Locale; import javax.swing.AbstractAction; import javax.swing.BorderFactory; import javax.swing.DefaultListModel; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JFrame; import static javax.swing.JFrame.EXIT_ON_CLOSE; import javax.swing.JList; public class EventObjectEx extends JFrame { private JList list; private DefaultListModel model; public EventObjectEx() { initUI(); } private void initUI() { Container pane = getContentPane(); GroupLayout gl = new GroupLayout(pane); pane.setLayout(gl); model = new DefaultListModel(); list = new JList(model); list.setMinimumSize(new Dimension(250, 150)); list.setBorder(BorderFactory.createEtchedBorder()); JButton okButton = new JButton("OK"); okButton.addActionListener(new ClickAction()); gl.setAutoCreateContainerGaps(true); gl.setHorizontalGroup(gl.createSequentialGroup() .addComponent(okButton) .addGap(20) .addComponent(list) ); gl.setVerticalGroup(gl.createParallelGroup() .addComponent(okButton) .addComponent(list) ); pack(); setTitle("Event Example"); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } private class ClickAction extends AbstractAction { @Override public void actionPerformed(ActionEvent e) { Locale locale = Locale.getDefault(); Date date = new Date(e.getWhen()); String tm = DateFormat.getTimeInstance(DateFormat.SHORT, locale).format(date); if (!model.isEmpty()) { model.clear(); } if (e.getID() == ActionEvent.ACTION_PERFORMED) { model.addElement("Event Id: ACTION_PERFORMED"); } model.addElement("Time: " + tm); String source = e.getSource().getClass().getName(); model.addElement("Source: " + source); } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { EventObjectEx ex = new EventObjectEx(); ex.setVisible(true); } }); } }
Trong ví dụ này chúng ta tạo một button và một list, list sẽ hiển thị các thông tin về đối tượng event được gây ra bởi button.
okButton.addActionListener(new ClickAction());
Lớp
ClickAction lắng nghe sự kiện từ button OK.
private class ClickAction extends AbstractAction { @Override public void actionPerformed(ActionEvent e) { ... } }
Phương thức
actionPerformed() được gọi mỗi lần sự kiện xảy ra, phương thức này nhận tham số là một đối tượng
ActionEvent.
Locale locale = Locale.getDefault(); Date date = new Date(e.getWhen()); String s = DateFormat.getTimeInstance(DateFormat.SHORT, locale).format(date);
Chúng ta có thể lấy thời điểm event xảy ra từ phương thức
getWhen(), thời gian trong phương thức này tính theo mili giây nên chúng ta phải định dạng lại cho phù hợp.
String source = e.getSource().getClass().getName(); model.addElement("Source: " + source);
Chúng ta có thể lấy được thông tin về đối tượng gây ra event từ phương thức
getSource() và một số thông tin bên trong lớp đó.
Tạo đối tượng lắng nghe sự kiện
Có 3 cách để tạo một đối tượng lắng nghe sự kiện trong Java Swing.
- Tạo lớp ẩn nội (Anonymous Inner class)
- Tạo lớp nội (Inner class)
- Tạo lớp kế thừa (Derived class)
Tạo lớp ẩn nội
import java.awt.Container; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JFrame; public class AnonymousInnerClassEx extends JFrame { public AnonymousInnerClassEx() { initUI(); } private void initUI() { Container pane = getContentPane(); GroupLayout gl = new GroupLayout(pane); pane.setLayout(gl); JButton closeButton = new JButton("Close"); closeButton.setBounds(40, 50, 80, 25); closeButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent event) { System.exit(0); } }); gl.setAutoCreateContainerGaps(true); gl.setHorizontalGroup(gl.createSequentialGroup() .addComponent(closeButton) .addGap(220) ); gl.setVerticalGroup(gl.createSequentialGroup() .addComponent(closeButton) .addGap(180) ); pack(); setTitle("Event Example"); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { AnonymousInnerClassEx ex = new AnonymousInnerClassEx(); ex.setVisible(true); } }); } }
Trong ví dụ này chúng ta tạo một đối tượng lắng nghe sự kiện từ một button.
JButton closeButton = new JButton("Close");
Khi click button thì thoát chương trình.
closeButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent event) { System.exit(0); } });
Để gắn một đối tượng lắng nghe vào một component thì chúng ta dùng phương thức
addActionListener(). Ở đây chúng ta dùng lớp “ẩn nội”, nếu bạn chưa biết thì tức là tạo một đối tượng và code các phương thức trừu tượng ngay bên trong một phương thức khác.
Tạo lớp nội
import java.awt.Container; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JFrame; public class InnerClassExample extends JFrame { public InnerClassExample() { initUI(); } private void initUI() { Container pane = getContentPane(); GroupLayout gl = new GroupLayout(pane); pane.setLayout(gl); JButton closeButton = new JButton("Close"); ButtonCloseListener listener = new ButtonCloseListener(); closeButton.addActionListener(listener); gl.setAutoCreateContainerGaps(true); gl.setHorizontalGroup(gl.createSequentialGroup() .addComponent(closeButton) .addGap(220) ); gl.setVerticalGroup(gl.createSequentialGroup() .addComponent(closeButton) .addGap(180) ); pack(); setTitle("Event Example"); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } private class ButtonCloseListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { System.exit(0); } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { InnerClassExample ex = new InnerClassExample(); ex.setVisible(true); } }); } }
Ví dụ này cũng giống ví dụ trên, chỉ khác là chúng ta dùng lớp “nội”: định nghĩa một lớp bên trong một lớp khác, tuy nhiên các lớp này phải được implements từ lớp
ActionListener.
private class ButtonCloseListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { System.exit(0); } }
Tạo lớp kế thừa
import java.awt.Container; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JFrame; public class DerivedClassExample extends JFrame { public DerivedClassExample() { initUI(); } private void initUI() { Container pane = getContentPane(); GroupLayout gl = new GroupLayout(pane); pane.setLayout(gl); MyButton closeButton = new MyButton("Close"); gl.setAutoCreateContainerGaps(true); gl.setHorizontalGroup(gl.createSequentialGroup() .addComponent(closeButton) .addGap(220) ); gl.setVerticalGroup(gl.createSequentialGroup() .addComponent(closeButton) .addGap(180) ); pack(); setTitle("Event Example"); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } private class MyButton extends JButton implements ActionListener { public MyButton(String text) { super.setText(text); addActionListener(this); } @Override public void actionPerformed(ActionEvent e) { System.exit(0); } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { DerivedClassExample ex = new DerivedClassExample(); ex.setVisible(true); } }); } }
Trong ví dụ này chúng ta cũng tạo một button có chức năng thoát chương trình, nhưng ở đây chúng ta tạo một lớp kế thừa từ lớp
JButton là implements sẵn giao diện
ActionListener.
Tức là bản thân lớp này đã tự động lắng nghe các sự kiện click rồi, không cần phải dùng đến phương thức
addActionListener() như với lớp ẩn nội nữa.
private class MyButton extends JButton implements ActionListener { public MyButton(String text) { super.setText(text); addActionListener(this); } @Override public void actionPerformed(ActionEvent e) { System.exit(0); } }
Gắn một listener vào nhiều component
Một listener có thể lắng nghe từ nhiều component khác nhau.
import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JFrame; import static javax.swing.JFrame.EXIT_ON_CLOSE; import javax.swing.JLabel; import javax.swing.JPanel; public class MultipleSources extends JFrame { private JLabel statusbar; public MultipleSources() { initUI(); } private void initUI() { JPanel panel = new JPanel(); GroupLayout gl = new GroupLayout(panel); panel.setLayout(gl); statusbar = new JLabel("Ready"); statusbar.setBorder(BorderFactory.createEtchedBorder()); ButtonListener butlist = new ButtonListener(); JButton closeButton = new JButton("Close"); closeButton.addActionListener(butlist); JButton openButton = new JButton("Open"); openButton.addActionListener(butlist); JButton findButton = new JButton("Find"); findButton.addActionListener(butlist); JButton saveButton = new JButton("Save"); saveButton.addActionListener(butlist); gl.setAutoCreateContainerGaps(true); gl.setAutoCreateGaps(true); gl.setHorizontalGroup(gl.createParallelGroup() .addComponent(closeButton) .addComponent(openButton) .addComponent(findButton) .addComponent(saveButton) .addGap(250) ); gl.setVerticalGroup(gl.createSequentialGroup() .addComponent(closeButton) .addComponent(openButton) .addComponent(findButton) .addComponent(saveButton) .addGap(20) ); gl.linkSize(closeButton, openButton, findButton, saveButton); add(panel, BorderLayout.CENTER); add(statusbar, BorderLayout.SOUTH); pack(); setTitle("Event Example"); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } private class ButtonListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { JButton o = (JButton) e.getSource(); String label = o.getText(); statusbar.setText(" " + label + " button clicked"); } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { MultipleSources ms = new MultipleSources(); ms.setVisible(true); } }); } }
Chúng ta tạo 4 button và một statusbar. Statusbar sẽ hiển thị thông tin tùy vào button nào được click.
JButton closeButton = new JButton("Close"); closeButton.addActionListener(butlist); JButton openButton = new JButton("Open"); openButton.addActionListener(butlist); ...
Ở đây chúng ta tạo lớp nội
ButtonListener và gắn vào từng button.
private class ButtonListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { JButton o = (JButton) e.getSource(); String label = o.getText(); statusbar.setText(" " + label + " button clicked"); } }
Đoạn text trên statusbar được hiển thị tùy theo từng button.
Gắn nhiều listener vào một component
Nếu có thể dùng một listener cho nhiều component thì cũng có thể gắn nhiều listener vào một component.
import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Calendar; import javax.swing.BorderFactory; import javax.swing.GroupLayout; import static javax.swing.GroupLayout.Alignment.CENTER; import static javax.swing.GroupLayout.DEFAULT_SIZE; import static javax.swing.GroupLayout.PREFERRED_SIZE; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.SpinnerModel; import javax.swing.SpinnerNumberModel; public class MultipleListeners extends JFrame { private JLabel statusbar; private JSpinner spinner; private int count = 0; public MultipleListeners() { initUI(); } private void initUI() { JPanel panel = new JPanel(); GroupLayout gl = new GroupLayout(panel); panel.setLayout(gl); add(panel, BorderLayout.CENTER); statusbar = new JLabel("0"); statusbar.setBorder(BorderFactory.createEtchedBorder()); add(statusbar, BorderLayout.SOUTH); JButton addButton = new JButton("+"); addButton.addActionListener(new ButtonListener1()); addButton.addActionListener(new ButtonListener2()); Calendar calendar = Calendar.getInstance(); int currentYear = calendar.get(Calendar.YEAR); SpinnerModel yearModel = new SpinnerNumberModel(currentYear, currentYear - 100, currentYear + 100, 1); spinner = new JSpinner(yearModel); spinner.setEditor(new JSpinner.NumberEditor(spinner, "#")); gl.setAutoCreateContainerGaps(true); gl.setHorizontalGroup(gl.createSequentialGroup() .addComponent(addButton) .addGap(20) .addComponent(spinner, DEFAULT_SIZE, DEFAULT_SIZE, PREFERRED_SIZE) ); gl.setVerticalGroup(gl.createSequentialGroup() .addGroup(gl.createParallelGroup(CENTER) .addComponent(addButton) .addComponent(spinner, DEFAULT_SIZE, DEFAULT_SIZE, PREFERRED_SIZE)) ); pack(); setTitle("Event Example"); setSize(300, 200); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } private class ButtonListener1 implements ActionListener { @Override public void actionPerformed(ActionEvent e) { Integer val = (Integer) spinner.getValue(); spinner.setValue(++val); } } private class ButtonListener2 implements ActionListener { @Override public void actionPerformed(ActionEvent e) { statusbar.setText(Integer.toString(++count)); } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { MultipleListeners ml = new MultipleListeners(); ml.setVisible(true); } }); } }
Trong ví dụ này chúng ta tạo một button, một spinner và một statusbar. Chúng ta định nghĩa 2 listener và gắn cả hai listener này vào button, một listener sẽ thay đổi giá trị trên spinner, một listener sẽ thay đổi đoạn text trong statusbar.
SpinnerModel yearModel = new SpinnerNumberModel(currentYear, currentYear - 100, currentYear + 100, 1); spinner = new JSpinner(yearModel);
Chúng ta khởi tạo một đối tượng
SpinnerModel, bạn có thể hiểu đối tượng này làm công việc khởi tạo giá trị cho
JSpinner, tham số đầu tiên là giá trị khởi tạo, tham số thứ 2 và thứ 3 là giá trị min và max trong listener, tham số thứ 4 là giá trị tăng thêm lên bao nhiêu sau mỗi lần click vào spinner.
spinner.setEditor(new JSpinner.NumberEditor(spinner, "#"));
Dòng code trên có tác dụng loại bỏ dấu phẩy trong định dạng số (2,016 → 2016).
private class ButtonListener1 implements ActionListener { @Override public void actionPerformed(ActionEvent e) { Integer val = (Integer) spinner.getValue(); spinner.setValue(++val); } }
Listener thứ nhất thay đổi giá trị của spinner.
private class ButtonListener2 implements ActionListener { @Override public void actionPerformed(ActionEvent e) { statusbar.setText(Integer.toString(++count)); } }
Listener thứ hai làm công việc thay đổi đoạn text trong statusbar.
Gỡ bỏ listener ra khỏi component
Để làm việc này thì chỉ đơn giản là dùng phương thức
removeActionListener().
import java.awt.Container; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; public class RemoveListenerEx extends JFrame { private JLabel lbl; private JButton addButton; private JCheckBox activeBox; private ButtonListener buttonlistener; private int count = 0; public RemoveListenerEx() { initUI(); } private void initUI() { Container pane = getContentPane(); GroupLayout gl = new GroupLayout(pane); pane.setLayout(gl); addButton = new JButton("+"); buttonlistener = new ButtonListener(); activeBox = new JCheckBox("Active listener"); activeBox.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent event) { if (activeBox.isSelected()) { addButton.addActionListener(buttonlistener); } else { addButton.removeActionListener(buttonlistener); } } }); lbl = new JLabel("0"); gl.setAutoCreateContainerGaps(true); gl.setHorizontalGroup(gl.createSequentialGroup() .addGroup(gl.createParallelGroup() .addComponent(addButton) .addComponent(lbl)) .addGap(30) .addComponent(activeBox) ); gl.setVerticalGroup(gl.createSequentialGroup() .addGroup(gl.createParallelGroup() .addComponent(addButton) .addComponent(activeBox)) .addGap(30) .addComponent(lbl) ); pack(); setTitle("Event Example"); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } private class ButtonListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { lbl.setText(Integer.toString(++count)); } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { RemoveListenerEx ex = new RemoveListenerEx(); ex.setVisible(true); } }); } }
Trong ví dụ này chúng ta tạo một button, một checkbox và một label. Button được gắn một listener và chỉ khi checkbox được check thì listener này mới lắng nghe sự kiện từ button.
buttonlistener = new ButtonListener();
Lớp listener được tạo ra phải là lớp không ẩn thì mới có thể gỡ ra khỏi component được,
if (activeBox.isSelected()) { addButton.addActionListener(buttonlistener); } else { addButton.removeActionListener(buttonlistener); }
Chúng ta kiểm tra nếu checkbox được check thì gắn listener vào còn không nếu thì gỡ ra.
Xử lý sự kiện di chuyển
Trong ví dụ này chúng ta tìm hiểu về cách bắt sự kiện có liên quan đến sự hiện diện của component.
import java.awt.Container; import java.awt.EventQueue; import java.awt.Font; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import javax.swing.GroupLayout; import javax.swing.JFrame; import javax.swing.JLabel; public class MovingWindowEx extends JFrame implements ComponentListener { private JLabel labelx; private JLabel labely; public MovingWindowEx() { initUI(); } private void initUI() { Container pane = getContentPane(); GroupLayout gl = new GroupLayout(pane); pane.setLayout(gl); addComponentListener(this); labelx = new JLabel("x: "); labelx.setFont(new Font("Serif", Font.BOLD, 14)); labelx.setBounds(20, 20, 60, 25); labely = new JLabel("y: "); labely.setFont(new Font("Serif", Font.BOLD, 14)); labely.setBounds(20, 45, 60, 25); gl.setAutoCreateContainerGaps(true); gl.setAutoCreateGaps(true); gl.setHorizontalGroup(gl.createParallelGroup() .addComponent(labelx) .addComponent(labely) .addGap(250) ); gl.setVerticalGroup(gl.createSequentialGroup() .addComponent(labelx) .addComponent(labely) .addGap(130) ); pack(); setTitle("Event Example"); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } @Override public void componentResized(ComponentEvent e) { } @Override public void componentMoved(ComponentEvent e) { int x = e.getComponent().getX(); int y = e.getComponent().getY(); labelx.setText("x: " + x); labely.setText("y: " + y); } @Override public void componentShown(ComponentEvent e) { } @Override public void componentHidden(ComponentEvent e) { } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { MovingWindowEx ex = new MovingWindowEx(); ex.setVisible(true); } }); } }
Chúng ta sẽ gắn một listener vào cửa sổ chính để lấy tọa độ của cửa sổ trên màn hình.
public class MovingWindowExample extends JFrame implements ComponentListener {
Giao diện
ComponentListener là giao diện dùng để lắng nghe các sự kiện liên quan đến sự xuất hiện của component.
@Override public void componentResized(ComponentEvent e) { } @Override public void componentMoved(ComponentEvent e) { int x = e.getComponent().getX(); int y = e.getComponent().getY(); labelx.setText("x: " + x); labely.setText("y: " + y); } @Override public void componentShown(ComponentEvent e) { } @Override public void componentHidden(ComponentEvent e) { }
Theo luật của Java thì chúng ta phải override toàn bộ phương thức ảo nhưng ở đây chúng ta chỉ quan tâm tới phương thức
componentMoved() thôi.
int x = e.getComponent().getX(); int y = e.getComponent().getY();
Để lấy tọa độ của component thì chúng ta dùng phương thức
getX() và
getY().
Sử dụng lớp Adapter thay thế cho Listener
Trong ví dụ trên chúng ta implement giao diện
ComponentListener và phải override toàn bộ các phương thức ảo trong giao diện này, như thế rất khó chịu, chính vì thế và Java đã tạo ra các lớp adapter. Adapter đơn giản là các lớp đã implement sẵn các lớp listener tương ứng và override toàn bộ phương thức ảo trước rồi. Vì thế nên khi dùng adapter chúng ta chỉ cần dùng các phương thức mà chúng ta muốn thôi.
Ví dụ:
- Giao diện
ComponentListenerbắt buộc bạn phải override các phương thức ảo
componentResized(),
componentMoved(),
componentShown(), và
componentHidden()mặc dù bạn không muốn.
- Lớp
ComponentAdapterđã implement sẵn giao diện
ComponentListenervà override toàn bộ các phương thức ảo trên rồi, bạn chỉ cần override lại phương thức mà bạn muốn.
Ví dụ dưới đây giống như ví dụ ở trên, chỉ khác là chúng ta dùng lớp
ComponentAdapter.
import java.awt.Container; import java.awt.EventQueue; import java.awt.Font; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import javax.swing.GroupLayout; import javax.swing.JFrame; import javax.swing.JLabel; public class AdapterExample extends JFrame { private JLabel labelx; private JLabel labely; public AdapterExample() { initUI(); } private void initUI() { Container pane = getContentPane(); GroupLayout gl = new GroupLayout(pane); pane.setLayout(gl); addComponentListener(new MoveAdapter()); labelx = new JLabel("x: "); labelx.setFont(new Font("Serif", Font.BOLD, 14)); labely = new JLabel("y: "); labely.setFont(new Font("Serif", Font.BOLD, 14)); gl.setAutoCreateContainerGaps(true); gl.setAutoCreateGaps(true); gl.setHorizontalGroup(gl.createParallelGroup() .addComponent(labelx) .addComponent(labely) .addGap(250) ); gl.setVerticalGroup(gl.createSequentialGroup() .addComponent(labelx) .addComponent(labely) .addGap(130) ); pack(); setTitle("Event Example"); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } private class MoveAdapter extends ComponentAdapter { @Override public void componentMoved(ComponentEvent e) { int x = e.getComponent().getX(); int y = e.getComponent().getY(); labelx.setText("x: " + x); labely.setText("y: " + y); } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { AdapterExample ex = new AdapterExample(); ex.setVisible(true); } }); } }

markdown:
Event (sự kiện) là một phần quan trọng của bất kỳ ứng dụng GUI nào. Tất cả các ứng dụng dạng GUI xử lý event trong suốt thời gian mà nó chạy. Event phần lớn được tạo ra bởi người dùng, nhưng cũng có lúc được tạo ra bởi chính ứng dụng. Có ba thành phần tham gia vào hệ thống event:
- Event nguồn
- Đối tượng event
- Đối tượng lắng nghe event
** là đối tượng tạo ra sự thay đổi. Cứ có gì đó trong ứng dụng tạo ra sự thay đổi nào đó thì nó chính là event nguồn. Event nguồn** **là chính bản thân cái event đó đã được mã hóa.** *Đối tượng event* **Đối tượng lắng nghe** **e** *làm công việc xử lý event đó.* **vent**
## Đối tượng Event
Mỗi khi có thứ gì đó xảy ra thì một đối tượng event sẽ được tạo. Chẳng hạn như khi bạn click vào một button hay chọn một item trong một danh sách. Đối tượng event lưu trữ thông tin về loại sự kiện đã xảy ra. Chúng ta sẽ xem xét thông tin đó trong ví dụ dưới đây.
import java.awt.Container; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.text.DateFormat; import java.util.Date; import java.util.Locale; import javax.swing.AbstractAction; import javax.swing.BorderFactory; import javax.swing.DefaultListModel; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JFrame; import static javax.swing.JFrame.EXIT_ON_CLOSE; import javax.swing.JList; public class EventObjectEx extends JFrame { private JList list; private DefaultListModel model; public EventObjectEx() { initUI(); } private void initUI() { Container pane = getContentPane(); GroupLayout gl = new GroupLayout(pane); pane.setLayout(gl); model = new DefaultListModel(); list = new JList(model); list.setMinimumSize(new Dimension(250, 150)); list.setBorder(BorderFactory.createEtchedBorder()); JButton okButton = new JButton("OK"); okButton.addActionListener(new ClickAction()); gl.setAutoCreateContainerGaps(true); gl.setHorizontalGroup(gl.createSequentialGroup() .addComponent(okButton) .addGap(20) .addComponent(list) ); gl.setVerticalGroup(gl.createParallelGroup() .addComponent(okButton) .addComponent(list) ); pack(); setTitle("Event Example"); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } private class ClickAction extends AbstractAction { @Override public void actionPerformed(ActionEvent e) { Locale locale = Locale.getDefault(); Date date = new Date(e.getWhen()); String tm = DateFormat.getTimeInstance(DateFormat.SHORT, locale).format(date); if (!model.isEmpty()) { model.clear(); } if (e.getID() == ActionEvent.ACTION_PERFORMED) { model.addElement("Event Id: ACTION_PERFORMED"); } model.addElement("Time: " + tm); String source = e.getSource().getClass().getName(); model.addElement("Source: " + source); } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { EventObjectEx ex = new EventObjectEx(); ex.setVisible(true); } }); } }
Trong ví dụ này chúng ta tạo một button và một list, list sẽ hiển thị các thông tin về đối tượng event được gây ra bởi button.
okButton.addActionListener(new ClickAction());
Lớp
ClickAction lắng nghe sự kiện từ button OK.
private class ClickAction extends AbstractAction { @Override public void actionPerformed(ActionEvent e) { ... } }
Phương thức
actionPerformed() được gọi mỗi lần sự kiện xảy ra, phương thức này nhận tham số là một đối tượng
ActionEvent.
Locale locale = Locale.getDefault(); Date date = new Date(e.getWhen()); String s = DateFormat.getTimeInstance(DateFormat.SHORT, locale).format(date);
Chúng ta có thể lấy thời điểm event xảy ra từ phương thức
getWhen(), thời gian trong phương thức này tính theo mili giây nên chúng ta phải định dạng lại cho phù hợp.
String source = e.getSource().getClass().getName(); model.addElement("Source: " + source);
Chúng ta có thể lấy được thông tin về đối tượng gây ra event từ phương thức
getSource() và một số thông tin bên trong lớp đó.
![ Capturaae](https://phocode.com/wp-content/plugins/jetpack/modules/lazy-images/images/1x1.trans.gif)
![ Capturaae](https://phocode.com/wp-content/plugins/jetpack/modules/lazy-images/images/1x1.trans.gif)
## Tạo đối tượng lắng nghe sự kiện
Có 3 cách để tạo một đối tượng lắng nghe sự kiện trong Java Swing.
- Tạo lớp ẩn nội (
*Anonymous Inner*class)
- Tạo lớp nội (
*Inner*class)
- Tạo lớp kế thừa (
*Derived*class)
## Tạo lớp ẩn nội
import java.awt.Container; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JFrame; public class AnonymousInnerClassEx extends JFrame { public AnonymousInnerClassEx() { initUI(); } private void initUI() { Container pane = getContentPane(); GroupLayout gl = new GroupLayout(pane); pane.setLayout(gl); JButton closeButton = new JButton("Close"); closeButton.setBounds(40, 50, 80, 25); closeButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent event) { System.exit(0); } }); gl.setAutoCreateContainerGaps(true); gl.setHorizontalGroup(gl.createSequentialGroup() .addComponent(closeButton) .addGap(220) ); gl.setVerticalGroup(gl.createSequentialGroup() .addComponent(closeButton) .addGap(180) ); pack(); setTitle("Event Example"); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { AnonymousInnerClassEx ex = new AnonymousInnerClassEx(); ex.setVisible(true); } }); } }
Trong ví dụ này chúng ta tạo một đối tượng lắng nghe sự kiện từ một button.
JButton closeButton = new JButton("Close");
Khi click button thì thoát chương trình.
closeButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent event) { System.exit(0); } });
Để gắn một đối tượng lắng nghe vào một component thì chúng ta dùng phương thức
addActionListener(). Ở đây chúng ta dùng lớp “ẩn nội”, nếu bạn chưa biết thì tức là tạo một đối tượng và code các phương thức trừu tượng ngay bên trong một phương thức khác.
## Tạo lớp nội
import java.awt.Container; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JFrame; public class InnerClassExample extends JFrame { public InnerClassExample() { initUI(); } private void initUI() { Container pane = getContentPane(); GroupLayout gl = new GroupLayout(pane); pane.setLayout(gl); JButton closeButton = new JButton("Close"); ButtonCloseListener listener = new ButtonCloseListener(); closeButton.addActionListener(listener); gl.setAutoCreateContainerGaps(true); gl.setHorizontalGroup(gl.createSequentialGroup() .addComponent(closeButton) .addGap(220) ); gl.setVerticalGroup(gl.createSequentialGroup() .addComponent(closeButton) .addGap(180) ); pack(); setTitle("Event Example"); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } private class ButtonCloseListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { System.exit(0); } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { InnerClassExample ex = new InnerClassExample(); ex.setVisible(true); } }); } }
Ví dụ này cũng giống ví dụ trên, chỉ khác là chúng ta dùng lớp “nội”: định nghĩa một lớp bên trong một lớp khác, tuy nhiên các lớp này phải được implements từ lớp
ActionListener.
private class ButtonCloseListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { System.exit(0); } }
## Tạo lớp kế thừa
import java.awt.Container; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JFrame; public class DerivedClassExample extends JFrame { public DerivedClassExample() { initUI(); } private void initUI() { Container pane = getContentPane(); GroupLayout gl = new GroupLayout(pane); pane.setLayout(gl); MyButton closeButton = new MyButton("Close"); gl.setAutoCreateContainerGaps(true); gl.setHorizontalGroup(gl.createSequentialGroup() .addComponent(closeButton) .addGap(220) ); gl.setVerticalGroup(gl.createSequentialGroup() .addComponent(closeButton) .addGap(180) ); pack(); setTitle("Event Example"); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } private class MyButton extends JButton implements ActionListener { public MyButton(String text) { super.setText(text); addActionListener(this); } @Override public void actionPerformed(ActionEvent e) { System.exit(0); } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { DerivedClassExample ex = new DerivedClassExample(); ex.setVisible(true); } }); } }
Trong ví dụ này chúng ta cũng tạo một button có chức năng thoát chương trình, nhưng ở đây chúng ta tạo một lớp kế thừa từ lớp
JButton là implements sẵn giao diện
ActionListener.
Tức là bản thân lớp này đã tự động lắng nghe các sự kiện click rồi, không cần phải dùng đến phương thức
addActionListener() như với lớp ẩn nội nữa.
private class MyButton extends JButton implements ActionListener { public MyButton(String text) { super.setText(text); addActionListener(this); } @Override public void actionPerformed(ActionEvent e) { System.exit(0); } }
## Gắn một listener vào nhiều component
Một listener có thể lắng nghe từ nhiều component khác nhau.
import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JFrame; import static javax.swing.JFrame.EXIT_ON_CLOSE; import javax.swing.JLabel; import javax.swing.JPanel; public class MultipleSources extends JFrame { private JLabel statusbar; public MultipleSources() { initUI(); } private void initUI() { JPanel panel = new JPanel(); GroupLayout gl = new GroupLayout(panel); panel.setLayout(gl); statusbar = new JLabel("Ready"); statusbar.setBorder(BorderFactory.createEtchedBorder()); ButtonListener butlist = new ButtonListener(); JButton closeButton = new JButton("Close"); closeButton.addActionListener(butlist); JButton openButton = new JButton("Open"); openButton.addActionListener(butlist); JButton findButton = new JButton("Find"); findButton.addActionListener(butlist); JButton saveButton = new JButton("Save"); saveButton.addActionListener(butlist); gl.setAutoCreateContainerGaps(true); gl.setAutoCreateGaps(true); gl.setHorizontalGroup(gl.createParallelGroup() .addComponent(closeButton) .addComponent(openButton) .addComponent(findButton) .addComponent(saveButton) .addGap(250) ); gl.setVerticalGroup(gl.createSequentialGroup() .addComponent(closeButton) .addComponent(openButton) .addComponent(findButton) .addComponent(saveButton) .addGap(20) ); gl.linkSize(closeButton, openButton, findButton, saveButton); add(panel, BorderLayout.CENTER); add(statusbar, BorderLayout.SOUTH); pack(); setTitle("Event Example"); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } private class ButtonListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { JButton o = (JButton) e.getSource(); String label = o.getText(); statusbar.setText(" " + label + " button clicked"); } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { MultipleSources ms = new MultipleSources(); ms.setVisible(true); } }); } }
Chúng ta tạo 4 button và một statusbar. Statusbar sẽ hiển thị thông tin tùy vào button nào được click.
JButton closeButton = new JButton("Close"); closeButton.addActionListener(butlist); JButton openButton = new JButton("Open"); openButton.addActionListener(butlist); ...
Ở đây chúng ta tạo lớp nội
ButtonListener và gắn vào từng button.
private class ButtonListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { JButton o = (JButton) e.getSource(); String label = o.getText(); statusbar.setText(" " + label + " button clicked"); } }
Đoạn text trên statusbar được hiển thị tùy theo từng button.
![ Capture](https://phocode.com/wp-content/plugins/jetpack/modules/lazy-images/images/1x1.trans.gif)
![ Capture](https://phocode.com/wp-content/plugins/jetpack/modules/lazy-images/images/1x1.trans.gif)
## Gắn nhiều listener vào một component
Nếu có thể dùng một listener cho nhiều component thì cũng có thể gắn nhiều listener vào một component.
import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Calendar; import javax.swing.BorderFactory; import javax.swing.GroupLayout; import static javax.swing.GroupLayout.Alignment.CENTER; import static javax.swing.GroupLayout.DEFAULT_SIZE; import static javax.swing.GroupLayout.PREFERRED_SIZE; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.SpinnerModel; import javax.swing.SpinnerNumberModel; public class MultipleListeners extends JFrame { private JLabel statusbar; private JSpinner spinner; private int count = 0; public MultipleListeners() { initUI(); } private void initUI() { JPanel panel = new JPanel(); GroupLayout gl = new GroupLayout(panel); panel.setLayout(gl); add(panel, BorderLayout.CENTER); statusbar = new JLabel("0"); statusbar.setBorder(BorderFactory.createEtchedBorder()); add(statusbar, BorderLayout.SOUTH); JButton addButton = new JButton("+"); addButton.addActionListener(new ButtonListener1()); addButton.addActionListener(new ButtonListener2()); Calendar calendar = Calendar.getInstance(); int currentYear = calendar.get(Calendar.YEAR); SpinnerModel yearModel = new SpinnerNumberModel(currentYear, currentYear - 100, currentYear + 100, 1); spinner = new JSpinner(yearModel); spinner.setEditor(new JSpinner.NumberEditor(spinner, "#")); gl.setAutoCreateContainerGaps(true); gl.setHorizontalGroup(gl.createSequentialGroup() .addComponent(addButton) .addGap(20) .addComponent(spinner, DEFAULT_SIZE, DEFAULT_SIZE, PREFERRED_SIZE) ); gl.setVerticalGroup(gl.createSequentialGroup() .addGroup(gl.createParallelGroup(CENTER) .addComponent(addButton) .addComponent(spinner, DEFAULT_SIZE, DEFAULT_SIZE, PREFERRED_SIZE)) ); pack(); setTitle("Event Example"); setSize(300, 200); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } private class ButtonListener1 implements ActionListener { @Override public void actionPerformed(ActionEvent e) { Integer val = (Integer) spinner.getValue(); spinner.setValue(++val); } } private class ButtonListener2 implements ActionListener { @Override public void actionPerformed(ActionEvent e) { statusbar.setText(Integer.toString(++count)); } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { MultipleListeners ml = new MultipleListeners(); ml.setVisible(true); } }); } }
Trong ví dụ này chúng ta tạo một button, một spinner và một statusbar. Chúng ta định nghĩa 2 listener và gắn cả hai listener này vào button, một listener sẽ thay đổi giá trị trên spinner, một listener sẽ thay đổi đoạn text trong statusbar.
SpinnerModel yearModel = new SpinnerNumberModel(currentYear, currentYear - 100, currentYear + 100, 1); spinner = new JSpinner(yearModel);
Chúng ta khởi tạo một đối tượng
SpinnerModel, bạn có thể hiểu đối tượng này làm công việc khởi tạo giá trị cho
JSpinner, tham số đầu tiên là giá trị khởi tạo, tham số thứ 2 và thứ 3 là giá trị min và max trong listener, tham số thứ 4 là giá trị tăng thêm lên bao nhiêu sau mỗi lần click vào spinner.
spinner.setEditor(new JSpinner.NumberEditor(spinner, "#"));
Dòng code trên có tác dụng loại bỏ dấu phẩy trong định dạng số (2,016 → 2016).
private class ButtonListener1 implements ActionListener { @Override public void actionPerformed(ActionEvent e) { Integer val = (Integer) spinner.getValue(); spinner.setValue(++val); } }
Listener thứ nhất thay đổi giá trị của spinner.
private class ButtonListener2 implements ActionListener { @Override public void actionPerformed(ActionEvent e) { statusbar.setText(Integer.toString(++count)); } }
Listener thứ hai làm công việc thay đổi đoạn text trong statusbar.
![ Capture](https://phocode.com/wp-content/plugins/jetpack/modules/lazy-images/images/1x1.trans.gif)
![ Capture](https://phocode.com/wp-content/plugins/jetpack/modules/lazy-images/images/1x1.trans.gif)
## Gỡ bỏ listener ra khỏi component
Để làm việc này thì chỉ đơn giản là dùng phương thức
removeActionListener().
import java.awt.Container; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; public class RemoveListenerEx extends JFrame { private JLabel lbl; private JButton addButton; private JCheckBox activeBox; private ButtonListener buttonlistener; private int count = 0; public RemoveListenerEx() { initUI(); } private void initUI() { Container pane = getContentPane(); GroupLayout gl = new GroupLayout(pane); pane.setLayout(gl); addButton = new JButton("+"); buttonlistener = new ButtonListener(); activeBox = new JCheckBox("Active listener"); activeBox.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent event) { if (activeBox.isSelected()) { addButton.addActionListener(buttonlistener); } else { addButton.removeActionListener(buttonlistener); } } }); lbl = new JLabel("0"); gl.setAutoCreateContainerGaps(true); gl.setHorizontalGroup(gl.createSequentialGroup() .addGroup(gl.createParallelGroup() .addComponent(addButton) .addComponent(lbl)) .addGap(30) .addComponent(activeBox) ); gl.setVerticalGroup(gl.createSequentialGroup() .addGroup(gl.createParallelGroup() .addComponent(addButton) .addComponent(activeBox)) .addGap(30) .addComponent(lbl) ); pack(); setTitle("Event Example"); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } private class ButtonListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { lbl.setText(Integer.toString(++count)); } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { RemoveListenerEx ex = new RemoveListenerEx(); ex.setVisible(true); } }); } }
Trong ví dụ này chúng ta tạo một button, một checkbox và một label. Button được gắn một listener và chỉ khi checkbox được check thì listener này mới lắng nghe sự kiện từ button.
buttonlistener = new ButtonListener();
Lớp listener được tạo ra phải là lớp không ẩn thì mới có thể gỡ ra khỏi component được,
if (activeBox.isSelected()) { addButton.addActionListener(buttonlistener); } else { addButton.removeActionListener(buttonlistener); }
Chúng ta kiểm tra nếu checkbox được check thì gắn listener vào còn không nếu thì gỡ ra.
![ Capture](https://phocode.com/wp-content/plugins/jetpack/modules/lazy-images/images/1x1.trans.gif)
![ Capture](https://phocode.com/wp-content/plugins/jetpack/modules/lazy-images/images/1x1.trans.gif)
## Xử lý sự kiện di chuyển
Trong ví dụ này chúng ta tìm hiểu về cách bắt sự kiện có liên quan đến sự hiện diện của component.
import java.awt.Container; import java.awt.EventQueue; import java.awt.Font; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import javax.swing.GroupLayout; import javax.swing.JFrame; import javax.swing.JLabel; public class MovingWindowEx extends JFrame implements ComponentListener { private JLabel labelx; private JLabel labely; public MovingWindowEx() { initUI(); } private void initUI() { Container pane = getContentPane(); GroupLayout gl = new GroupLayout(pane); pane.setLayout(gl); addComponentListener(this); labelx = new JLabel("x: "); labelx.setFont(new Font("Serif", Font.BOLD, 14)); labelx.setBounds(20, 20, 60, 25); labely = new JLabel("y: "); labely.setFont(new Font("Serif", Font.BOLD, 14)); labely.setBounds(20, 45, 60, 25); gl.setAutoCreateContainerGaps(true); gl.setAutoCreateGaps(true); gl.setHorizontalGroup(gl.createParallelGroup() .addComponent(labelx) .addComponent(labely) .addGap(250) ); gl.setVerticalGroup(gl.createSequentialGroup() .addComponent(labelx) .addComponent(labely) .addGap(130) ); pack(); setTitle("Event Example"); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } @Override public void componentResized(ComponentEvent e) { } @Override public void componentMoved(ComponentEvent e) { int x = e.getComponent().getX(); int y = e.getComponent().getY(); labelx.setText("x: " + x); labely.setText("y: " + y); } @Override public void componentShown(ComponentEvent e) { } @Override public void componentHidden(ComponentEvent e) { } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { MovingWindowEx ex = new MovingWindowEx(); ex.setVisible(true); } }); } }
Chúng ta sẽ gắn một listener vào cửa sổ chính để lấy tọa độ của cửa sổ trên màn hình.
public class MovingWindowExample extends JFrame implements ComponentListener {
Giao diện
ComponentListener là giao diện dùng để lắng nghe các sự kiện liên quan đến sự xuất hiện của component.
@Override public void componentResized(ComponentEvent e) { } @Override public void componentMoved(ComponentEvent e) { int x = e.getComponent().getX(); int y = e.getComponent().getY(); labelx.setText("x: " + x); labely.setText("y: " + y); } @Override public void componentShown(ComponentEvent e) { } @Override public void componentHidden(ComponentEvent e) { }
Theo luật của Java thì chúng ta phải override toàn bộ phương thức ảo nhưng ở đây chúng ta chỉ quan tâm tới phương thức
componentMoved() thôi.
int x = e.getComponent().getX(); int y = e.getComponent().getY();
Để lấy tọa độ của component thì chúng ta dùng phương thức
getX() và
getY().
![ Capture](https://phocode.com/wp-content/plugins/jetpack/modules/lazy-images/images/1x1.trans.gif)
![ Capture](https://phocode.com/wp-content/plugins/jetpack/modules/lazy-images/images/1x1.trans.gif)
## Sử dụng lớp Adapter thay thế cho Listener
Trong ví dụ trên chúng ta implement giao diện
ComponentListener và phải override toàn bộ các phương thức ảo trong giao diện này, như thế rất khó chịu, chính vì thế và Java đã tạo ra các lớp adapter. Adapter đơn giản là các lớp đã implement sẵn các lớp listener tương ứng và override toàn bộ phương thức ảo trước rồi. Vì thế nên khi dùng adapter chúng ta chỉ cần dùng các phương thức mà chúng ta muốn thôi.
Ví dụ:
- Giao diện
ComponentListenerbắt buộc bạn phải override các phương thức ảo
componentResized(),
componentMoved(),
componentShown(), và
componentHidden()mặc dù bạn không muốn.
- Lớp
ComponentAdapterđã implement sẵn giao diện
ComponentListenervà override toàn bộ các phương thức ảo trên rồi, bạn chỉ cần override lại phương thức mà bạn muốn.
Ví dụ dưới đây giống như ví dụ ở trên, chỉ khác là chúng ta dùng lớp
ComponentAdapter.
import java.awt.Container; import java.awt.EventQueue; import java.awt.Font; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import javax.swing.GroupLayout; import javax.swing.JFrame; import javax.swing.JLabel; public class AdapterExample extends JFrame { private JLabel labelx; private JLabel labely; public AdapterExample() { initUI(); } private void initUI() { Container pane = getContentPane(); GroupLayout gl = new GroupLayout(pane); pane.setLayout(gl); addComponentListener(new MoveAdapter()); labelx = new JLabel("x: "); labelx.setFont(new Font("Serif", Font.BOLD, 14)); labely = new JLabel("y: "); labely.setFont(new Font("Serif", Font.BOLD, 14)); gl.setAutoCreateContainerGaps(true); gl.setAutoCreateGaps(true); gl.setHorizontalGroup(gl.createParallelGroup() .addComponent(labelx) .addComponent(labely) .addGap(250) ); gl.setVerticalGroup(gl.createSequentialGroup() .addComponent(labelx) .addComponent(labely) .addGap(130) ); pack(); setTitle("Event Example"); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } private class MoveAdapter extends ComponentAdapter { @Override public void componentMoved(ComponentEvent e) { int x = e.getComponent().getX(); int y = e.getComponent().getY(); labelx.setText("x: " + x); labely.setText("y: " + y); } } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { AdapterExample ex = new AdapterExample(); ex.setVisible(true); } }); } }

Server: nginx centminmod

Set-Cookie: dwqa_anonymous=1EGhlsm6bqGFNgiWb7EzyYrm62UoSyF77fSuKmZcrST; expires=Sat, 17-Jun-2028 16:53:42 GMT; Max-Age=315360000; path=/; domain=.phocode.com; secure; HttpOnly


text:
Giày cao gót
Mã sản phẩm: test
Giá gốc 123₫
Gọi tổng đài để mua nhanh hơn
0934323882 (8:30 - 21:30)
SẼ CÓ TẠI NHÀ BẠN từ 1-5 ngày làm việc
-
GIAO HÀNG MIỄN PHÍ(Sản phẩm trên 300,000đ)
-
ĐỔI TRẢ MIỄN PHÍ(90 ngày)
-
THANH TOÁN(Thanh toán khi nhận hàng)

markdown:
# Giày cao gót
Mã sản phẩm: test
Giá gốc 123₫
Gọi tổng đài để mua nhanh hơn
[0934323882](tel:0934323882)
(8:30 - 21:30)
**SẼ CÓ TẠI NHÀ BẠN từ 1-5 ngày làm việc**
-
GIAO HÀNG MIỄN PHÍ(Sản phẩm trên 300,000đ)
-
ĐỔI TRẢ MIỄN PHÍ(90 ngày)
-
THANH TOÁN(Thanh toán khi nhận hàng)

X-Cache: miss

P3P: CP="NOI DSP COR NID ADMa OPTa OUR NOR"

Set-Cookie: shop_ref=; expires=Sun, 08 Jul 2018 01:59:43 GMT; path=/; samesite=lax


text:
Cài đặt bộ từ điển StarDict trong Ubuntu
Chia sẻ: Hai Hoang | Ngày: | Loại File: PDF | Số trang:10
lượt xem 35
download
Cài đặt bộ từ điển StarDict trong Ubuntu
StarDict là một phần mềm tra cứu từ, hỗ trợ nhiều ngôn ngữ, đa hệ điều hành (Unix/Linux, Windows, v.v.) và được phấn phối theo giấy phép bản quyền GNU/GPL.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Cài đặt bộ từ điển StarDict trong Ubuntu
- Cài đặt bộ từ điển StarDict trong Ubuntu Vũ Đỗ Quỳnh (vdquynh@gmail.com) Mục lục Lời giới thiệu............................................................. ..........................2 Bước 1 : Dùng Add/Remove để cài StarDict......................................2 Bước 2 : Tải xuống và cài đặt các bộ từ điển cho StarDict................5 Một số liên kết hữu ích........................................................ ..............10 Giấy phép sử dụng tài liệu này.............................................. ............10 Hà Nội tháng 05/2007 Tài liệu này được phấn phối theo giấy phép bản quyền GNU/FDL http://www.gnu.org/licenses/fdl.html
- Lời giới thiệu StarDict là một phần mềm tra cứu từ, hỗ trợ nhiều ngôn ngữ, đa hệ điều hành (Unix/Linux, Windows, v.v.) và được phấn phối theo giấy phép bản quyền GNU/GPL. Cài đặt StarDict khong khó, thậm chí rất dễ khi dùng một hệ điều hành GNU/Linux như Ubuntu. Muốn dùng StarDict, đầu tiên phải cài phần mềm tra cứu StarDict, và sau đó phải cài thêm các bộ từ điển đã được tải xuống riêng từ internet. Trong bài này chúng tôi minh họa việc cài đặt StarDict và các bộ từ điển Việt-Pháp, Pháp-Việt, Anh- Việt, Việt-Anh, dùng một máy tính đã cài bản phân phối GNU/Linux Ubuntu 7.04 (Feisty Fawn). Bước 1 : Dùng Add/Remove để cài StarDict Muốn cài phần mềm mới trong Ubuntu, bạn phải có quyền “sudo”, tức là quyền thực hiện những công việc liên quan đến quản trị hệ thóng. Nếu bạn có quyền “sudo”, việc đầu tiên là tìm phần mềm StarDict trong các kho phần mềm đã được khai báo cho Ubuntu. Trên bảng điều khiển, bạn mở thực đơn Applications (Ứng dụng), chọn Add/Remove để khởi đồng chương trình cài/bỏ phần mềm và hiển thị cửa sổ như sau : Hình 1: Chương trình Add/Remove cho phép cài đặt và bỏ các phần mềm một cách rất dễ dàng trong Ubuntu Trong cửa sổ chính, bạn hãy đặt các tùy chọn như sau : ● Chọn hiển thị tất cả các phần mềm : “Show : All available applications” ● Ở cột bên trái, nơi hiện thị các loại phần mềm, chọn tất cả các loại phần mềm : “All” 2 / 10
- Gõ từ 'stardict' trong vùng thông tin để tìm kiếm phần mềm (“Search”), sau một thời gian ngắn sẽ hiển thị kết quả tìm kiếm là “StarDict – Tra cứu từ” trong khung bên phải, phía trên, còn trong khung bên phải phía dưới sẽ hiển thị phần mô tả phần mềm StarDict và trang nhà web của phần mềm. Để cài đặt phần mềm StarDict, bạn chỉ cần đánh dấu ô vuông bên cạnh tên của phần mềm trong khung phía trên và ấn con chuột vào nút đã ghi “Apply” hoặc “Áp dụng” ở phía dưới của cửa sổ giao diện, sẽ hiển thị cửa sổ giao diện sau đây (hình 2) : Hình 2: Sau khí ấn nút Áp dụng (Apply), trước khi cài đặt thật sự, hệ thống sẽ hỏi bạn một lần nữa cho chắc chắn. Nếu muốn cài đặt bạn sẽ phải ấn nút Áp dụng một lần nữa. Lúc này bạn sẽ có cơ hội đổi ý kiến và hủy bỏ việc cài đặt StarDict, hoặc tiếp tục cài đặt bằng cách ấn vào nút đã ghi “Áp dụng” một lần nữa. Lúc đó hệ thống sẽ hỏi mật mã của bạn để kiểm tra bạn có quyền 'sudo' hay không. Nếu có, hệ thống sẽ tải xuống 2 gói phần mềm là “stardict-common_2.4.8-1_all.deb” và “stardict_2.4.8-1_i386.deb”, tổng cộng là 1.046 KB. Nếu bạn đã có sẵn hai gói phần mềm trên, bạn có thể bỏ qua quá trình cài đặt dùng “Add/Remove” để cài trực tiếp hai gói phần mềm thông qua dòng lệnh trong một cửa số thiết bị Terminal : $ sudo dpkg -i stardict-common_2.4.8-1_all.deb $ sudo dpkg -i stardict_2.4.8-1_i386.deb Hình 3: Hệ thống chỉ cần tải 2 gói phần mềm để cài StarDict, tổng cộng khoảng 1 MB, Tuy nhiên, nếu bạn dùng “Add/Remove”, bạn sẽ có thêm lợi ích là hệ thống sẽ biết StarDict đã được cài đặt và phải được tiếp tục giữ khi nào bạn sẽ thực hiên nâng cấp phiên bản của Ubuntu. 3 / 10
- Sau khi tải xong các gói phần mềm, hệ thống sẽ thực hiện cài đặt tự động : Hình 4: Sau khi tải xong, hệ thống tự động cài các gói phần mềm... Hình 5: Quá trình cài đặt StarDict đã kết thúc và thành công khi cửa sổ này xuất hiện. Sau khi đã cài đặt xong, hệ thống sẽ thông báo biết. Bình thường hệ thống sẽ bổ sung thêm một tiết mục vào thực dơn “Ứng dụng” (“Applications”), để dễ khởi động phần mềm StarDict. Trong ví dụ này là qua thư mục “Công cụ bổ sung” (“Accessories”). Hình 6: Hệ thống sẽ tự dộng bổ sung một tiết mục vào các thực đơn ứng dụng. 4 / 10
- Bước 2 : Tải xuống và cài đặt các bộ từ điển cho StarDict Để tải các bộ từ điển, bạn phải truy cập vào trang web http://stardict.sourceforge.net/ Hình 7: Từ trang web stardict.sourceforge.net, bạn có thể tải xuống các bộ từ điển khi ấn vào siêu liên kết Dictionaries. và ấn vào siêu liên kết đã ghi “Dictionaries” (http://stardict.sourceforge.net/Dictionaries.php) để xem danh sách các websites cho phép tải các bộ từ điển dùng với StarDict. Bạn sẽ tìm được các bộ từ điển tiếng Việt trong mục “Misc” (linh tinh) là siêu liên kết cuói cùng về phía bên phải : Hình 8: Sau khi vào trang Dictionaries, bạn phải chọn siêu liên kết ghi tên 'Misc' để đến trang liên kết đến các bộ từ điển tiếng Việt. Nếu bạn đang dùng hệ điều hành GNU/Linux theo dòng Redhat như Fedora, Mandriva, CentOS, v.v., bạn có thể tải xuống các bộ từ điển theo dạng gói RPM. Nếu bạn đang dùng Ubuntu hoặc một bản phân phối GNU/Linux khác, thì bạn sẽ tải xuống các bộ từ điển theo dạng “tarball” là những tập tin có đuôi “.tar.bz2”. Cột cuối cùng bên phải chỉ dẫn giấy phép bản quyển của từng từ điển, trên hình trên là GNU/GPL. Các bộ từ điển chúng tôi đã tải xuống có kích thước từ 1 MB đến dưới 6 MB như ví dụ trong bảng sau đây : Tên từ điển Tên gói phần mềm Dung lượng tệp tải xuống Anh-Việt stardict-dictd_anh-viet-2.4.2.tar.bz2 5,2 MB Việt-Anh stardict-dictd_viet-anh-2.4.2.tar.bz2 965 KB Pháp-Việt stardict-dictd_phap-viet-2.4.2.tar.bz2 2,7 MB 5 / 10
- Tên từ điển Tên gói phần mềm Dung lượng tệp tải xuống Việt-Pháp stardict-dictd_viet-phap-2.4.2.tar.bz2 1,7 MB Để cài các từ điển, mở một cửa sổ Terminal (Thiết bị cuối) và gõ lệnh “sudo nautilus” để có thể giải nén các tệp với quyền của người siêu dùng “root”. Hình 9: Trong cửa sổ thiết bị cuối, dùng lệnh "ls -l" cho thấy thư mục '/usr/share/stardict/dic', nơi để chứa các bộ từ điển, thuộc sở hữu của người siêu dùng 'root' Dùng Nautilus, bạn có thể đến vị trí chứa các tệp từ điển đã tải xuống. Bạn chọn một tệp từ điển và kích nhanh 2 lần để mở nó trong phần mềm giải nén của GNOME là “File Roller”. Hình 10: Sau khi mở Nautilus với tư cách Người siêu dùng 'root', bạn có thể di chuyển sang thư mục của bạn, đến vị trí bạn đã lưu lại các tệp từ điển đã tải xuống từ internet. Mỗi tệp chứa một thư mục, ví dụ “stardict-dictd_anh-viet-2.4.2”, trong đó có chứa 3 tập tin. 6 / 10
- Hình 11: Bạn chỉ cần ấn nhanh 2 lần vào tệp nén để mở nó với phần mềm nén/giải nén File Roller. Lúc đó bạn sẽ thấy nội dung chỉ bao gồm một thư mục mà trong đó có chứa thêm 3 tệp nữa. Bạn chỉ cần chọn tên thư mục trên, ấn vào nút giải nén “Extract” và, trong cửa sổ giao dịch, xác định vị trí giải nén trong hệ thống tập tin là thư mục “/usr/share/stardict/dic/”. Hình 12: Dùng phần mềm giải nén với tư cách Người siêu dùng 'root', bạn có thể thoải mãi giải nén các tệp từ điển vào vị trí cần thiết là '/usr/share/stardict/dic/' Bạn có thể giữ nguyên các thông số mặc định chủa phần mềm giải nén sau khi dã xác định vị trí để giải nén (“Location:”) là thư mục “/usr/share/stardict/dic/”. Tuy nhiên, nếu bạn quen dùng dòng lệnh trong thiết bị cuối, bạn có thể nhanh chóng giải nén và chuyển các bộ từ điển vào vị trí thích hợp chỉ cần dùng 2 dòng lệnh như sau : 7 / 10
- $ sudo tar -xjvf stardict-dictd_phap-viet-2.4.2.tar.bz2 $ sudo mv stardict-dictd_phap-viet-2.4.2 /usr/share/stardict/dic/ Bạn có thể cài đặt bao nhiêu bộ từ điển cũng được, sau đó bạn có thể dùng phần mềm StarDict để quản lý các bộ từ điển theo yêu cầu dùng hay không dùng. Hình 13: Trong ví dụ này, chúng tôi đã cài 4 bộ từ điển : Anh-Việt, Việt-Anh, Pháp-Việt và Việt-Pháp, mỗi bộ từ điển đều có một thư mục riêng Để dùng StarDict, bạn mở thực đơn Ứng dụng (“Applications”), chọn Công cụ bổ sung (“Accessories”), chọn Stardict để hiển thị cửa sổ giao dịch của StarDict. Hình 14: Có thể chọn StarDict trong thanh thực đơn Ứng dụng > Công cụ bổ sung 8 / 10
- Hình 15: Cửa sổ làm việc của StarDict gồm 3 khu chủ yếu. Ở phía dưới có các biểu tượng cho phép thay đổi cà tùy thích và quản lý các bộ từ điển. Cửa sổ giao dịch của StarDict gồm 3 khu chính : vùng nhập từ cần tra cứu ở phía trên ; khung cột bên trái để hiển thị các từ theo thứ tự ABC gần gủi với từ đang muốn tra cứu ; khung vuông chính để hiển thị các định nghĩa hoặc kết quả dịch từ đã tiềm kiếm. Ô vuông đã đánh dấu ở dưới, bên trái, bên cạnh ”Quét từ” sẽ bật khả năng tra từ tự động khi làm nổi bật lên một từ bất kỳ trong các ứng dụng khác nhau. Hình 16: Nếu bạn không muốn dùng một bộ từ điển bạn có thể tắt từ điển đó bằng cách bỏ dấu trong ô vuông kế bên. Khi ấn vào nút “Quản lí từ điển”, bạn có thể chọn các từ điển cần bật lên (đã đánh dấu vào ô vuông) 9 / 10
- hoặc không cần dùng đến (bỏ dấu trong ô vuông). Bạn cũng có thể xác định ưu tiên tra cứu loại từ điển nào trước. Mọi thay đổi trong mục quản lý từ điển sẽ được áp dụng sau khi đóng và khởi động lại StarDict. Đặc biệt phải đóng cả biểu tượng StarDict nằm tren bảng điều khiển của Desktop Ubuntu. Hình 17: Khi ấn phải vào biểu tượng StarDict, có thể đóng hẳn StarDict hoặc tắt/bật chức năng quét từ (auto-scanning). Tuy nhiên nếu bạn muốn khai thác đầy đủ các chức năng của StarDict và tự tạo ra các bộ từ điển theo yêu cầu, bạn nên đọc thêm các tài liệu hướng dẫn trên trang web của StarDict tại http://stardict.sourceforge.net/Documentation.php. Một số liên kết hữu ích ● Trang web của Ubuntu : http://www.ubuntu.com/ ● Trang web của StarDict : http://stardict.sourceforge.net/ ● Trang web của James Nguyễn, có các từ điển tiếng Việt dùng cho StarDict : http://james.dyndns.ws/index.php ● Trang của dự án “The Free Vietnamese Dictionary Project” : http://www.informatik.uni- leipzig.de/~duc/Dict/ ● Trang của dự án “Trung tâm Linux và phần mềm tự do cho sự phát triển Việt Nam” (C3LD) : http://hanoi.centre-linux.org/ ● http://www.echip.com.vn/echiproot/html/2006/285tt/stardict.html : Trang của tạp chí eChip chỉ dẫn về các dùng StarDict, đặc biệt với HĐH Windows. Giấy phép sử dụng tài liệu này Tài liệu này được phân phối theo giấy phép GNU/FDL1, có nghiã bạn có thể sử dụng, sao chép, phân phối lại và sửa lại nội dung của tài liệu này với điều kiện là bạn phải công nhận tác giả của tài liệu gốc là ông Vũ Đỗ Quỳnh (vdquynh@gmail.com hoạc vdquynh@yahoo.com) và bạn phải phân phối lại tài liệu này và các tài liệu xuất phát từ tài liệu này theo giấy phép GNU/FDL. 1 GNU Free documentation licence (http://www.gnu.org/copyleft/fdl.html) 10 / 10
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Hướng dẫn sử dụng cài đặt gói giao diện tiếng việt cho Win XP
5 p | 692 | 230
-
Cách cài đặt windowns từ DOS với đĩa Hiren's Boot
14 p | 441 | 112
-
Cài đặt và cấu hình Apache trong Ubuntu
7 p | 177 | 60
-
Các bước cài window
11 p | 200 | 55
-
Cài đặt Java Server trên Ubuntu
4 p | 150 | 47
-
Hướng dẫn cài đặt Microsoft Office 2013
4 p | 246 | 38
-
Hướng dẫn cài đặt máy chủ iSCSI SAN trong Hyper-V-phần 1
6 p | 157 | 37
-
Cài Đặt Dcom–3G E173eu1 Trên Ubuntu 12.04 LTS
4 p | 228 | 32
-
Cài đặt PHP server trên Ubuntu
4 p | 158 | 31
-
Cài đặt bổ sung XP trên hệ thống Windows 7
4 p | 115 | 23
-
Hướng dẫn thiết lập bộ gõ trong win xp
0 p | 75 | 18
-
4 phần mềm từ điển tiếng Anh miễn phí trên các thiết bị iOS
3 p | 163 | 16
-
Giáo trình Hệ điều hành - V1.0 Chương: Bộ nhớ ảo
19 p | 28 | 8
-
Bài giảng Cài đặt nhiều hệ điều hành trong một máy tính - Lê Minh Triết
108 p | 33 | 7
-
Thủ thuật sử dụng OpenOffice để tạo bộ từ điển
3 p | 41 | 4
-
Hướng dẫn cài đặt Google Picasa 3.6 trong Ubuntu Linux
3 p | 119 | 4
-
.Xóa bỏ từ điển lưu trữ Swype trên điện thoại Android
7 p | 71 | 2

markdown:
# Cài đặt bộ từ điển StarDict trong Ubuntu
Chia sẻ: Hai Hoang | Ngày: | Loại File: PDF | Số trang:10
lượt xem 35
download
![](https://tailieu.vn/image/document/thumbnail/2009/20091112/nguyen3/80x100/install_stardict_vi_7285.jpg)
##
Cài đặt bộ từ điển StarDict trong Ubuntu
[Vui lòng tải xuống để xem tài liệu đầy đủ](javascript:void(0);)
Download
![](https://tailieu.vn/static/b2013az/templates/version1/default/images/down16x21.png)
StarDict là một phần mềm tra cứu từ, hỗ trợ nhiều ngôn ngữ, đa hệ điều hành (Unix/Linux, Windows, v.v.) và được phấn phối theo giấy phép bản quyền GNU/GPL.
Bình luận(0)
[Đăng nhập để gửi bình luận!](javascript:void(0);)
##
Nội dung Text: Cài đặt bộ từ điển StarDict trong Ubuntu
- Cài đặt bộ từ điển StarDict trong Ubuntu Vũ Đỗ Quỳnh (vdquynh@gmail.com) Mục lục Lời giới thiệu............................................................. ..........................2 Bước 1 : Dùng Add/Remove để cài StarDict......................................2 Bước 2 : Tải xuống và cài đặt các bộ từ điển cho StarDict................5 Một số liên kết hữu ích........................................................ ..............10 Giấy phép sử dụng tài liệu này.............................................. ............10 Hà Nội tháng 05/2007 Tài liệu này được phấn phối theo giấy phép bản quyền GNU/FDL http://www.gnu.org/licenses/fdl.html
- Lời giới thiệu StarDict là một phần mềm tra cứu từ, hỗ trợ nhiều ngôn ngữ, đa hệ điều hành (Unix/Linux, Windows, v.v.) và được phấn phối theo giấy phép bản quyền GNU/GPL. Cài đặt StarDict khong khó, thậm chí rất dễ khi dùng một hệ điều hành GNU/Linux như Ubuntu. Muốn dùng StarDict, đầu tiên phải cài phần mềm tra cứu StarDict, và sau đó phải cài thêm các bộ từ điển đã được tải xuống riêng từ internet. Trong bài này chúng tôi minh họa việc cài đặt StarDict và các bộ từ điển Việt-Pháp, Pháp-Việt, Anh- Việt, Việt-Anh, dùng một máy tính đã cài bản phân phối GNU/Linux Ubuntu 7.04 (Feisty Fawn). Bước 1 : Dùng Add/Remove để cài StarDict Muốn cài phần mềm mới trong Ubuntu, bạn phải có quyền “sudo”, tức là quyền thực hiện những công việc liên quan đến quản trị hệ thóng. Nếu bạn có quyền “sudo”, việc đầu tiên là tìm phần mềm StarDict trong các kho phần mềm đã được khai báo cho Ubuntu. Trên bảng điều khiển, bạn mở thực đơn Applications (Ứng dụng), chọn Add/Remove để khởi đồng chương trình cài/bỏ phần mềm và hiển thị cửa sổ như sau : Hình 1: Chương trình Add/Remove cho phép cài đặt và bỏ các phần mềm một cách rất dễ dàng trong Ubuntu Trong cửa sổ chính, bạn hãy đặt các tùy chọn như sau : ● Chọn hiển thị tất cả các phần mềm : “Show : All available applications” ● Ở cột bên trái, nơi hiện thị các loại phần mềm, chọn tất cả các loại phần mềm : “All” 2 / 10
- Gõ từ 'stardict' trong vùng thông tin để tìm kiếm phần mềm (“Search”), sau một thời gian ngắn sẽ hiển thị kết quả tìm kiếm là “StarDict – Tra cứu từ” trong khung bên phải, phía trên, còn trong khung bên phải phía dưới sẽ hiển thị phần mô tả phần mềm StarDict và trang nhà web của phần mềm. Để cài đặt phần mềm StarDict, bạn chỉ cần đánh dấu ô vuông bên cạnh tên của phần mềm trong khung phía trên và ấn con chuột vào nút đã ghi “Apply” hoặc “Áp dụng” ở phía dưới của cửa sổ giao diện, sẽ hiển thị cửa sổ giao diện sau đây (hình 2) : Hình 2: Sau khí ấn nút Áp dụng (Apply), trước khi cài đặt thật sự, hệ thống sẽ hỏi bạn một lần nữa cho chắc chắn. Nếu muốn cài đặt bạn sẽ phải ấn nút Áp dụng một lần nữa. Lúc này bạn sẽ có cơ hội đổi ý kiến và hủy bỏ việc cài đặt StarDict, hoặc tiếp tục cài đặt bằng cách ấn vào nút đã ghi “Áp dụng” một lần nữa. Lúc đó hệ thống sẽ hỏi mật mã của bạn để kiểm tra bạn có quyền 'sudo' hay không. Nếu có, hệ thống sẽ tải xuống 2 gói phần mềm là “stardict-common_2.4.8-1_all.deb” và “stardict_2.4.8-1_i386.deb”, tổng cộng là 1.046 KB. Nếu bạn đã có sẵn hai gói phần mềm trên, bạn có thể bỏ qua quá trình cài đặt dùng “Add/Remove” để cài trực tiếp hai gói phần mềm thông qua dòng lệnh trong một cửa số thiết bị Terminal : $ sudo dpkg -i stardict-common_2.4.8-1_all.deb $ sudo dpkg -i stardict_2.4.8-1_i386.deb Hình 3: Hệ thống chỉ cần tải 2 gói phần mềm để cài StarDict, tổng cộng khoảng 1 MB, Tuy nhiên, nếu bạn dùng “Add/Remove”, bạn sẽ có thêm lợi ích là hệ thống sẽ biết StarDict đã được cài đặt và phải được tiếp tục giữ khi nào bạn sẽ thực hiên nâng cấp phiên bản của Ubuntu. 3 / 10
- Sau khi tải xong các gói phần mềm, hệ thống sẽ thực hiện cài đặt tự động : Hình 4: Sau khi tải xong, hệ thống tự động cài các gói phần mềm... Hình 5: Quá trình cài đặt StarDict đã kết thúc và thành công khi cửa sổ này xuất hiện. Sau khi đã cài đặt xong, hệ thống sẽ thông báo biết. Bình thường hệ thống sẽ bổ sung thêm một tiết mục vào thực dơn “Ứng dụng” (“Applications”), để dễ khởi động phần mềm StarDict. Trong ví dụ này là qua thư mục “Công cụ bổ sung” (“Accessories”). Hình 6: Hệ thống sẽ tự dộng bổ sung một tiết mục vào các thực đơn ứng dụng. 4 / 10
- Bước 2 : Tải xuống và cài đặt các bộ từ điển cho StarDict Để tải các bộ từ điển, bạn phải truy cập vào trang web http://stardict.sourceforge.net/ Hình 7: Từ trang web stardict.sourceforge.net, bạn có thể tải xuống các bộ từ điển khi ấn vào siêu liên kết Dictionaries. và ấn vào siêu liên kết đã ghi “Dictionaries” (http://stardict.sourceforge.net/Dictionaries.php) để xem danh sách các websites cho phép tải các bộ từ điển dùng với StarDict. Bạn sẽ tìm được các bộ từ điển tiếng Việt trong mục “Misc” (linh tinh) là siêu liên kết cuói cùng về phía bên phải : Hình 8: Sau khi vào trang Dictionaries, bạn phải chọn siêu liên kết ghi tên 'Misc' để đến trang liên kết đến các bộ từ điển tiếng Việt. Nếu bạn đang dùng hệ điều hành GNU/Linux theo dòng Redhat như Fedora, Mandriva, CentOS, v.v., bạn có thể tải xuống các bộ từ điển theo dạng gói RPM. Nếu bạn đang dùng Ubuntu hoặc một bản phân phối GNU/Linux khác, thì bạn sẽ tải xuống các bộ từ điển theo dạng “tarball” là những tập tin có đuôi “.tar.bz2”. Cột cuối cùng bên phải chỉ dẫn giấy phép bản quyển của từng từ điển, trên hình trên là GNU/GPL. Các bộ từ điển chúng tôi đã tải xuống có kích thước từ 1 MB đến dưới 6 MB như ví dụ trong bảng sau đây : Tên từ điển Tên gói phần mềm Dung lượng tệp tải xuống Anh-Việt stardict-dictd_anh-viet-2.4.2.tar.bz2 5,2 MB Việt-Anh stardict-dictd_viet-anh-2.4.2.tar.bz2 965 KB Pháp-Việt stardict-dictd_phap-viet-2.4.2.tar.bz2 2,7 MB 5 / 10
- Tên từ điển Tên gói phần mềm Dung lượng tệp tải xuống Việt-Pháp stardict-dictd_viet-phap-2.4.2.tar.bz2 1,7 MB Để cài các từ điển, mở một cửa sổ Terminal (Thiết bị cuối) và gõ lệnh “sudo nautilus” để có thể giải nén các tệp với quyền của người siêu dùng “root”. Hình 9: Trong cửa sổ thiết bị cuối, dùng lệnh "ls -l" cho thấy thư mục '/usr/share/stardict/dic', nơi để chứa các bộ từ điển, thuộc sở hữu của người siêu dùng 'root' Dùng Nautilus, bạn có thể đến vị trí chứa các tệp từ điển đã tải xuống. Bạn chọn một tệp từ điển và kích nhanh 2 lần để mở nó trong phần mềm giải nén của GNOME là “File Roller”. Hình 10: Sau khi mở Nautilus với tư cách Người siêu dùng 'root', bạn có thể di chuyển sang thư mục của bạn, đến vị trí bạn đã lưu lại các tệp từ điển đã tải xuống từ internet. Mỗi tệp chứa một thư mục, ví dụ “stardict-dictd_anh-viet-2.4.2”, trong đó có chứa 3 tập tin. 6 / 10
- Hình 11: Bạn chỉ cần ấn nhanh 2 lần vào tệp nén để mở nó với phần mềm nén/giải nén File Roller. Lúc đó bạn sẽ thấy nội dung chỉ bao gồm một thư mục mà trong đó có chứa thêm 3 tệp nữa. Bạn chỉ cần chọn tên thư mục trên, ấn vào nút giải nén “Extract” và, trong cửa sổ giao dịch, xác định vị trí giải nén trong hệ thống tập tin là thư mục “/usr/share/stardict/dic/”. Hình 12: Dùng phần mềm giải nén với tư cách Người siêu dùng 'root', bạn có thể thoải mãi giải nén các tệp từ điển vào vị trí cần thiết là '/usr/share/stardict/dic/' Bạn có thể giữ nguyên các thông số mặc định chủa phần mềm giải nén sau khi dã xác định vị trí để giải nén (“Location:”) là thư mục “/usr/share/stardict/dic/”. Tuy nhiên, nếu bạn quen dùng dòng lệnh trong thiết bị cuối, bạn có thể nhanh chóng giải nén và chuyển các bộ từ điển vào vị trí thích hợp chỉ cần dùng 2 dòng lệnh như sau : 7 / 10
- $ sudo tar -xjvf stardict-dictd_phap-viet-2.4.2.tar.bz2 $ sudo mv stardict-dictd_phap-viet-2.4.2 /usr/share/stardict/dic/ Bạn có thể cài đặt bao nhiêu bộ từ điển cũng được, sau đó bạn có thể dùng phần mềm StarDict để quản lý các bộ từ điển theo yêu cầu dùng hay không dùng. Hình 13: Trong ví dụ này, chúng tôi đã cài 4 bộ từ điển : Anh-Việt, Việt-Anh, Pháp-Việt và Việt-Pháp, mỗi bộ từ điển đều có một thư mục riêng Để dùng StarDict, bạn mở thực đơn Ứng dụng (“Applications”), chọn Công cụ bổ sung (“Accessories”), chọn Stardict để hiển thị cửa sổ giao dịch của StarDict. Hình 14: Có thể chọn StarDict trong thanh thực đơn Ứng dụng > Công cụ bổ sung 8 / 10
- Hình 15: Cửa sổ làm việc của StarDict gồm 3 khu chủ yếu. Ở phía dưới có các biểu tượng cho phép thay đổi cà tùy thích và quản lý các bộ từ điển. Cửa sổ giao dịch của StarDict gồm 3 khu chính : vùng nhập từ cần tra cứu ở phía trên ; khung cột bên trái để hiển thị các từ theo thứ tự ABC gần gủi với từ đang muốn tra cứu ; khung vuông chính để hiển thị các định nghĩa hoặc kết quả dịch từ đã tiềm kiếm. Ô vuông đã đánh dấu ở dưới, bên trái, bên cạnh ”Quét từ” sẽ bật khả năng tra từ tự động khi làm nổi bật lên một từ bất kỳ trong các ứng dụng khác nhau. Hình 16: Nếu bạn không muốn dùng một bộ từ điển bạn có thể tắt từ điển đó bằng cách bỏ dấu trong ô vuông kế bên. Khi ấn vào nút “Quản lí từ điển”, bạn có thể chọn các từ điển cần bật lên (đã đánh dấu vào ô vuông) 9 / 10
- hoặc không cần dùng đến (bỏ dấu trong ô vuông). Bạn cũng có thể xác định ưu tiên tra cứu loại từ điển nào trước. Mọi thay đổi trong mục quản lý từ điển sẽ được áp dụng sau khi đóng và khởi động lại StarDict. Đặc biệt phải đóng cả biểu tượng StarDict nằm tren bảng điều khiển của Desktop Ubuntu. Hình 17: Khi ấn phải vào biểu tượng StarDict, có thể đóng hẳn StarDict hoặc tắt/bật chức năng quét từ (auto-scanning). Tuy nhiên nếu bạn muốn khai thác đầy đủ các chức năng của StarDict và tự tạo ra các bộ từ điển theo yêu cầu, bạn nên đọc thêm các tài liệu hướng dẫn trên trang web của StarDict tại http://stardict.sourceforge.net/Documentation.php. Một số liên kết hữu ích ● Trang web của Ubuntu : http://www.ubuntu.com/ ● Trang web của StarDict : http://stardict.sourceforge.net/ ● Trang web của James Nguyễn, có các từ điển tiếng Việt dùng cho StarDict : http://james.dyndns.ws/index.php ● Trang của dự án “The Free Vietnamese Dictionary Project” : http://www.informatik.uni- leipzig.de/~duc/Dict/ ● Trang của dự án “Trung tâm Linux và phần mềm tự do cho sự phát triển Việt Nam” (C3LD) : http://hanoi.centre-linux.org/ ● http://www.echip.com.vn/echiproot/html/2006/285tt/stardict.html : Trang của tạp chí eChip chỉ dẫn về các dùng StarDict, đặc biệt với HĐH Windows. Giấy phép sử dụng tài liệu này Tài liệu này được phân phối theo giấy phép GNU/FDL1, có nghiã bạn có thể sử dụng, sao chép, phân phối lại và sửa lại nội dung của tài liệu này với điều kiện là bạn phải công nhận tác giả của tài liệu gốc là ông Vũ Đỗ Quỳnh (vdquynh@gmail.com hoạc vdquynh@yahoo.com) và bạn phải phân phối lại tài liệu này và các tài liệu xuất phát từ tài liệu này theo giấy phép GNU/FDL. 1 GNU Free documentation licence (http://www.gnu.org/copyleft/fdl.html) 10 / 10
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Hướng dẫn sử dụng cài đặt gói giao diện tiếng việt cho Win XP
5 p |
692 |
230
-
Cách cài đặt windowns từ DOS với đĩa Hiren's Boot
14 p |
441 |
112
-
Cài đặt và cấu hình Apache trong Ubuntu
7 p |
177 |
60
-
Các bước cài window
11 p |
200 |
55
-
Cài đặt Java Server trên Ubuntu
4 p |
150 |
47
-
Hướng dẫn cài đặt Microsoft Office 2013
4 p |
246 |
38
-
Hướng dẫn cài đặt máy chủ iSCSI SAN trong Hyper-V-phần 1
6 p |
157 |
37
-
Cài Đặt Dcom–3G E173eu1 Trên Ubuntu 12.04 LTS
4 p |
228 |
32
-
Cài đặt PHP server trên Ubuntu
4 p |
158 |
31
-
Cài đặt bổ sung XP trên hệ thống Windows 7
4 p |
115 |
23
-
Hướng dẫn thiết lập bộ gõ trong win xp
0 p |
75 |
18
-
4 phần mềm từ điển tiếng Anh miễn phí trên các thiết bị iOS
3 p |
163 |
16
-
Giáo trình Hệ điều hành - V1.0 Chương: Bộ nhớ ảo
19 p |
28 |
8
-
Bài giảng Cài đặt nhiều hệ điều hành trong một máy tính - Lê Minh Triết
108 p |
33 |
7
-
Thủ thuật sử dụng OpenOffice để tạo bộ từ điển
3 p |
41 |
4
-
Hướng dẫn cài đặt Google Picasa 3.6 trong Ubuntu Linux
3 p |
119 |
4
-
.Xóa bỏ từ điển lưu trữ Swype trên điện thoại Android
7 p |
71 |
2

Server: Apache/2.2.31 (CentOS)

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Set-Cookie: TLDEVNamespace=0bmmef0t03pfr738dhhdfcuhq1; path=/; domain=.tailieu.vn; HttpOnly