Hướng dẫn tạo giao diện đệp cho button trong java
Trong ví dụ 2 này chúng ta tạo một JLabel và 2 JButton được đặt trong một GriLayour với 3 hàng và 1 cột. Khi click vào button “Green” hoặc “Blue” thì text và background của JLabel được thay đổi. Show 2 cách tạo và bắt sự kiện trong ví dụ này cũng khác hoàn toàn so với ví dụ trước. Ở đây chúng ta implements Interface ActionListener để phục vụ việc lắng nghe sự kiện. Khi implements Interface này thì chúng ta cần phải Override phương thức actionPerfomed() của nó để thực hiện việc lắng nghe sự kiện. Đối của phương thức này là 1 ActionEvent e, đây chính là sự kiện mà nó nghe được. Để biết được chính xác button nào được ấn thì ta cần so sánh nó với các button. Đối với btnGreen, nó là 1 biến “toàn cục” của class nên ta có thể so sánh bằng cách dùng e.getSource() == btnGreen để kiểm tra, tuy nhiên với button Blue thì nó không phải vậy mà nó là một JButton được tạo trong phương thức createJButton() nên muốn kiểm tra được nó ta so sánh với nhãn text của nó bằng lệnh e.getActionCommand() == “Blue”. Bạn lại chú ý lên phương thức createJButton() nó trả về 1 JButton. Các button được tạo bới phương thức này cần được addActionListener(this). Vì chúng ta đã implements Interface ActionListener nên phương thức này có đối là this tức là tác động đến chính cái ActionListener đó do đó mà các button có thể nghe được sự kiện. Đặt Magin cho JButton:Nếu text của Jbutton hơi dài quá so với kích thước của nó, bạn có thể đặt khoảng cách giữa biên của button tới text bằng cách dùng phương thức: Trong bài viết này, mình sẽ tổng hợp cho các bạn một vài mẫu renderer hay được dùng trong JTable. Mặc dù nhu cầu biểu diễn dữ liệu trên JTable rất đa dạng, bài tổng hợp này cũng không thể bao quát hết được tất cả các trường hợp, nhưng cũng đừng lo, khi các bạn làm nhiều, các bạn sẽ nhanh chóng rút được ra quy luật của nó thôi. Với các cách biểu diễn đơn giản như dùng checkbox cho dữ liệu kiểu boolean, căn lề phải cho kiểu Number, biểu diễn ngày tháng, hoặc nếu bạn còn lạ lẫm với khái niệm về renderer, bạn hãy xem lại trong bài viết giới thiệu về cell renderer trước nhé. Đổi màu chữ trong JTableDefaultTableCellRenderer mặc định sử dụng JLabel để render ô của bảng. Để tạo một renderer có tác dụng đổi màu text trong JTable rất đơn giản. Bạn chỉ cần lợi dụng phương thức setForeground của JLabel. public static class ColorRenderer extends DefaultTableCellRenderer { } Căn lề cho cộtBạn có thể căn lề trái, giữa, phải cho các cột trong JTable tùy ý. public static class AlignRenderer extends DefaultTableCellRenderer { } Chèn ảnh vào ô của bảngLợi dụng khả năng biểu diễn hình ảnh của JLabel thông qua phương thức setIcon. Trong demo, mình sẽ chèn 2 ảnh khác nhau vào cell của JTable dựa vào giá trị được đưa vào là public static class AlignRenderer extends DefaultTableCellRenderer { }
0.public static class ImageRenderer extends DefaultTableCellRenderer { }
Tương tự từ demo này, bạn cũng có thể tạo ra renderer biểu diễn cả text và hình ảnh trên JTable.Định dạng tiền tệ – Currencypublic static class CurrencyRenderer extends DefaultTableCellRenderer { }
Hoặc bạn làm như sau:public static class CurrencyRenderer extends DefaultTableCellRenderer { }
Hai cách viết này tương đương nhau. Bản chất của phương thức setValue của DefaultTableCellRenderer là gọi đến phương thức setText được kế thừa từ JLabel.Output một giá trị khác với giá trị đầu vàoCác bạn tránh nhầm lẫn nhé. Giá trị mà renderer vẽ ra hoàn toàn không có ảnh hưởng gì đến giá trị đầu vào. Nó chỉ có hiệu quả thị giác mà thôi. Bạn có thể hình dung rằng renderer chỉ vẽ ra một tấm mặt nạ để che đậy khuôn mặt bên dưới vậy. Một cell có giá trị đầu vào là “CodeBlue” nhưng được render ra hiển thị là “Mr.CodeBlue”. Khi bạn lấy giá trị của cell này (thông qua getValueAt của JTable chẳng hạn), thì giá trị bạn lấy được vẫn là “CodeBlue”. public static class OutputRenderer extends DefaultTableCellRenderer { }
Đến đây, bạn có thể thấy rằng tất cả các renderer mà chúng ta vừa tạo đều được kế thừa từ DefaultTableCellRenderer. Và trên thực tế, đây cũng là cách phổ biến nhất để tạo ra renderer cho JTable. Như các bạn biết, DefaultTableCellRenderer được kế thừa từ JLabel. Chúng ta có thể rút ra một kinh nghiệm từ đây:Khi bạn muốn JTable được hiển thị theo một cách nào đó, bạn hãy nghĩ xem cách đó có thể được biểu diễn bởi JLabel hay không? Nếu có thể, bạn chỉ cần viết các phương thức tương ứng của JLabel trong khi override lại getTableCellRendererComponent của DefaultTableCellRenderer. Nó sẽ trả về tham chiếu đến JLabel mà bạn đã sửa đổi để đạt được sự hiển thị như mong muốn. Vậy trường hợp nếu bạn muốn một cột trong JTable được hiển thị theo cách mà không thể được biểu diễn bằng JLabel thì sao? Chúng ta cũng biết JLabel có những giới hạn. Chẳng hạn nó không thể tạo ra màu background được. Trong trường hợp này, bạn có thể trả về cho phương thức getTableCellRendererComponent một component khác mà có khả năng biểu diễn được yêu cầu của bạn, hơn là trả về một JLabel như bình thường. Tạo màu nền cho các ô trong bảngVí dụ mình tạo ra một renderer để render ra các ô có màu nền màu đỏ, text màu xanh, căn lề giữa: public static class BgRenderer extends DefaultTableCellRenderer { } Sử dụng các renderer đã được tạoChúng ta đã có renderer, vậy làm thế nào để sử dụng chúng? Trong JTable, bạn có 2 cách thường dùng sau: |