【问题标题】:JPanel draws itself underneath JFrame title barJPanel 在 JFrame 标题栏下方绘制自身
【发布时间】:2012-02-18 22:36:38
【问题描述】:

我有一个 500 x 500 像素的图像,我试图将它绘制到一个 JFrame 内的 JPanel 上。这是我到目前为止的代码:

public class Game extends JFrame {
    // Other code...

   setTitle("Game");

   JPanel panel = new JPanel();
   panel.setPreferredSize(new Dimension(500, 500));

   add(panel);
   setSize(500, 500);

   setIgnoreRepaint(true);

   // Handle a close event gracefully.
   addWindowListener(new WindowAdapter() {
       public void windowClosing(WindowEvent e) {
           System.exit(0);
       }
   });

   addKeyListener(new MainMenuState(this));

   setResizable(false);
   pack();
   setVisible(true);

我可以在 JPanel 上绘图,但 JPanel 的左上角似乎在标题栏下方的 JFrame 上的 0,0 处绘制。我尝试在 JFrame 上设置布局管理器,但这似乎不起作用。我可以手动抵消 JPanel,但我不认为我必须这样做(我认为 pack() 应该拿车)。

【问题讨论】:

  • 您能否详细说明您的问题?
  • 我担心您的问题可能是您将 MouseListener/MouseMotionListener 添加到 JFrame 而不是绘图组件,或者您直接在 JFrame 中绘图。如果是这样,则将相对于 JFrame 绘制点。请显示更多代码,以便澄清。
  • 其他可能性是,如果您将 JPanel getX()getY() 方法默认为 0,因为这些方法会阻止布局管理器正确放置组件。或者您可能正在尝试以其他方式设置组件位置——目前很难说。底线是:要正确回答您的问题,我们需要了解更多信息。
  • 我猜我的cmets一定又是用隐形墨水写的……
  • 我添加了我之前删除的一行:addKeyListener(new MainMenuState(this)); 前段时间我在这里问了一个关于向游戏添加上下文的问题,因此它的行为会根据其当前状态而有所不同。有人建议了状态设计模式,所以我尝试实现它。 MainMenuState() 具有主菜单的所有适当绘图和输入处理代码。

标签: java swing user-interface


【解决方案1】:

1) 将此Image 作为Icon 放入JLabel

2) 使用Image#getScaledInstance(int width, int height, int hints) 进行缩放

【讨论】:

    【解决方案2】:

    为什么要在JFrame 中创建JFrame?如果你 extends JFrame 这样做:

    public class Game extends JFrame {
    
        public Game() {
            this.setTitle("Application");
    
            JPanel panel = new JPanel();
            panel.setPreferredSize(new Dimension(500, 500));
    
            this.add(panel);
            this.setIgnoreRepaint(true);
    
            // Handle a close event gracefully.
            this.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
    
            // example, use your own layout manager - see text below
            this.setLayout(new FlowLayout());
    
            this.pack();
            this.setResizable(false);
            this.setVisible(true);
        }
    }
    

    现在回答你的问题。如果你想有一些利润,你将不得不使用layout manager

    【讨论】:

    • 为什么我要在我的 JFrame 中创建一个 JFrame?因为我犯了一个愚蠢的错误呵呵;感谢您指出。我更改了代码以阅读您所拥有的内容,但它似乎仍将 JPanel 部分绘制在标题栏下方。我需要写一个 LayoutManager 吗?我查看了 Java API 中的那些,但我不确定我是否看到任何适用的。
    • @offbyone 我可能误导了你一点。您不必创建自己的 - 只需使用 Java 之一。
    • +1 表示答案,但JFrame 默认有BorderLayout,而add(panel); 大约是把JComponent 放到BorderLayout.CENTER 区域,
    • @mKorbel 我知道。我想向他展示如何设置布局并为他指明正确的方向
    • 即使有一个布局,JFrame 仍然会在 JPanel 上绘制(如果 JPanel 有一个布局,那就是)。如果我尝试向 JFrame 添加布局,则会出现错误。我只希望 JPanel 的左上角位于标题栏的左下角,而不是窗口的左上角(在标题栏下方)。
    【解决方案3】:

    我刚刚遇到并解决了完全相同的问题。

    我的main 写着:

    public static void main(String[] args) {
        JFrame main = new JFrame("Game");
        main.setLayout(new BorderLayout);
        JPanel game = new Game();
        game.setPreferredSize(new Dimension(500, 500));
        main.add(game, BorderLayout.CENTER);
        main.pack();
        main.setVisible(true);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-23
      • 2020-09-02
      • 1970-01-01
      • 2012-04-17
      相关资源
      最近更新 更多