我是JLabel
的新用户,我想知道是否可以在图像上以特定的(x,y)坐标设置文本。
喜欢这样:
所以文字是“HI”
label.setText("HI");
label.setIcon(icon);
我试图说label
包含图片和文字,但我想将其定位在特定位置,如上图所示。
我不想使用label.setHorizontalTextPosition(i);
或setVerticalTextPosition(i);
抱歉我的英语不好 在此先感谢^ ^
答案 0 :(得分:3)
有许多合理的方法可以做到这一点。
但是,你应该避免使用OddField
布局,像素完美布局是现代ui设计中的错觉。影响组件个体大小的因素太多,您无法控制。 Swing旨在与布局管理器一起工作,放弃这些将导致问题和问题的终结,您将花费越来越多的时间来纠正
null
和GridBagLayout
GridBagConstraints#insets
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
}
public class TestPane extends JPanel {
public TestPane() throws IOException {
setLayout(new GridBagLayout());
BufferedImage img = ImageIO.read(...);
JLabel background = new JLabel(new ImageIcon(img));
background.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(1, 46, 9, 0);
gbc.anchor = GridBagConstraints.SOUTH;
gbc.weighty = 1;
JLabel message = new JLabel("Go that way!");
message.setVerticalAlignment(JLabel.BOTTOM);
background.add(message, gbc);
add(background);
}
}
}
您可以将文本直接绘制到图像上,但正如您所看到的,它变得相当复杂
Graphics2D
答案 1 :(得分:2)
通过覆盖paintComponent
方法,可以在任何位置绘制文本。
JLabel label = new JLabel(icon) {
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("Hi", 10, 10); //these are x and y positions
}
};
答案 2 :(得分:0)
您可以按照Example进行操作,同时查看Components
的{{1}}方法JLabel
,同时尝试使用Layouts
更好地管理Component
每个JLabel
的位置。
此setLocation()
也适用于JLabel label = new JLabel("Hi");
panel.add(label);
//This is to get the width and height
Dimension size = label.getPreferredSize();
//You can change 100(x) and 100(y) for your likes, so you can put that JLabel wherever you want
label.setBounds(100, 100, size.width, size.height);
的位置,您可以看到他如何完成工作并将其应用到您的项目中。
x
您必须知道y
以及JLabel
想要放置x
的内容。
如果您想这样做,只需执行guy所做的事情,但要显示y
和Container
以了解您想要的确切位置。
创建Container container= getContentPane();
JLabel
在其上添加container.add(label);
MouseListener()
添加x
以获取y
和container.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
//x and y are ints.
x = e.getX();
y = e.getY();
label.setBounds(x,y,150,50);
}
});
FOR v IN vertex_collection
FILTER LENGTH( EDGES(edge_collection, v._id, "outbound"))==0
RETURN v._id