簡體   English   中英

Java - JFrame、JPanel、布局和剪裁

[英]Java - JFrame, JPanel, Layout, and Clipping

我有三個問題/問題。 (注意 - 我沒有足夠的聲譽來發布圖片,所以我鏈接了它們。我需要混淆它們......)

1) 我創建了一個面板來保存我的游戲圖形(玩家區域)。 該面板應該是 800x800 並剪輯位於下方和右側的所有內容。 但是當我將圖形面板添加到 JFrame 時,它​​不會剪輯。 所以圖像在左右兩邊移動。 這是游戲開始的圖片。 理想情況下,圖形將始終從這個矩形開始:

圖片#1: http : //i.stack.imgur.com/idL8f.png

現在,當我按下播放開始時會發生什么。

圖片#2: http : //i.stack.imgur.com/dxtbe.png

如何設置面板/框架,以便圖形僅占用 800x800(如第一張圖片)而其他所有內容都被剪裁?

2) 我對如何設置 JFrame 有點困惑。 這是我希望它的布局方式:

圖片#3: http : //i.stack.imgur.com/ZyJS5.png

你會如何布置 JFrame/Panels? 我在考慮 BorderLayout,但我不確定它是否會奏效。

3) 對於這個游戲,我擴展 JFrame 的類也包含 main()。 這是不好的做法嗎?** 你不應該在主類上擴展 JFrame 嗎?

  1. 獲得 800x800 面板的最簡單方法是使用setPreferredSize()然后pack()包含的JFrame 方便地, pack() “使這個Window大小適合其子組件的首選大小和布局。”

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.setResizable(false)可防止更改窗口的大小。

附錄:您還可以將源圖像的任意部分復制到目標面板的任意區域,如下所示。 也可以考慮覆蓋getPreferredSize()作為建議在這里

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();
            }
        });
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM