如何使用仅使用 1 个 JFrame 的 swing 制作应用程序?
How to make an app using swing that only uses 1 JFrame?
我正在制作应用程序或 (something.exe)。我想制作一个 class 作为我的主框架。那是因为我不想为我将制作的每个 class 创建新框架。我希望我的 class MainMenu
具有 MainFrame
的框架,我可以在其中放置按钮等
package ThinkNotOfficial;
public class Main {
public static void main(String[] args) {
MainFrame mainFrame = new MainFrame();
}
}
package ThinkNotOfficial;
import javax.swing.*;
import java.awt.*;
public class MainFrame extends JFrame{
// Global Variables
JFrame mainFrame = new JFrame("Base Frame (global)");
ImageIcon logo = new ImageIcon("Logo.png");
MainFrame (){
mainFrame.setSize(500, 500);
mainFrame.setResizable(false);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setIconImage(logo.getImage());
mainFrame.getContentPane().setBackground(new Color(255,255,255));
mainFrame.setLocationRelativeTo(null);
mainFrame.setLayout(null);
mainFrame.setVisible(true);
// ------------ PROGRAM FIELD -----------
}
}
package ThinkNotOfficial;
import javax.swing.*;
public class MainMenu{
// ------------ Global Variables ------------
JButton play = new JButton("PLAY");
MainMenu(){
// ------------ PLAY button ------------
play.setSize(100,50);
// ------------ Adding parts ------------
}
}
利用
- 模型-视图-控制器
- 依赖注入(即Passing Information to a Method or a Constructor)
- 观察者模式
您还可以利用CardLayout
来帮助方便不同视图之间的切换,例如
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new MainPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class MainPane extends JPanel {
private CardLayout cardLayout;
private MenuPane menuPane;
private GamePane gamePane;
public MainPane() {
cardLayout = new CardLayout();
setLayout(cardLayout);
menuPane = new MenuPane(new MenuPane.Observer() {
@Override
public void didStartGame(MenuPane source) {
cardLayout.show(MainPane.this, "game");
}
});
gamePane = new GamePane(new GamePane.Observer() {
@Override
public void gameDidEnd(GamePane source, int score) {
cardLayout.show(MainPane.this, "menu");
}
});
add(menuPane, "menu");
add(gamePane, "game");
}
}
public class MenuPane extends JPanel {
public interface Observer {
public void didStartGame(MenuPane source);
}
public MenuPane(Observer observer) {
setLayout(new GridBagLayout());
JPanel contentPane = new JPanel(new GridLayout(-1, 1));
JButton startButton = new JButton("Start");
startButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
observer.didStartGame(MenuPane.this);
}
});
contentPane.add(startButton);
add(contentPane);
}
}
public class GamePane extends JPanel {
public interface Observer {
public void gameDidEnd(GamePane source, int score);
}
public GamePane(Observer observer) {
setLayout(new GridBagLayout());
add(new JLabel("All your game is belong to us"));
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
}
JTabbedPane
也是允许用户在不同视图之间切换的好方法,请参阅 How to Use Tabbed Panes 了解更多详细信息
我正在制作应用程序或 (something.exe)。我想制作一个 class 作为我的主框架。那是因为我不想为我将制作的每个 class 创建新框架。我希望我的 class MainMenu
具有 MainFrame
的框架,我可以在其中放置按钮等
package ThinkNotOfficial;
public class Main {
public static void main(String[] args) {
MainFrame mainFrame = new MainFrame();
}
}
package ThinkNotOfficial;
import javax.swing.*;
import java.awt.*;
public class MainFrame extends JFrame{
// Global Variables
JFrame mainFrame = new JFrame("Base Frame (global)");
ImageIcon logo = new ImageIcon("Logo.png");
MainFrame (){
mainFrame.setSize(500, 500);
mainFrame.setResizable(false);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setIconImage(logo.getImage());
mainFrame.getContentPane().setBackground(new Color(255,255,255));
mainFrame.setLocationRelativeTo(null);
mainFrame.setLayout(null);
mainFrame.setVisible(true);
// ------------ PROGRAM FIELD -----------
}
}
package ThinkNotOfficial;
import javax.swing.*;
public class MainMenu{
// ------------ Global Variables ------------
JButton play = new JButton("PLAY");
MainMenu(){
// ------------ PLAY button ------------
play.setSize(100,50);
// ------------ Adding parts ------------
}
}
利用
- 模型-视图-控制器
- 依赖注入(即Passing Information to a Method or a Constructor)
- 观察者模式
您还可以利用CardLayout
来帮助方便不同视图之间的切换,例如
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.add(new MainPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class MainPane extends JPanel {
private CardLayout cardLayout;
private MenuPane menuPane;
private GamePane gamePane;
public MainPane() {
cardLayout = new CardLayout();
setLayout(cardLayout);
menuPane = new MenuPane(new MenuPane.Observer() {
@Override
public void didStartGame(MenuPane source) {
cardLayout.show(MainPane.this, "game");
}
});
gamePane = new GamePane(new GamePane.Observer() {
@Override
public void gameDidEnd(GamePane source, int score) {
cardLayout.show(MainPane.this, "menu");
}
});
add(menuPane, "menu");
add(gamePane, "game");
}
}
public class MenuPane extends JPanel {
public interface Observer {
public void didStartGame(MenuPane source);
}
public MenuPane(Observer observer) {
setLayout(new GridBagLayout());
JPanel contentPane = new JPanel(new GridLayout(-1, 1));
JButton startButton = new JButton("Start");
startButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
observer.didStartGame(MenuPane.this);
}
});
contentPane.add(startButton);
add(contentPane);
}
}
public class GamePane extends JPanel {
public interface Observer {
public void gameDidEnd(GamePane source, int score);
}
public GamePane(Observer observer) {
setLayout(new GridBagLayout());
add(new JLabel("All your game is belong to us"));
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
}
JTabbedPane
也是允许用户在不同视图之间切换的好方法,请参阅 How to Use Tabbed Panes 了解更多详细信息