2014-11-01 4 views
3

Я работаю над этой игрой на Java, и я просто переписал весь код, связанный с моим окном, от java.awt до javax.swing. Вскоре после этого я понял, что сейчас все немного сложнее, поэтому я провел некоторое исследование и выяснил, как рисовать вещи, как установить размер JFrame и т. Д. Но по какой-то причине размер моего JFrame всегда выходит за 10 пикселей за размер, который я указал, чтобы он стал. В этом случае я хотел, чтобы оно было 640 на 640 пикселей.My JFrame всегда становится слишком большим.

Вот мой код:

package chrononaut; 

import java.awt.*; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.*; 


@SuppressWarnings("serial") 
public class GameJFrame extends JFrame 
    { 

    //Background color: 
    static Color bgrCol = new Color(12, 4, 64); 

    //Size: 
    final static int size = 640; 

    //The component that does the actual drawing: 
    static GameJComp drawingComp = new GameJComp(); 

    //Constructor: 
    public GameJFrame() 
     { 
     //Calling super() and setting the title: 
     super("Chrononaut"); 

     //Setting icon image: 
     try 
     { 
     Image icon = ImageIO.read(getClass().getResource("/icon/icon 1.png")); 
     setIconImage(icon); 
     } 
     catch (IOException e) {} 

     //make it closable: 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 


     //Setting the size: 
     Container c = getContentPane(); 
     Dimension d = new Dimension(size, size); //for some reason, it goes 10 pixels beyond the given values 
     c.setPreferredSize(d); 
     pack(); 

     //Adding the drawing component to the content pane: 
     getContentPane().add(drawingComp); 

     //Making sure the window size stays constant: 
     setResizable(false); 

     //Centering position: 
     Toolkit tk = Toolkit.getDefaultToolkit(); 
     Dimension s = tk.getScreenSize(); 
     setLocation(s.width/2-getWidth()/2, s.height/2-getHeight()/2); 

     //Background color: 
     setBackground(bgrCol); 

     //Make it visible: 
     setVisible(true); 

     } 


    public void drawAll() 
     { 
     drawingComp.drawAll(); 
     } 

    public void closeGame() 
     { 
     dispose(); 
     System.exit(0); 
     } 

} 

Когда я запускаю его, пространство внутри границ JFrame, как представляется, имеют размер 650 пикселей, а не 640, даже когда я называю setPreferredSize (d). Я пробовал сделать размер d = новый размер (размер - 10, размер - 10); который, похоже, работает, но я понятия не имею, какая погода будет на других платформах. Я не видел эту проблему нигде в Интернете, поэтому я совершенно не знаю, почему она это делает. :(

ответ

7

Это проблема, связанная с использованием setResizable(false); После того как вы попытался установить размер окна.

Проблема заключается в том, что (на Windows, по крайней мере), размер границы кадров отличается от изменяемый размер и не изменять размер окна.

Вызов setResizable перед вызовом pack

Если вы хотите лучше (и в целом более надежный) способ центрирования окна, рассмотреть возможность использования

setLocationRelativeTo(null); 

вместо

setLocation(s.width/2-getWidth()/2, s.height/2-getHeight()/2); 

Toolkit.getScreenSize не принимает во внимание место, занимаемое на панели задач ...

+0

Спасибо! Это сработало! : D –

+1

@MagnusAppel Да, это боль в API;) – MadProgrammer

Смежные вопросы