gpt4 book ai didi

java - 在打开另一个 JFrame 之前关闭一个 JFrame

转载 作者:行者123 更新时间:2023-11-29 03:22:37 25 4
gpt4 key购买 nike

我想在打开另一个 .

考虑代码:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.InetAddress;
import javax.swing.*;
import javax.swing.border.EmptyBorder;


/**
*
* @author X
*
*/
class ServerConnect extends JFrame implements ActionListener
{
private static final long serialVersionUID = 1L;
private JTextField m_serverIP;
private JTextField m_serverPort; // you can use also JPasswordField
private JButton m_submitButton;

// location of the jframe
private final int m_centerX = 500;
private final int m_centerY = 300;

// dimensions of the jframe
private final int m_sizeX = 1650;
private final int m_sizeY = 150;


/**
* Ctor
*/
ServerConnect()
{
this.setTitle("Sever Side Listener");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
m_serverIP = new JTextField(20);
m_serverPort = new JTextField(20);

JPanel gui = new JPanel(new BorderLayout(3,3));
gui.setBorder(new EmptyBorder(5,5,5,5));
gui.setSize(m_sizeX , m_sizeY);
this.setContentPane(gui);

JPanel labels = new JPanel(new GridLayout(0,1));
JPanel controls = new JPanel(new GridLayout(0,1));
gui.add(labels, BorderLayout.WEST);
gui.add(controls, BorderLayout.CENTER);

labels.add(new JLabel("Server IP: "));
controls.add(m_serverIP);
labels.add(new JLabel("Server Port: "));
controls.add(m_serverPort);
m_submitButton = new JButton("Start Listening");
m_submitButton.addActionListener(this);

gui.add(m_submitButton, BorderLayout.SOUTH);
this.setLocation(m_centerX , m_centerY);
this.setSize(m_sizeX , m_sizeY);
this.pack();
this.setVisible(true);
}

public static void main(String[] args) {
new ServerConnect();
}

@Override
public void actionPerformed(ActionEvent event) {

Object object = event.getSource();
if (object == this.m_submitButton)
{
// grab all values from the connection box
// if one of them is missing then display an alert message

String ip = this.m_serverIP.getText().trim();
String port = this.m_serverPort.getText().trim();

if (ip.length() == 0)
{
JOptionPane.showMessageDialog(null, "Please enter IP address !");
return;
}

if (port.length() == 0)
{
JOptionPane.showMessageDialog(null, "Please enter Port number!");
return;
}

int s_port = 0;

try
{
// try parse the Port number
// throws exception when an incorrect IP address
// is entered , and caught in the catch block
s_port = Integer.parseInt(port);
}

catch(Exception exp)
{
JOptionPane.showMessageDialog(null, "Port number is incorrect!");
return;
}

try
{
// try parse the IP address
// throws exception when an incorrect IP address
// is entered , and caught in the catch block
InetAddress.getByName(ip);
}

catch(Exception exp)
{
JOptionPane.showMessageDialog(null, "IP address is incorrect!");
return;
}
this.setVisible(false);
new ServerGUI(ip , s_port);
}
}
}

在用户输入 IP 号和端口后,在 actionPerformed() 中,我将窗口设置为 false,即:

        this.setVisible(false);      // don't show the current window
new ServerGUI(ip , s_port); // open another JFrame

我想完全关闭当前的 JFrame,而不是将其可见性设置为 false。

我该怎么做?

问候

最佳答案

您的问题似乎是,如果您在 JFrame 上调用 close,程序将退出,因为您已将其 setDefaultCloseOperation 设置为 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

选项:

  • 使用不同的 defaultCloseOperation,它不会关闭应用程序,可能是 JFrame.DISPOSE_ON_CLOSE
  • 最初使用 JDialog 而不是 JFrame。这些类型的窗口不能关闭应用程序。这是 JDialog and JOptionPane Tutorial
  • 根本不交换 JFrame,而是使用 CardLayout 交换 View The CardLayout Tutorial link

我自己的偏好是尽可能多地使用 CardLayout 以避免烦扰通常不喜欢向他扔一堆窗口的用户。当我想以模态方式从用户那里获取信息时,我也使用模态 JDialogs,即在用户提供请求的信息之前应用程序绝对不能前进,以及非模态对话框为用户呈现程序状态监视信息.我几乎从不在单个应用程序中使用多个 JFrame。


编辑
顺便说一句,我几乎从不创建扩展 JFrame 或任何顶级窗口的类,因为我发现它们限制太多。相反,我的大多数 GUI 类型类都适合创建 JPanel。这样做的好处是我可以决定何时何地放置 JPanel,并且可以随时改变主意。它可以进入 JFrame、JDialog、JOptionPane,成为在 CardLayout 中交换的卡片,...任何地方。


编辑2

例如,这里有一个使用您的代码的小程序,稍作修改,并将其放入 JDialog 中:

我的代码:

import java.awt.Dialog.ModalityType;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.*;

public class MyServerMain extends JPanel {
private JTextField serverIp = new JTextField(8);
private JTextField serverPort = new JTextField(8);
private ServerConnect serverConnect = new ServerConnect();
private JDialog serverConnectDialog = null;

public MyServerMain() {
serverIp.setFocusable(false);
serverPort.setFocusable(false);

add(new JLabel("Server IP:"));
add(serverIp);
add(new JLabel("Server Port:"));
add(serverPort);
add(new JButton(new SetUpServerAction("Set Up Server", KeyEvent.VK_S)));
}

private class SetUpServerAction extends AbstractAction {
public SetUpServerAction(String name, int keyCode) {
super(name);
putValue(MNEMONIC_KEY, keyCode);
}

@Override
public void actionPerformed(ActionEvent evt) {
if (serverConnectDialog == null) {
Window owner = SwingUtilities.getWindowAncestor(MyServerMain.this);
serverConnectDialog = new JDialog(owner, "Server Set Up",
ModalityType.APPLICATION_MODAL);

serverConnectDialog.getContentPane().add(serverConnect);
serverConnectDialog.pack();
serverConnectDialog.setLocationRelativeTo(owner);
}
serverConnectDialog.setVisible(true);

// when here, the dialog is no longer visible
// so extract information from the serverConnect object
serverIp.setText(serverConnect.getServerIp());
serverPort.setText(serverConnect.getServerPort());
}
}

private static void createAndShowGui() {
MyServerMain mainPanel = new MyServerMain();

JFrame frame = new JFrame("My Server Main");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}

您修改后的代码:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.InetAddress;

import javax.swing.*;
import javax.swing.border.EmptyBorder;

class ServerConnect extends JPanel implements ActionListener {
private static final long serialVersionUID = 1L;
private JTextField m_serverIP;
private JTextField m_serverPort; // you can use also JPasswordField
private JButton m_submitButton;

// location of the jframe
private final int m_centerX = 500;
private final int m_centerY = 300;

// dimensions of the jframe
private final int m_sizeX = 1650;
private final int m_sizeY = 150;

ServerConnect() {
m_serverIP = new JTextField(20);
m_serverPort = new JTextField(20);

JPanel gui = new JPanel(new BorderLayout(3, 3));
gui.setBorder(new EmptyBorder(5, 5, 5, 5));
gui.setSize(m_sizeX, m_sizeY);
setLayout(new BorderLayout()); // !!
add(gui, BorderLayout.CENTER);

JPanel labels = new JPanel(new GridLayout(0, 1));
JPanel controls = new JPanel(new GridLayout(0, 1));
gui.add(labels, BorderLayout.WEST);
gui.add(controls, BorderLayout.CENTER);

labels.add(new JLabel("Server IP: "));
controls.add(m_serverIP);
labels.add(new JLabel("Server Port: "));
controls.add(m_serverPort);
m_submitButton = new JButton("Start Listening");
m_submitButton.addActionListener(this);

gui.add(m_submitButton, BorderLayout.SOUTH);
this.setLocation(m_centerX, m_centerY);
this.setSize(m_sizeX, m_sizeY);
// !! this.pack();
// !! this.setVisible(true);
}

public static void main(String[] args) {
new ServerConnect();
}

@Override
public void actionPerformed(ActionEvent event) {

Object object = event.getSource();
if (object == this.m_submitButton) {
// grab all values from the connection box
// if one of them is missing then display an alert message

String ip = this.m_serverIP.getText().trim();
String port = this.m_serverPort.getText().trim();

if (ip.length() == 0) {
JOptionPane.showMessageDialog(null, "Please enter IP address !");
return;
}

if (port.length() == 0) {
JOptionPane.showMessageDialog(null, "Please enter Port number!");
return;
}

int s_port = 0;

try {
// try parse the Port number
// throws exception when an incorrect IP address
// is entered , and caught in the catch block
s_port = Integer.parseInt(port);
}

catch (Exception exp) {
JOptionPane.showMessageDialog(null, "Port number is incorrect!");
return;
}

try {
// try parse the IP address
// throws exception when an incorrect IP address
// is entered , and caught in the catch block
InetAddress.getByName(ip);
}

catch (Exception exp) {
JOptionPane.showMessageDialog(null, "IP address is incorrect!");
return;
}

// !! this.setVisible(false);
// !! new ServerGUI(ip , s_port);
// !!
Window ownerWindow = SwingUtilities.getWindowAncestor(this);
ownerWindow.dispose();
}
}

// !!
public String getServerIp() {
return m_serverIP.getText();
}

// !!
public String getServerPort() {
return m_serverPort.getText();
}
}

关于java - 在打开另一个 JFrame 之前关闭一个 JFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22744326/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com