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