java - 如何在同一个 JFrame 上同时显示多个按钮?
问题描述
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
public class SpeedMathGoStartScreen extends JFrame{
JLabel background;
JLabel title;
JButton play;
JPanel playPanel;
JLabel playLabel;
JButton guide;
JPanel guidePanel;
public SpeedMathGoStartScreen() {
title = new JLabel("SPEED MATH GO");
title.setFont(new Font("Comic Sans", Font.BOLD, 96));
title.setBounds(90, 0, 900, 100);
this.add(title);
ImageIcon backgroundImage = new ImageIcon("C:\\Users\\chenr\\Documents\\Speed Math Go\\iconfinder_play-circle_2561292\\ttt.png");
background = new JLabel(backgroundImage);
background.setBounds(0, 0, 1000, 700);
this.add(background);
ImageIcon playImage = new ImageIcon("C:\\Users\\chenr\\Documents\\Speed Math Go\\iconfinder_play-circle_2561292\\iconfinder_play-circle_2561292.png");
play = new JButton("Play", playImage);
playPanel = new JPanel();
playPanel.setLayout(null);
playPanel.setBounds(345, 200, 300, 150);
play.setBounds(345, 200, 300, 150);
play.setFont(new Font("Comic Sans", Font.BOLD, 48));
play.setBackground(Color.RED);
play.setVisible(true);
playPanel.add(play);
this.add(playPanel);
ImageIcon guideImage = new ImageIcon("C:\\Users\\chenr\\Documents\\Speed Math Go\\iconfinder_play-circle_2561292\\iconfinder_thefreeforty_map_1243687.png");
guide = new JButton("Guide", guideImage);
guidePanel = new JPanel();
guidePanel.setLayout(null);
guidePanel.setBounds(320, 400, 350, 150);
guide.setBounds(320, 400, 350, 150);
guide.setFont(new Font("Comic Sans", Font.BOLD, 48));
guide.setBackground(Color.CYAN);
guide.setVisible(true);
guidePanel.add(guide);
this.add(guidePanel);
//play.addActionListener(new ActionListener()
// {
// public void actionPerformed(ActionEvent e)
// {
// new SpeedMathGoGUI();
// }
// });
play.addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new SpeedMathGoGUI();
dispose();
}
});
guide.addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new SpeedMathGoGuide();
dispose();
}
}
);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(1000, 700);
setVisible(true);
}
}
如果在 Eclipse 上运行它,则只显示指南按钮。当我注释掉第 56 行(应该是 this.add(guidePanel))时,只显示播放按钮。我必须对我的代码进行哪些调整才能在 JFrame 上显示两者?我还想知道其他类是否可能影响了这个错误,因为当按下按钮时它会转换为另外两个。
解决方案
不要使用空布局!!!不要使用 setBounds()!!!
Swing 旨在与布局管理器一起使用,因此您需要了解布局管理器的工作原理。
仅显示指南按钮。
this.add(playPanel);
...
this.add(guidePanel);
默认情况下,JFrame 的内容窗格使用BorderLayout
.
在上面的代码中,当您将组件添加到 aBorderLayout
并且未指定约束时,将CENTER
使用该约束。但是,“CENTER”中只能显示一个组件,因此您会看到添加的最后一个组件。
如何同时显示多个按钮
如果您希望面板上有两个按钮(或任何组件),则将两个按钮添加到面板中。基本代码是:
JPanel buttonsPanel = new JPanel();
buttonsPanel.add( play );
buttonsPanel.add( guide );
this.add(buttonsPanel);
JPanel 的默认布局管理器是FlowLayout
. 这是一个简单的布局。组件显示在同一行,添加组件时不需要约束。
阅读 Swing 教程中有关布局管理器的部分,以获取更多信息和其他布局管理器的工作示例。您可以根据自己的要求选择合适的布局管理器。您始终可以使用不同的布局管理器嵌套面板以实现所需的布局。
推荐阅读
- java - 在 JAX-RS 中发出 post 请求时的最佳实践
- amazon-web-services - aws emr 上的 spark 集群找不到 spark-env.sh
- json - 无聊的 Ssl iOS 12
- lstm - 使用RNN(LSTM)时如何处理不随时间变化的特征
- apache-spark - 如何在pyspark中找到每列的平均长度?
- python - 从创建的列表框中突出显示项目(Tkinter)
- node.js - 文件名存储在环境变量中时无法使用nodejs fs模块读取文件
- python - Pandas 脚本卡在 Unix 服务器上,但不在 Windows 上
- php - 如何通过在下拉列表中选择并在表格中显示来获取所有项目名称
- javascript - Lodash 的 _.debounce() 在 Vue.js 中不起作用