【发布时间】:2013-12-23 18:51:18
【问题描述】:
通过各种布局/空值和其他方法进行过渡很有趣,试图让我的背景图像完美地适合我的框架,而不会出现迄今为止我无法清除的恼人间隙。每一次尝试都导致了更大的差距。如果布局设置为左侧,图像不可避免地会填充左侧的空白,但会扩大右侧的空白,最后一次尝试通过将图像添加到框架直接完美填充它,但导致屏幕上的其他元素不再接收重绘调用
目前我的游戏设置了一个 jframe,创建了扩展 JPanel 的游戏系统类,并且游戏系统类创建了处理开始屏幕或实际游戏屏幕元素的内部类。在系统创建的游戏容器类内部是绘制背景的地方。
缩短的代码提取
主类:
public class Test extends JPanel {
////////////////
////Variables //
////////////////////////////
/**/private static Test test;
/**/private static JFrame stage;
/**/private static Container CurrentMenu;
/**/private boolean isRunning = true; //used to state whether game is running
////////////////////////////////////
////////////////
// initialize //
////////////////
/**/public static void main(String[] args) {
/**/stage = new JFrame("Touhou FBE");//creates game window
/**/stage.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//sets up default handler for closing window
/**/test = new Test();//creates an object of our game
/**/stage.getContentPane().add(test);//add game object to frame
/**/stage.pack();
/**/stage.setVisible(true);//sets frame to visible
/**/stage.setResizable(false);
/**/test.Game_loop();
/**/}
////////////////////////////
/////////////////
// constructor //
/////////////////
/**/public Test(){
/**////////////////////////////////
/**/// create starting game menu //
/**//////////////////////////////// //////////////////
/**/CurrentMenu = new Container(this,stage); // swap GameMenu with GameContainer to be able to see difference with painting
/**/this.add(CurrentMenu); //////////////////
/**/}
///////////////////////
////////////////////////////////////////////
// Game loop which manages object updates //
////////////////////////////////////////////
/**/public void Game_loop(){
/**/while (isRunning) {
/**/test.repaint();
/**/}
/**/}
/////////////////////////////////////////////////
/////////////////////////////////
// Rendering canvas for images //
/////////////////////////////////
/**/public void paint(Graphics g) {
/**/super.paint(g); //Refresh Panel
/**/}
///////////////////////////////////////////////////////
容器类:
//////////////////////////
// game container class //
//////////////////////////
/**/public class Container extends JPanel{
/**/
///////////////
//Variables //
///////////////
/**/public Test Game;
/**/public JFrame stage;
/**/private Image img;
////////////////
//Constructor //
////////////////
/**/public Container(Test game, JFrame Stage){
/**/Game = game;
/**/stage = Stage;
/**/img = (new ImageIcon("resources/background.png").getImage());
/**/Dimension size = new Dimension(700, 400);
/**/setPreferredSize(size);
/**/setMinimumSize(size);
/**/setMaximumSize(size);
/**/setLayout(null);
/**/setSize(size);
/**/}
/**/
////////////////////////////
//////////////////
//Paint sprite //
//////////////////
/**/public void paintComponent(Graphics g) {
/**///super.paint(g);
/**/g.drawImage(img, 0,0, this);
/**/}
////////////////////////////////////
}
程序和示例中使用的图像(重命名为背景) http://img716.imageshack.us/img716/6410/seq6.png
目前我已经达到了如果必须的话,我会留下空白,因为它不会影响整个游戏,但是它让我非常烦恼,并且每次尝试交换布局,删除 hgap/ vgap,强制图像的位置或遵循教程导致没有真正的变化。非常感谢您的帮助,并将帮助确保我再也不会遇到这样的问题。
【问题讨论】:
-
1) 为了尽快获得更好的帮助,请发帖 SSCCE。 2) 例如,获取图像的一种方法是热链接到this answer 中看到的图像。
-
我喜欢你用 //// 和 /**/ 组织代码的方式
-
我认为这两个类组成了一个 SSCCE,因为它实际上是受影响代码的基本框架,但仍然需要学习如何制作更有效的 SSCCE。我也想用图像,如果我链接原始背景图像是你所要求的,这会有所帮助。
-
我还没有通读你的代码,所以我可能在这里不太关键......你不能只是
pack()你的JFrame吗? -
在代码中,我使用 stage 作为对 JFrame 的引用,我使用了 pack() 方法,但是这些差距仍然是后记,我在另一篇文章中读到的一件事是那个包() 显然留下 5px 间隙/边框作为默认值?不完全确定这是否是问题所在。
标签: java swing paintcomponent repaint