当我使用绝对布局时,出现了我的对象,但是我无法移动它们,因此我将布局更改为null,现在我的对象甚至都没有出现。请帮忙。
Havent尝试了很多,不确定要尝试什么。
try {
enemies = new LinkedList<>();
frame = new JFrame();
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
frame.setLayout(null);
frame.getContentPane().setBackground(Color.black);
frame.setPreferredSize(new Dimension(800, 800));
ActionListener spawnEnemies = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
spawnEnemies();
}
};
ActionListener moveEnemies = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
moveEnemies();
}
};
spawner = new Timer(50000, spawnEnemies);
spawner.start();
mover = new Timer(10, moveEnemies);
mover.start();
addKeyListener(new KeyInput(this));
player = new PlayerObj("white", 399, 399, frame);
player.setPreferredSize(new Dimension(50, 50));
//AddActionEvent, Keylogging, OnbuttonPress, Autogenerating enemies, timers.
frame.getContentPane().add(player);
spawnEnemies();
frame.revalidate();
frame.repaint();
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} catch (IOException ex) {
Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex);
}
答案 0 :(得分:0)
我不确定您想要什么代码,但是我假设您想在屏幕上的指定位置显示敌人/玩家。我个人不建议使用添加到JFrame的组件来显示它。这意味着没有布局,JFrame将不知道如何放置这些对象。
这是解决问题的另一种方法,但是完全是另一种方法。
您必须创建一个JFrame,并将其内容窗格设置为新的JPanel(建议从JPanel扩展您的类并将其自身添加到JFrame,这样可以使事情变得更加容易)。 然后,通过创建以下内容来重写repaint方法:
export type NonMatchingPropNames<T, X> = { [K in keyof T]: T[K] extends X ? never : K }[keyof T];
export type NonMatchingProps<T, X> = Pick<T, NonMatchingPropNames<T, X>>;
type PrimitiveValuesOf<T> = NonMatchingProps<T, object>;
type A = PrimitiveValuesOf<Workflow & WorkflowVersion>;
const a: A = {
name: '',
ID: 0,
versionID: 1,
lastPublished: '',
environmentID: 2
}; // OK
调用repaint()方法时,它将运行此代码。因此,在此处内部,您可以在任何地方(JPanel内部)绘制任何东西。而且您不必弄乱版式,只需将其保留为默认值即可。
绘画示例:
protected void paintComponent(Graphics g){
}