java - 为 Java Swing MVC 运行驱动程序不显示视图
问题描述
我对 MVC 不是很了解,所以如果这是一个基本问题,请原谅我。
我目前正在做一个学校项目,我似乎无法让程序正常运行。我已经尝试编译这些 java 文件而没有出现错误。但是,当我尝试运行 MenuDriver.java 文件时,GUI 窗口/视图没有弹出,程序刚刚结束。
菜单控制器.java
import java.awt.event.*;
import javax.swing.event.*;
public class MenuController implements ActionListener {
private StartMenu start;
public MenuController(StartMenu start) {
this.start = start;
start.setListeners (this);
}
public void actionPerformed (ActionEvent e) {
if(e.getActionCommand().equals("Play")) {
start.setVisible(false);
}
}
菜单驱动程序.java
public class MenuDriver
{
public static void main (String[] args)
{
StartMenu start = new StartMenu();
MenuController controller = new MenuController (start);
}
}
开始菜单.java
import javax.swing.JLabel;
import javax.swing.JButton;
public class StartMenu extends JFrame {
private JPanel contentPane;
private JButton btnPlay = new JButton("");
private JLabel label = new JLabel("");
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
StartMenu frame = new StartMenu();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public StartMenu() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 650, 450);
contentPane = new JPanel();
contentPane.setBackground(Color.WHITE);
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
Image img = new ImageIcon(this.getClass().getResource("/smthn1.png")).getImage();
label.setIcon(new ImageIcon(img));
label.setBounds(84, 58, 457, 183);
contentPane.add(label);
Image img2 = new ImageIcon(this.getClass().getResource("/smthn2.png")).getImage();
btnPlay.setIcon(new ImageIcon(img2));
btnPlay.setBounds(222, 251, 166, 64);
contentPane.add(btnPlay);
btnPlay.setActionCommand("Play");
}
public void setListeners (ActionListener a) {
btnPlay.addActionListener (a);
}
}
我正在失去理智,任何帮助将不胜感激。谢谢!
解决方案
当我尝试运行 MenuDriver.java 文件时,GUI 窗口/视图没有弹出,程序刚刚结束。
你永远不会让框架可见,所以程序就结束了。
您需要在构造函数的末尾使框架可见:
btnPlay.setActionCommand("Play");
setVisible( true );
此外,学习使用布局管理器来定位组件。使用带有 setBounds(...) 的 null 布局并不是 Swing 设计的使用方式。
推荐阅读
- ruby-on-rails - rspec - Big Sur 中的等 LoadError
- c - printf 自定义实现中的错误
- python - 我可以创建带有小时和秒的动态 x 轴吗?
- python - 我们如何在 Python 中使用 ntplib 库运行本地 ntp 服务器
- python - 如何告诉python从两个重复的行中取出较大的数字
- java - Android HttpURLConnection POST 不工作。使用 C#
- vue.js - 解析未定义的道具?
- flutter - TextButton的文本颜色没有改变
- javascript - 如何使 JavaScript 中添加的元素与 HTML 中添加的元素反应相同?
- generics - 尽可能实现 Into,否则使用 TryInto