【问题标题】:How to draw a JMenuBar on top of a graphics如何在图形上绘制 JMenuBar
【发布时间】:2011-06-16 11:13:06
【问题描述】:

我正在用 Java 编写一个基本的计时器程序,在程序中我想在顶部有一个菜单栏。我现在的代码是:

public Main() {
    JMenuBar menubar = new JMenuBar();

    setJMenuBar(menubar);

    JMenu menu = new JMenu("Test");
    menubar.add(menu);

    JMenuItem menuitem = new JMenuItem("Item");
    menu.add(menuitem);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(500, 500);
    setTitle(Namer.name);
    new Timer(delay, timer).start();
    new Timer(1, new Refresher()).start();
    setResizable(false);
    setVisible(true);
}

public void paint(Graphics g) {
    Graphics buffer = unscreen.getGraphics();
    buffer.setColor(Color.white);
    buffer.fillRect(0, 0, 500, 500);
    buffer.setColor(Color.black);
    buffer.setFont(new Font("Times New Roman", Font.PLAIN, 25));
    // buffer.drawString("hours:minutes:seconds: ", 25, 100);
    buffer.drawString(hourss + numhours + ":" + minutess + numminutes + ":"
            + secondss + numseconds, 100, 100);
    g.drawImage(unscreen, 0, 0, null);
}

当我运行这段代码时,我得到了我所期望的一切,这些数字显示了程序运行了多长时间,并且屏幕顶部有一个菜单栏,除了菜单栏。我试过注释掉paint方法,当我这样做时它就起作用了。有没有更好的方法来做我正在做的事情或有不同的解决方案来解决我的问题?另外,如果有更好的方法在窗口上打印东西,我不需要有paint方法。

【问题讨论】:

  • 您是否尝试过在您的绘画方法中调用super.paint(g)

标签: java swing timer jmenubar


【解决方案1】:

直接绘制 JFrame 不是一个好主意。扩展一个 JComponent,覆盖它的 paintComponent() 来进行自定义绘画,然后将它添加到 JFrame 中可能会更容易一些。这样 JMenuBar 在 JFrame 上运行,一切正常。

   public class DrawingSurface extends JComponent{

          public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics buffer = unscreen.getGraphics();
            buffer.setColor(Color.white);
            buffer.fillRect(0, 0, 500, 500);
            buffer.setColor(Color.black);
            buffer.setFont(new Font("Times New Roman", Font.PLAIN, 25));
            // buffer.drawString("hours:minutes:seconds: ", 25, 100);
            buffer.drawString(hourss + numhours + ":" + minutess + numminutes + ":"
             + secondss + numseconds, 100, 100);
            g.drawImage(unscreen, 0, 0, null);
         }
   }

现在您将 DrawingSurface 的实例添加到 JFrame。

【讨论】:

  • 另外,在 JFrame 上绘图会导致第一个,比如说,20 个垂直像素位于窗口的标题栏下方。
猜你喜欢
  • 2013-10-06
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 2016-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多