不显示在 GridLayout 的 JPanel 中
not displaying in JPanel in GridLayout
我有一个以 GridLayout 作为布局管理器的 JFrame。当我按下 'New...' (JMenuItem) 时,添加了带有 background:blue 的新 ColorPanel 对象,但是文本 "test" 没有显示在 JPanel.The ColorPanel 对象中和蓝色一样好,但是应该在里面的白色文本没有显示出来。我尝试在 drawString(... ,x,y); 中添加 getX()+20,getY()+20它表现得很奇怪,没有出现在正确的地方,或者根本没有出现。如何使文本出现在已通过 GridLayout 添加到框架的 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();
}
});
}
}
I tried adding getX()+20,getY()+20 in drawString(... ,x,y); its behaving odd, and not showing up in the right place
x/y 值表示文本的 bottom/left 位置而不是 top/left。
因此,如果您想进行自定义绘画,则必须确定正确的 x/y 值,以便文本能够 "show up in the right place",无论您认为什么意思。
如果您想对文本进行任何花哨的定位,则需要使用 FontMetrics
class。您可以从 Graphics
对象获取 FontMetrics。
getX()
和 getY()
returns 组件在其父上下文中的 x/y 位置。
组件中的所有引用都是相对于该组件的,这意味着组件的顶部 left/top 位置实际上是 0x0
。
这可能意味着文本被涂掉了组件的可见区域。
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.WHITE);
FontMetrics fm = g.getFontMetrics();
int y = fm.getFontHeight() + fm.getAscent();
System.out.println("X:"+getX()+"Y:"+getY());
g.drawString("Test", 0, y);
}
我有一个以 GridLayout 作为布局管理器的 JFrame。当我按下 'New...' (JMenuItem) 时,添加了带有 background:blue 的新 ColorPanel 对象,但是文本 "test" 没有显示在 JPanel.The ColorPanel 对象中和蓝色一样好,但是应该在里面的白色文本没有显示出来。我尝试在 drawString(... ,x,y); 中添加 getX()+20,getY()+20它表现得很奇怪,没有出现在正确的地方,或者根本没有出现。如何使文本出现在已通过 GridLayout 添加到框架的 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();
}
});
}
}
I tried adding getX()+20,getY()+20 in drawString(... ,x,y); its behaving odd, and not showing up in the right place
x/y 值表示文本的 bottom/left 位置而不是 top/left。
因此,如果您想进行自定义绘画,则必须确定正确的 x/y 值,以便文本能够 "show up in the right place",无论您认为什么意思。
如果您想对文本进行任何花哨的定位,则需要使用 FontMetrics
class。您可以从 Graphics
对象获取 FontMetrics。
getX()
和 getY()
returns 组件在其父上下文中的 x/y 位置。
组件中的所有引用都是相对于该组件的,这意味着组件的顶部 left/top 位置实际上是 0x0
。
这可能意味着文本被涂掉了组件的可见区域。
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.WHITE);
FontMetrics fm = g.getFontMetrics();
int y = fm.getFontHeight() + fm.getAscent();
System.out.println("X:"+getX()+"Y:"+getY());
g.drawString("Test", 0, y);
}