我是 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
类的自定义类。作为一个测试,它只是在 paintComponent
方法中将 "test"
写入屏幕:
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
。我该如何解决这两个问题?
最佳答案
文本被菜单栏隐藏,因为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.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));
关于Java 面板重叠菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23049277/