[JavaSwing] JLabel
Nội dung
Tạo JLabel đơn giản
Đặt màu, màu nền cho JLabel
JLabel thường được dùng để hiển thị text hoặc hình ảnh để tạo các chỉ dẫn, hướng dẫn trên giao diện người dùng.
Trong hình trên có sử dụng 4 JLabel để hướng dẫn người dùng nhập chính xác các thông tin cần thiết.
Ví dụ 1: Tạo các JLabel đơn giản
package nguyenvanquan7826.JLabel; import java.awt.GridLayout; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; public class MyJLabel extends JFrame { public MyJLabel() { // create frame setLayout(new GridLayout(1, 3, 5, 5)); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // create image Icon icon = new ImageIcon(getClass().getResource("7826.png")); // create three JLabel JLabel lb1 = new JLabel("label text only"); JLabel lb2 = new JLabel(icon); JLabel lb3 = new JLabel("icon and text", icon, JLabel.CENTER); lb3.setVerticalTextPosition(JLabel.BOTTOM); lb3.setHorizontalTextPosition(JLabel.CENTER); // add three label to frame add(lb1); add(lb2); add(lb3); // display frame pack(); setLocationRelativeTo(null); setVisible(true); } public static void main(String[] args) { new MyJLabel(); } }
Kết quả ta được 3 JLabel như sau (Chú ý file 7826.png được đặt trong cùng package như hình bên)
Trong ví dụ trên chúng ta chú ý một số lệnh sau:
– setLayout(new GridLayout(1, 3, 5, 5)); Lệnh đặt GridLayout cho JFrame với 1 hàng, 3 cột, các cột và hàng cách nhau là 5px. Layout tạm thời hiểu như cách bố trí các đối tượng cho Jframe, nếu không có Layout thì các đối tượng sẽ bị đè lên nhau.
– Icon icon = new ImageIcon(); Lệnh đọc file ảnh tạo ảnh cho JLabel.
– Tiếp theo là 3 lệnh tạo 3 dạng JLabel. JLabel có tất cả 6 dạng khởi tạo:
+/ JLabel(): Tạo một thể hiện JLabel không có hình ảnh và một chuỗi rỗng
+/ JLabel(Icon image): Tạo một thể hiện JLabel chỉ định một hình ảnh
+/ JLabel(Icon image, int horizontalAlignment): Tạo một thể hiện JLabel chỉ định một hình ảnh và horizontal alignment
+/ JLabel(String text): Tạo một thể hiện JLabel chỉ định text
+/ JLabel(String text, Icon icon, int horizontalAlignment): Tạo một thể hiện JLabel chỉ định text, image và horizontal alignment
+/ JLabel(String text, int horizontalAlignment): Tạo một thể hiện JLabel chỉ định text, và horizontal alignment.
Trong lb3 chúng ta có 2 hàm setVerticalTextPosition và setHorizontalTextPosition để đặt vị trí của text theo chiều dọc (BOTTOM) và theo chiều ngang (CENTER). Đối với JLabel chỉ chứa text giống lb1 nếu muốn căn lề (trái, phải, giữa, …) ta dùng phương thức setHorizontalAlignment(int alignment).
Ví dụ 2: Đặt màu, màu nền cho JLabel
package nguyenvanquan7826.JLabel; import java.awt.Color; import java.awt.GridLayout; import javax.swing.JFrame; import javax.swing.JLabel; public class MyJlabelWithColor extends JFrame { public MyJlabelWithColor() { setLayout(new GridLayout(1, 2, 5, 5)); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400, 200); // create JLabel have text color red and background color green JLabel lb; lb = createJLabel("JLabel 1", Color.red, Color.green); add(lb); // create JLabel have text color blue and background color yellow lb = createJLabel("JLabel 2", Color.blue, Color.yellow); add(lb); // display JFrame setLocationRelativeTo(null); setVisible(true); } private JLabel createJLabel(String text, Color textColor, Color backgroundColor) { JLabel lb = new JLabel(text); // set align lb.setHorizontalAlignment(JLabel.CENTER); // set color lb.setForeground(textColor); // set background color lb.setOpaque(true); lb.setBackground(backgroundColor); return lb; } public static void main(String[] args) { new MyJlabelWithColor(); } }
Trong ví dụ này ta tạo hàm createJLabel trả về 1 JLabel với các đối số truyền vào lần lượt là text, color và brackground color của nó. Đáng lưu ý là để đặt được màu nền thì chúng ta cần đặt Opaque của JLabel là true (mặc định là false).
Tham khảo thêm: class JLabel
mình có thể tạo màu nền label trong suốt không nhỉ, tức là nếu chèn một cái ảnh phía sau label, để label đè lên, nhưng mà như vậy sẽ thấy một khung màu khác, có thể chỉ nổi chữ mà không nổi cả khung label không?
Mặc định thì back ground của JLanel là được đặt trong suốt rồi. Nhưng nếu bạn muốn đặt background của JLabel là một ảnh thì có thể làm như sau:
Trong đó thì cái ảnh bạn đặt trong package tương ứng hoặc lấy từ nơi nào đó (nhưng cần chỉ đúng đường dẫn). Ngoài ra bạn có thể làm theo cách này với các đối tượng khác như JFrame, JPanel, …
Ad co the viet chu thick bang tieng Viet dk ko?
Mình viết chú thích bằng tiếng anh nhưng theo kiểu dịch từ tiếng Việt ra mà. Dễ dịch thôi bạn. Bạn hãy làm quen với việc chú thích và đặt tên biến bằng tiếng Anh nhé, sẽ rất có ích đó.
Anh có thể nói kĩ cho em cách tao file(7826.png) không ạ.
File đó chỉ là file ảnh thôi, bạn dùng ảnh nào cũng được mà.
Em muốn hỏi cách đặt file 7826.png trong package như hình trên)
Bạn cứ copy và paste nó vào thôi.
giả sử em có 1 JLabel trên 1 JFrame, và em muốn vẽ đường thẳng trên JLabel thì làm ntn hả anh
Vậy thì kết thừa lại JLable và viết lại hàm onDraw
e đánh đoạn code đầu vào netbeans xong nó báo lỗi thế này a quân ạ:
invalid method declaration; return type required
setLayout(new GridLayout(1, 3, 5, 5);
illegal start of type
lỗi này là sao z a?
Anh cũng ko rõ sao nữa…
for ( int i = 0; i < 4; ++i) {
for ( int j = 0; j < 3; ++j) {
Image imgTemp = createImage(new FilteredImageSource(img.getSource(),
new CropImageFilter(j*width/3, i*height/3, (width/3)+1, height/3+1)));
vt.add(imgTemp);
}
}
for(int i = 0; i < 12; i++)
{
check[i] = false;
}
checkwin = new int[4][3];
for(int i = 0; i < 4; i++){
for( int j = 0; j 3){
}
bt.setIcon(new ImageIcon(vt.get(index)));
checkwin[i][j] =index ;
check[index] = true;
jp.add(bt);
}
}
anh cho em hỏi một chút không liên quan đến bài viết một chút được không ạ? em sử dụng hàm random và cắt ảnh đưa vào mảng tuy nhiên em muốn 1 ô trong ma trận lưu ảnh cố định tại 1 vị trí thì làm như thế nào ạ? hàm random của em có vẻ bị lỗi anh có thể chỉ ra giải pháp giúp em không ạ?
Mình không có thấy hàm random của bạn ở đâu cả. Nếu bạn muốn 1 ô có ảnh cố định thù đừng cho random vào ô đó.
bt = new JButton();
bt.addActionListener(this);
Random random = new Random();
int index = Math.abs(random.nextInt()%11);// random từ 0 đến 10
while(check[index]){
index = Math.abs(random.nextInt()%11);
System.out.println(index+” “);
}
if(i>3){
}
bt.setIcon(new ImageIcon(vt.get(index)));
checkwin[i][j] =index ;
check[index] = true;
jp.add(bt);
dạ hi em cóp thiếu ạ.
Thế cái này nó làm sao mà bạn bảo sai
dạ không bị sai ạ. nhưng em làm về game ghép hình. khi em random thì cái ô cuối cùng sẽ bị xáo trộn và nếu thực hiện chơi thì sẽ bị chết nước. nên em đang muốn để mảnh ghép cuối cùng đó cố định tại vị trí cuối và chỉ xáo trộn các mảnh ghép khác thôi ạ
Anh cho em hỏi về cái hàm:
Icon icon = new ImageIcon(getClass().getResource(“7826.png”));
// create three JLabel
JLabel lb2 = new JLabel(icon);
Và
label = new JLabel() {
public void paintComponent(Graphics g) {
g.drawImage(img.getImage(), 0, 0, null);
super.paintComponent(g);
}
};
==> Em thấy cũng cho ra kết quả giống nhau, có phải mình muốn dùng cách nào cũng được không anh ??.
Đúng rồi bạn
cho em hỏi làm sao để ghi chữ lên ảnh vậy anh
Bạn xem thử ở đây nhé. http://stackoverflow.com/questions/2736320/write-text-onto-image-in-java
cho em hỏi có hàm nào chỉnh cỡ chữ ko ạ ?
bạn thử setTextSize xem.
hình như không có hàm đó ad ơi e muốn chỉnh cỡ chữ cho đối tượng JLabel mà không được ạ
Anh giải thích các bài tập rất chi tiết ạ. E cảm ơn anh nhiều ạ.
Em muốn hỏi làm cách làm để random màu background của JLabel?
vdu cứ 5 giây lại đổi màu 1 lần ạ.
Random màu thì dùng hàm random mã màu của nó. Còn 5 giây 1 lần thì thử dùng Theard vs Hander xem.
cho e hỏi là mình có thể chọn 1 vùng bất kỳ trên ảnh khi nó được load trên jlabel được không ạ .như kiểu là mình kéo thả chuột để chọn 1 hình chữ nhật bất kì trên đó và xử lí mỗi vùng đó thôi ý .
Cái này mình chưa thử 🙂 Bạn tìm thêm trên google xem nhé.