Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-JFrame、JPanel、布局和剪辑_Java_Swing_Layout_Jframe_Jpanel - Fatal编程技术网

Java-JFrame、JPanel、布局和剪辑

Java-JFrame、JPanel、布局和剪辑,java,swing,layout,jframe,jpanel,Java,Swing,Layout,Jframe,Jpanel,我有三个问题。(注意-我没有足够的声誉来发布图片,所以我链接了它们。我需要混淆它们…) 1) 我创建了一个面板来保存我的游戏图形(玩家区域)。面板应为800x800,并夹住下方和右侧的所有部件。但当我将图形面板添加到JFrame时,它不会剪辑。所以图像在左右两边都有。 这是一张如何开始游戏的图片。理想情况下,图形将始终在此矩形中开始: 图#1: 现在,当我按play开始时会发生什么 图2: 如何设置面板/框架,使图形仅占800x800(如第一张图片),其他所有内容都被剪裁 2) 我对如何设置JF

我有三个问题。(注意-我没有足够的声誉来发布图片,所以我链接了它们。我需要混淆它们…)

1) 我创建了一个面板来保存我的游戏图形(玩家区域)。面板应为800x800,并夹住下方和右侧的所有部件。但当我将图形面板添加到JFrame时,它不会剪辑。所以图像在左右两边都有。 这是一张如何开始游戏的图片。理想情况下,图形将始终在此矩形中开始:

图#1:

现在,当我按play开始时会发生什么

图2:

如何设置面板/框架,使图形仅占800x800(如第一张图片),其他所有内容都被剪裁

2) 我对如何设置JFrame有点困惑。这就是我想要的布局:

图片#3:

您将如何布置框架/面板?我在考虑边界布局,但我不确定它是否可行

3) 对于这个游戏,扩展JFrame的类还包含main()。这种做法不好吗?**您不应该在主类上扩展JFrame吗

  • 获取800x800面板的最简单方法是使用
    setPreferredSize()
    ,然后使用
    pack()
    包含is的
    JFrame
    。方便地,
    pack()
    “使此
    窗口的大小符合其子组件的首选大小和布局。”
  • 2) 。有关布局建议,请参见。可以使用嵌套面板来实现所需的布局

    3) 。扩展
    JFrame
    没有什么错,但除非修改
    JFrame
    的行为,否则没有什么意义。相比之下,
    JPanel
    是一个方便的组件分组容器;它被设计用来扩展。你可以从这方面来研究这一点

    增编:

    我不希望面板显示任何东西,除了x和y方向的800像素

    您可以覆盖
    paintComponent()
    并复制所需图像的任何部分。在下面的示例中,
    g.drawImage(img,0,0,null)
    绘制图像的左上800像素,而
    g.drawImage(img,0,0,getWidth(),getHeight(),null)
    缩放图像并调整面板大小。请注意,
    f.setresizeable(false)
    防止更改窗口大小

    附录:您还可以将源图像的任意部分复制到源图像的任意区域 目标面板,如下所示。也可以考虑重写<代码> GETAPYRESSIZE()<代码>,如建议的。< /P>
    编辑;如果不正确,请还原。你是指剪裁、裁剪还是缩放?@trashgood:我的意思是,我希望游戏包含在其中,并显示它原来所在的800x800矩形。我不希望面板在x和y方向上显示800像素的任何内容。(因此,溢出的图像在每个方向上仍将超过800,但不会显示。)对于#3,修改行为需要什么?扩展与实例化JFrame是否会改变一个人以任何方式使用JFrame的方式?@Dan James:根据我对上面评论的理解,我添加了一个例子。
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    /** @see http://stackoverflow.com/q/3851847 */
    public class MyPanel extends JPanel {
    
        private BufferedImage img;
    
        public MyPanel() {
            this.setPreferredSize(new Dimension(800, 800));
            try {
                img = ImageIO.read(new File("../scratch/image.png"));
            } catch (IOException ex) {
                ex.printStackTrace(System.err);
            }
        }
    
        @Override
        protected void paintComponent(Graphics g) {
    //        g.drawImage(img, 0, 0, 800, 800, null);
    //        g.drawImage(img, 0, 0, getWidth(), getHeight(), null);
            g.drawImage(img, 0, 0, 800, 800, 0, 0, 800, 800, this);
        }
    
        private void display() {
            JFrame f = new JFrame("MyPanel");
    //        f.setResizable(false);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(this);
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new MyPanel().display();
                }
            });
        }
    }