2015-05-01 146 views
1

的内部区域的大小我有一个简单的函数,生成一个包含图像的JFrame:设置窗口

//The window 
JFrame frame = new JFrame(); 
//Topmost component of the window 
Container main = frame.getContentPane(); 
//Turns out this is probably the simplest way to render image on screen 
//with guaranteed 1:1 aspect ratio 
JPanel panel = new JPanel() { 
    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(image, 0, 0, null); 
    } 
}; 
//Put the image drawer in the topmost window component 
main.add(panel); 
//Set window size to the image size plus some padding dimensions 
frame.setSize(image.getWidth(null)+1, image.getHeight(null)+15); 

frame.setVisible(true); 

结果:

image description

我认为出现这种情况,因为窗口尺寸包括顶栏和窗口边框的大小。

我也试着设置大小为JPanel和JFrame中调用pack()

//Set the size to the panel and let JFrame size itself properly 
panel.setSize(image.getWidth(null), image.getHeight(null)); 
frame.pack(); 

结果更糟糕:

image description

所以,我怎么能准确地指定内部窗口尺寸像素?

image description

Here's the full function code.

+1

那么你可以尝试在JLabel中插入图像,这可能不会导致此问题。 –

+0

@ParamvirSinghKarwal我从那开始的。我不知道为什么我不再使用该解决方案,但是我猜想有一个原因。 –

+1

显示使用JLabel的图像的最简单方法。只有在操作图像时才进行自定义绘画。 – camickr

回答

2

通过重写的JPanelgetPreferredSize方法和使其可见

JPanel panel = new JPanel() { 
    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(image, 0, 0, null); 
    } 
    @Override 
    public Dimension getPreferredSize(){ 
     return new Dimension(image.getWidth(), image.getHeight()); 
    } 
}; 

查看其回答Use of overriding getPreferredSize() instead of using setPreferredSize() for fixed size Components之前呼吁JFramepack()指定面板的优选大小关于这种技术的使用和效果,或者方法的使用和效果

+0

太棒了!它的工作原理,比我希望的更简单:) –

+0

@TomášZato,更简单的是使用JLabel,因为它为你做到了这一点。 – camickr