我有一个jframe,它的layoutmanager是gridlayout。当我按下'new…'(jmenuitem)时,用b键新建colorpanel对象ackground:blue is 添加了,但是文本“test”没有显示在jpanel中。正在添加colorpanel对象并显示为蓝色,但是应该在其中的白色文本没有显示。我试着把getx()+20,gety()+20添加到拉绳中(,x、 y);它的行为古怪,没有出现在正确的地方,或者根本没有出现。如何使文本出现在通过gridlayout添加到frame的jpanel中。
public class MainFrame{
protected JFrame frame;
private JPanel containerPanel;
private GridLayout gl = new GridLayout(3,1);
public MainFrame(){
frame = new JFrame("Test");
containerPanel = new JPanel();
gl.setHgap(3);gl.setVgap(3);
frame.setLayout(gl);
frame.setSize(500, 500);
frame.setJMenuBar(getMenuBar());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public JMenuBar getMenuBar(){
JMenuBar menu = new JMenuBar();
JMenu file = new JMenu("File");
JMenuItem newItem = new JMenuItem("New...");
newItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
frame.add(new ColorPanel());
frame.getContentPane().revalidate();
}
});
file.add(newItem);
menu.add(file);
return menu;
}
private class ColorPanel extends JPanel{
ColorPanel(){
setBackground(Color.BLUE);
setPreferredSize(new Dimension(150,150));
setVisible(true);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.WHITE);
System.out.println("X:"+getX()+"Y:"+getY());
g.drawString("Test", getX(), getY());
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
new MainFrame();
}
});
}
}
2条答案
按热度按时间kokeuurv1#
getX()
以及getY()
返回组件在其父级上下文中的x/y位置。组件中的所有引用都是相对于该组件的,这意味着组件的左上方/顶部位置实际上是
0x0
.这可能意味着文本已从组件的可见区域中绘制出来。
70gysomp2#
我试着把getx()+20,gety()+20添加到拉绳中(,x、 y);它的行为很奇怪,而且没有出现在正确的地方
x/y值表示文本的底部/左侧位置,而不是顶部/左侧位置。
因此,如果你想做自定义绘制,你必须确定正确的x/y值,这样文本就“显示在正确的地方”,无论这对你意味着什么。
你需要使用
FontMetrics
类,如果您想对文本进行任何花哨的定位。你可以从Graphics
对象。