- 获得 800x800 面板的最简单方法是使用
setPreferredSize(),然后使用 pack() 包含的 JFrame。方便的是,pack() “导致此 Window 的大小适合其子组件的首选大小和布局。”
2)。有关布局建议,请参阅 A Visual Guide to Layout Managers。您可以使用嵌套面板来实现所需的布局。
3)。扩展JFrame 并没有错误,但除非你修改JFrame 的行为,否则没有什么意义。相比之下,JPanel 是一个方便的组件分组容器; 设计是为了扩展。你可以在这方面检查这个example。
附录:
我不希望面板只显示 x 和 y 方向上的 800 像素。
您可以覆盖paintComponent() 并复制图像的任何所需部分。在下面的示例中,g.drawImage(img, 0, 0, null) 绘制图像的左上角 800 像素,而g.drawImage(img, 0, 0, getWidth(), getHeight(), null) 缩放图像面板的大小。请注意,f.setResizable(false) 会阻止更改窗口的大小。
附录:您还可以将源图像的任意部分复制到
目标面板,如下所示。还可以考虑覆盖getPreferredSize(),正如建议的here。
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();
}
});
}
}