如何在屏幕上定位JButton?

时间:2015-11-02 19:20:31

标签: java swing jframe jbutton

我曾尝试查看许多文档和教程,但它们似乎都没有合作。我只是想为一个“游戏”制作一个简单的“主菜单”,我的朋友和我正试图制作。当没有背景图像时,我能够移动按钮,我只能获得背景图像,但我无法移动按钮。 所以我的问题是如何定位JButtons?

这是我的代码&截图: What my frame looks like

    package game;
    import java.awt.FlowLayout;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;

    public class MainMenu extends JFrame{

    private JButton singPlay = new JButton("Single Player");
    private JButton twoPlay = new JButton("Two Player");

    public MainMenu()
    {   
        JFrame frame = new JFrame("TestTEST");
        JPanel panel = new JPanel();

        frame.setSize(400,500);
        frame.setLocation(700,300);
        frame.setResizable(false);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new JLabel(new ImageIcon("C:\\Users\\Austin\\Pictures\\Landscape.jpg")));

        frame.setLayout(new FlowLayout());
        frame.add(singPlay);
        frame.add(twoPlay);

        frame.setSize(399,499);
        frame.setSize(400, 500);
    }

    public static void main(String[] args)
    {
        new MainMenu();

    }
}

4 个答案:

答案 0 :(得分:4)

  

所以我的问题是如何定位JButtons?

使用适当的布局管理器。

您将布局管理器设置为FlowLayout,以便按钮显示在框架的顶部。

也许您想将按钮置于框架中心。如果是这样,那么你可以使用GridbagLayout。

另外,不要使用setSize()。使用pack()方法。最后,在将组件添加到框架后,框架应该可见。

所以你的代码看起来像是:

public MainMenu()
{
    JPanel panel = new JPanel();
    panel.setOpaque(false);
    panel.add(singPlay);
    panel.add(twoPlay);

    JFrame frame = new JFrame("TestTEST");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);
    frame.setContentPane(new JLabel(new ImageIcon("yourfilename.jpg")));
    frame.setLayout(new GridBagLayout());
    frame.add(panel, new GridBagConstraints());
    frame.pack();
    frame.setLocationRelativeTo( null );
    frame.setVisible( true );
}

或许您希望按钮垂直居中。然后,您可以使用垂直BoxLayout

阅读Layout Managers上的Swing教程并自行决定什么是合适的。

答案 1 :(得分:3)

现在您正在使用JLabel作为内容窗格,但这并没有多大意义。

您应该扩展JLabel并覆盖JPanel以自己绘制背景,而不是将背景放在paintComponent()中。 Here是一个关于执行自定义绘画的精彩教程。

获得背景JPanel后,将JButtons放在其中,并将其用作内容窗格。

之后,如果您希望手动定位JButtons,那么您可能正在寻找null layout

答案 2 :(得分:1)

JFrame.setContentFrame()不是您设置背景图片的方式。在How to set background image in Java?

上查看所选答案

此外,您应该在Swing事件线程中执行所有这些操作。

public static void main(String [] args) {
  SwingUtilities.invokeLater( new Runnable() {
     public void run() {
       new MainMenu();
     }
  });
}

答案 3 :(得分:1)

一个简单的解决方案是使用GridBagLayout,以下内容将按钮放在容器的顶部,在容器中垂直和水平

public MainMenu() {
    JFrame frame = new JFrame("TestTEST");
    JPanel panel = new JPanel();

    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setContentPane(new JLabel(new ImageIcon("C:\\Users\\Austin\\Pictures\\Landscape.jpg")));

    frame.setLayout(new GridBagLayout());
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.gridwidth = GridBagConstraints.REMAINDER;
    gbc.insets = new Insets(4, 4, 4, 4);
    gbc.fill = GridBagConstraints.HORIZONTAL;       frame.add(singPlay, gbc);
    frame.add(twoPlay, gbc);

    frame.pack();
    frame.setLocationRelativeTo(null);

    frame.setVisible(true);
}

作为旁注,虽然JLabel在这种情况下工作,但您需要知道它会从icon(和text)计算出它的首选尺寸标签本身的属性,而不是它的孩子,JLabel实际上并不是为了容纳其他组件而设计的