我是Java的新手,所以这个问题可能很明显。
我有这个初始化代码:
frame = new JFrame();
frame.setTitle("Test");
frame.setBounds(100, 100, 512, 468);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
JPanel panel = new MyJPanel();
FlowLayout flowLayout = (FlowLayout) panel.getLayout();
panel.setAlignmentY(Component.TOP_ALIGNMENT);
panel.setAlignmentX(Component.LEFT_ALIGNMENT);
panel.setPreferredSize(new Dimension(0, 0));
panel.setMinimumSize(new Dimension(0, 0));
frame.getContentPane().add(panel, BorderLayout.CENTER);
JMenuBar menuBar = new JMenuBar();
frame.getContentPane().add(menuBar, BorderLayout.NORTH);
JMenu mnFile = new JMenu("File");
menuBar.add(mnFile);
mntmOpenBBinary.setPreferredSize(new Dimension(149, 22));
mnFile.add(mntmOpenBBinary);
JSeparator separator = new JSeparator();
mnFile.add(separator);
JMenuItem mntmExit = new JMenuItem("Exit");
mntmExit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
System.exit(0);
}
});
mnFile.add(mntmExit);
MyJPanel
是一个扩展JPanel
类的自定义类。就像测试一样,它只是在"test"
方法中将paintComponent
写入屏幕:
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.BLACK);
g.setFont(RenderFont);
g.drawString("TEST", 1, 1);
}
从下图可以看出,出于某种原因,drawString
方法正在菜单后面。我想在drawString
中给出的坐标是相对于JPanel
窗口的坐标。此外,JPanel
是"填充" JFrame
的整个空间。我希望我的MyJFrame
只有100x100,但似乎总是要自动填充JFrame
。我该如何解决这两个问题?
答案 0 :(得分:4)
文本被菜单栏隐藏,因为drawString()
的最后一个参数是文本基线,而不是上限:http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html#drawString(java.lang.String,%20int,%20int)
所以你需要使用类似的东西:
g.drawString("TEST", 1, 50);
或者更好的是,使用Font.getStringBounds()
来计算文字高度:
Rectangle2D textBounds = g.getFont().getStringBounds("TEST", (((Graphics2D) g).getFontRenderContext());
为避免您的面板占用所有Frame空间,请替换:
frame.getContentPane().add(panel, BorderLayout.CENTER);
使用:
JPanel mainPanel = new JPanel(new BorderLayout());
mainPanel.add(panel, BorderLayout.NORTH);
frame.getContentPane().add(mainPanel, BorderLayout.CENTER);
虽然,你不应该这样:
panel.setAlignmentY(Component.TOP_ALIGNMENT);
panel.setAlignmentX(Component.LEFT_ALIGNMENT);
panel.setPreferredSize(new Dimension(0, 0));
panel.setMinimumSize(new Dimension(0, 0));