#java #swing #jlabel
#java #качать #jlabel
Вопрос:
Как установить фоновое изображение в поле label с динамическим текстом.
например:
JLabel label = new JLabel();
label.setIcon("/image/image.png");
label.setText("Text1");
Этот код не работает, потому что текст не отображается в центре изображения.
Ответ №1:
Это очень просто.
import javax.swing.*;
public class YourFrame extends JFrame {
private ImageIcon icon;
private JLabel label;
public YourFrame(){
icon = new ImageIcon("/image/image.png");
label= new JLabel() {
public void paintComponent(Graphics g) {
g.drawImage(icon.getImage(), 0, 0, null);
super.paintComponent(g);
}
};
label.setOpaque(false);
getContentPane().add( label );
label.setText("Text1");
}
public static void main(String[] args) {
YourFrame frame = new YourFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
Комментарии:
1. Можно ли в любом случае установить ширину и высоту JLabel такими же размерами, как image.png, и выровнять текст по середине?
2.
setPreferredSize
работает, но есть ли какой-либо другой способ сделать это без ручной настройки ширины и высоты? (т. Е. Когда я изменяю размеры .png, мне не нужно изменять коды, чтобы они соответствовали .png)3. Затем вам нужно переопределить метод getPreferredSize() метки и вернуть размеры значка.
Ответ №2:
Вы не определили, как текст должен быть раскрашен по отношению к изображению. Вот 4 разных подхода, которые не требуют пользовательского рисования:
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
public class LabelImageText extends JPanel
{
public LabelImageText()
{
JLabel label1 = new JLabel( new ColorIcon(Color.ORANGE, 100, 100) );
label1.setText( "Easy Way" );
label1.setHorizontalTextPosition(JLabel.CENTER);
label1.setVerticalTextPosition(JLabel.CENTER);
add( label1 );
//
JLabel label2 = new JLabel( new ColorIcon(Color.YELLOW, 200, 150) );
label2.setLayout( new BoxLayout(label2, BoxLayout.Y_AXIS) );
add( label2 );
JLabel text = new JLabel( "More Control" );
text.setAlignmentX(JLabel.CENTER_ALIGNMENT);
label2.add( Box.createVerticalGlue() );
label2.add( text );
label2.add( Box.createVerticalStrut(10) );
//
JLabel label3 = new JLabel( new ColorIcon(Color.GREEN, 200, 150) );
add( label3 );
JLabel text3 = new JLabel();
text3.setText("<html><center>Text<br>over<br>Image<center></html>");
text3.setLocation(20, 20);
text3.setSize(text3.getPreferredSize());
label3.add( text3 );
//
JLabel label4 = new JLabel( new ColorIcon(Color.CYAN, 200, 150) );
add( label4 );
JTextPane textPane = new JTextPane();
textPane.setText("Add some text that will wrap at your preferred width");
textPane.setEditable( false );
textPane.setOpaque(false);
SimpleAttributeSet center = new SimpleAttributeSet();
StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
StyledDocument doc = textPane.getStyledDocument();
doc.setParagraphAttributes(0, doc.getLength(), center, false);
textPane.setBounds(20, 20, 75, 100);
label4.add( textPane );
}
public static class ColorIcon implements Icon
{
private Color color;
private int width;
private int height;
public ColorIcon(Color color, int width, int height)
{
this.color = color;
this.width = width;
this.height = height;
}
public int getIconWidth()
{
return width;
}
public int getIconHeight()
{
return height;
}
public void paintIcon(Component c, Graphics g, int x, int y)
{
g.setColor(color);
g.fillRect(x, y, width, height);
}
}
private static void createAndShowUI()
{
JFrame frame = new JFrame("LabelImageText");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( new LabelImageText() );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
Ответ №3:
Доступно несколько вариантов. Например, вы можете поместить JLabel поверх другого JLabel (хотя сначала предоставьте контейнеру JLabel жизнеспособный менеджер компоновки), или вы можете нарисовать изображение непосредственно в методе paintComponent JLabel. Если вы сделаете последнее, убедитесь, что JLabel установлен непрозрачным.
Ответ №4:
Используйте этот код
label.setIcon(new ImageIcon("background.png"));
label.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
label.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
Используя этот значок, выровнять по центру в качестве фона для JLabel