我在java框架上的Jbutton位置不起作用

时间:2015-01-28 17:55:18

标签: java jframe jbutton

我正在制作我的第一个2D游戏并制作一个菜单,其中包含一个名为" New Game"还有一个大标题。

问题是该按钮一直列在框架的顶部,如下所示:

enter image description here

尝试使用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);
    }

}

}

我想要它看起来像:

enter image description here

2 个答案:

答案 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();
         }
      });
   }
}

通过更改其常量所持有的值,可以调整代码。