我曾尝试查看许多文档和教程,但它们似乎都没有合作。我只是想为一个“游戏”制作一个简单的“主菜单”,我的朋友和我正试图制作。当没有背景图像时,我能够移动按钮,我只能获得背景图像,但我无法移动按钮。 所以我的问题是如何定位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();
}
}
答案 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
实际上并不是为了容纳其他组件而设计的