Java面板重叠菜单

时间:2014-04-13 22:32:07

标签: java swing layout jframe jpanel

我是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。我该如何解决这两个问题?

enter image description here

1 个答案:

答案 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));