我必须说我尝试了一切,我无法理解我的代码有什么问题。
在我的SIView
课程中,我创建了MainFrame
,它以指定的分辨率扩展JFrame
(比方说X,Y)。
然后,我创建gamePanel
,其扩展名JPanel
与MainFrame
的分辨率相同,并将其添加到MainFrame
。问题是面板的有效分辨率是两倍大(x * 2,y * 2)。这就像面板被拉伸到两倍大。
框架将仅显示面板的四分之一(左上角四分之一),或者使用pack()
或mannualy设置大小,除非我将其设置为分辨率的两倍,在这种情况下它没关系,但这不是一个正确的方法要做到这一点(当计算游戏中的位置时,我必须将所有内容加倍或将其除以2以保持适当的比例)。我甚至尝试了不同的布局管理器,但没有任何成功。
以下是主视图类的代码:
public class SIView implements Runnable {
private final MainFrame mainFrame;
private final GamePanel gamePanel;
public SIView(BlockingQueue<SIEvent> eventQueue) {
this.eventsQueue = eventQueue;
mainFrame = new MainFrame();
gamePanel = new GamePanel();
gamePanel.setVisible(true);
mainFrame.getContentPane().add(gamePanel);
// mainFrame.pack();
@Override
public void run() {
mainFrame.setVisible(true);
}
public void init() {
SwingUtilities.invokeLater(this);
}
//some code not related
}
框架类:
public class MainFrame extends JFrame {
/**
*
*/
private static final long serialVersionUID = 6513420589842315661L;
public MainFrame() {
setTitle("Space Intruders");
setSize(new Dimension(SIParams.RES_X, SIParams.RES_Y));
setResizable(false);
setLayout(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
小组类:
public class GamePanel extends JPanel {
/**
*
*/
private static final long serialVersionUID = 8112087715257989968L;
private final PlayerShipView playerShip;
private final ArrayList<SmallEnemyShipView> smallEnemyShip;
private final ArrayList<LightMissleView> lightMissle;
public GamePanel() {
setPreferredSize(new Dimension(SIParams.RES_X, SIParams.RES_Y));
setMaximumSize(new Dimension(SIParams.RES_X, SIParams.RES_Y));
setBounds(0, 0, SIParams.RES_X, SIParams.RES_Y);
setBackground(new Color(0, 0, 0));
setLayout(new OverlayLayout(this));
setDoubleBuffered(true);
// TODO
playerShip = new PlayerShipView();
smallEnemyShip = new ArrayList<SmallEnemyShipView>();
lightMissle = new ArrayList<LightMissleView>();
this.add(playerShip);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
}
//some code not related
}
答案 0 :(得分:2)
如果我使用LayoutManager
并在getPreferredSize()
中正确覆盖GamePanel
,则代码似乎按预期工作:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import org.jfree.ui.OverlayLayout;
public class SIView implements Runnable {
public static interface SIParams {
int RES_X = 500;
int RES_Y = 400;
}
public static class GamePanel extends JPanel {
public GamePanel() {
setBackground(new Color(0, 0, 0));
setLayout(new OverlayLayout());
}
@Override
public Dimension getPreferredSize() {
return new Dimension(SIParams.RES_X, SIParams.RES_Y);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
}
// some code not related
}
private JFrame mainFrame;
private GamePanel gamePanel;
@Override
public void run() {
mainFrame = createMainFrame();
gamePanel = new GamePanel();
mainFrame.getContentPane().add(gamePanel);
mainFrame.pack();
mainFrame.setVisible(true);
}
private JFrame createMainFrame() {
JFrame frame = new JFrame();
frame.setTitle("Space Intruders");
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
return frame;
}
public void init() {
SwingUtilities.invokeLater(this);
}
// some code not related
public static void main(String[] args) {
new SIView().init();
}
}
我还删除了MainFrame
类,因为在此上下文中不需要扩展JFrame
。
答案 1 :(得分:0)
我刚刚解决了所有问题:D但我必须说我感到愚蠢。问题在于绘制我的组件,在paintcomponent()
方法中我在相对位置上绘制矩形,同时也相对地改变组件位置。这产生了2倍移动等效果,因为当组件移动时,矩形也在其内部移动。我想我有很多东西要学习Swing;)抱歉所有这些麻烦;)
PS。除了在所有内容之后使用pack()
方法之外,我不必更改Panel / Frame类中的任何内容。