Java 如何在屏幕周围定位JButton?

Java 如何在屏幕周围定位JButton?,java,swing,jframe,jbutton,Java,Swing,Jframe,Jbutton,我试着看了很多文档和教程,但似乎没有一个能一起工作。我只是想为我和朋友正在制作的“游戏”制作一个简单的“主菜单”。我可以在没有背景图像的情况下移动按钮,我只能获得背景图像,但我不能移动按钮。 所以我的问题是如何定位JButtons 以下是我的代码和屏幕截图: 现在,您正在使用JLabel作为内容窗格,这毫无意义 您应该扩展JPanel并覆盖paintComponent()来自己绘制背景,而不是将背景放在JLabel中。这是一个关于执行自定义绘制的很棒的教程 一旦你有了你的背景JPanel,把你

我试着看了很多文档和教程,但似乎没有一个能一起工作。我只是想为我和朋友正在制作的“游戏”制作一个简单的“主菜单”。我可以在没有背景图像的情况下移动按钮,我只能获得背景图像,但我不能移动按钮。 所以我的问题是如何定位JButtons

以下是我的代码和屏幕截图:


现在,您正在使用
JLabel
作为内容窗格,这毫无意义

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

一旦你有了你的背景
JPanel
,把你的
JButtons
放在里面,并把它用作你的内容窗格


之后,如果您希望手动定位您的
JButtons
,那么您可能正在寻找一个。请参阅上的所选答案

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

public static void main(String [] args) {
  SwingUtilities.invokeLater( new Runnable() {
     public void run() {
       new MainMenu();
     }
  });
}
所以我的问题是如何定位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


阅读上的Swing教程,并自行决定合适的方法。

一个简单的解决方案是使用
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
在本例中起作用,但您需要注意,它将根据标签本身的
图标(和
文本
)属性计算其首选大小,而不是子项,
JLabel
实际上并不是用来容纳其他组件的,使用setContentPane是设置JFrame的背景组件的一种非常好的方法。你的链接答案不是一个很好的例子,原因有二,一是关于小程序(即使对于JApplet,setContentPane也是一个不错的选择),二是你不应该扩展顶级容器的绘制,原因之一是JRootPane和contentPane位于它的顶部。实际上,JLabel不是一个坏主意,如果您不想调整背景图像的大小,并且知道标签不会使用子组件来计算首选大小。它只是在简单的情况下简单得多,并不是说我对使用自定义组件有问题。此外,空布局很少是解决方案,并且引入了比它们更多的工作。您希望按钮定位在何处?我希望按钮定位在中心,垂直方向如下面所述的camikr,我尝试查看文档,但我无法让它与我的代码一起工作。
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);
}