Java 面板重叠菜单

标签 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 类的自定义类。作为一个测试,它只是在 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。我该如何解决这两个问题?

enter image description here

最佳答案

文本被菜单栏隐藏,因为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/

相关文章:

java - 如何从java中的列表返回变量并进入mysql数据库?

java - 使用 Java 在 Linux 上的文件夹内运行进程

java - 在 TableView JavaFX 中为 ProgressIndicator 实现 S3 ProgressListener

java - 将 Unicode 字符旋转 90 度

android - 暗淡的背景,就像显示对话框时一样

android布局最小宽度(sw800dp)和不同密度

java - 使用 ScriptObjectMirror 将数组结果从 JavaScript 转换为有用的东西

java - 从 JComboBox 获取值

Java JFrame 矩形

android - 虚线显示在图形布局中,但不显示在设备上