我正在制作我的第一个2D游戏并制作一个菜单,其中包含一个名为" New Game"还有一个大标题。
问题是该按钮一直列在框架的顶部,如下所示:
尝试使用setbounds来做,但那不起作用。我的按钮的一些代码:
private void loadbuttons() {
JButton button = new JButton("New Game");
button.setBackground(Color.black);
button.setBorderPainted(false);
button.setForeground(Color.green);
button.setLayout(null);
button.setBounds(100, 0, 220, 500);
add(button);
}
做错了什么? 希望它位于标题下:)
修改
我在这段代码中制作了我的2帧:
public Application() {
Menu(); // Game Ui method runs under
if (startgame == 1) {
Gameboard();
}
}
private void Gameboard() {
add(new Board()); // We add the board to the center of the JFrame container
setSize(555, 578);
setTitle("Pacmania"); // Sets title
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null); // Sets the window on the center of the screen
}
private void Menu() {
add(new Menu(startgame)); // We add the menu to the center of the JFrame container
setSize(400, 520);
setTitle("Pacmania"); // Sets title
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null); // Sets the window on the center of the screen
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
Application ex = new Application();
ex.setVisible(true); // Starting and showing the board
}
});
}
我在这里做错了吗?
编辑2:
这是我的代码,我把我的Jbutton ...这个类用于在我的菜单上制作标题+按钮,如果我以后会得到一些图像。
public class Menu extends JPanel {
private int startgame;
private Image background;
public Menu(int startgame) {
this.startgame = startgame;
setFocusable(true);
setDoubleBuffered(true);
setBackground(Color.BLACK);
loadbuttons();
}
private void loadbuttons() {
JLabel lbj = new JLabel("Pacmania");
add(lbj);
JButton button = new JButton("New Game");
button.setBackground(Color.black);
button.setBorderPainted(false);
button.setForeground(Color.green);
button.setLayout(null);
add(button);
}
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D)g;
if (startgame == 0) {
g.setColor(Color.green);
Font big = new Font("Serif", Font.BOLD, 40);
Font small = new Font("Serif", Font.BOLD, 20);
String msg = "Pacmania";
FontMetrics metr = this.getFontMetrics(big);
g.setFont(big);
g.drawString(msg, (400 - metr.stringWidth(msg)) / 2,
520 / 4);
}
}
}
我想要它看起来像:
答案 0 :(得分:1)
使用网格包约束。 Here's一个很好的教程。
答案 1 :(得分:0)
您的按钮可能是使用JPanel的默认FlowLayout设置的。建议:使用不同的布局,不确定哪些布局,因为我不知道您想要的GUI应该是什么样的,但是更好的布局可以帮助您更好地设置按钮的位置。您在这里的一个不好的建议是使用空布局。如果可能的话,尽量避免使用这些因为它们会导致生成严格的GUI,这些GUI在一个平台和屏幕分辨率上看起来很好,但在所有其他平台上看起来很糟糕,并且总是需要调试或增强。
然后是的,Nitroman是对的,你可以使用GridBagLayout并将你的游戏标题JLabel放在你的JButton之上。例如:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class Pacmania extends JPanel {
private static final String TITLE_TEXT = "Pacmania";
private static final int PREF_W = 400;
private static final int PREF_H = PREF_W;
private static final Color BACKGROUND = Color.black;
private static final Color FOREGROUND = Color.green;
private static final Font TITLE_FONT = new Font(Font.SERIF, Font.BOLD, 46);
private static final int I_GAP = 10;
public Pacmania() {
setBackground(BACKGROUND);
setLayout(new GridBagLayout());
JLabel label = new JLabel(TITLE_TEXT, SwingConstants.CENTER);
label.setFont(TITLE_FONT);
label.setForeground(FOREGROUND);
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.weightx = 0.0;
gbc.weighty = 0.0;
gbc.insets = new Insets(I_GAP, I_GAP, I_GAP, I_GAP);
add(label, gbc);
JButton newGameButton = new JButton(new NewGameAction("New Game"));
gbc.gridy = 1;
newGameButton.setBackground(BACKGROUND);
newGameButton.setForeground(FOREGROUND);
newGameButton.setBorderPainted(false);
newGameButton.setFocusPainted(false);
add(newGameButton, gbc);
}
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}
private class NewGameAction extends AbstractAction {
public NewGameAction(String name) {
super(name);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Finish this!
}
}
private static void createAndShowGui() {
JFrame frame = new JFrame("Pacmania");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new Pacmania());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
通过更改其常量所持有的值,可以调整代码。