[英]JTextField not read the Input by user
Here I have a question which is If I pre-set JTextField
value to "test" that when I clicked the button that can return "test". 在这里,我有一个问题是,如果我将JTextField
值预设为“测试”,那么当我单击可以返回“测试”的按钮时。
But when I changed the value (By user input) such as "BUG", then clicked the button again, it returns "test" also. 但是,当我更改了“ BUG”之类的值(通过用户输入),然后再次单击该按钮时,它也返回了“ test”。
The code set PortTextField.setText("9999");
代码设置为PortTextField.setText("9999");
And then I tried to input 8888
on this field, then click the button, it print 9999
by getText
from PortTextField
The JTextField
value seems doesn't update 然后我尝试在此字段上输入8888
,然后单击按钮,它由PortTextField
的getText
打印9999
JTextField
值似乎没有更新
Server.java: (Part of Code) Server.java :(部分代码)
public boolean PortisInteger(String value) {
try {
this.portNumber = Integer.parseInt(value);
return true;
} catch(NumberFormatException ex) {
System.out.println(ex);
return false;
}
}
@Override
public void actionPerformed(ActionEvent e) {
Object scr = e.getActionCommand();
if (scr.equals("Start") && (serverSocket == null || serverSocket.isClosed())) {
// new JFrame().StartServerToggleButton.setEnabled(false);
if(PortisInteger(**new JFrame().getPortTextField()**)) {
if(ServerStart(portNumber)) {
new JFrame().setIPLabel("IP: " + serverSocket.getInetAddress().getHostName());
}
}
}
JFrame.java: JFrame.java:
package Server;
public class JFrame extends javax.swing.JFrame {
public JFrame() {
initComponents();
Server svr = new Server();
StartServerToggleButton.addActionListener(svr);
CloseServerToggleButton.addActionListener(svr);
}
public void setIPLabel(String IPString) {
IPLabel.setText(IPString);
}
**public String getPortTextField() {
return PortTextField.getText().trim();
}**
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
PortTextField = new javax.swing.JTextField();
PortLabel = new javax.swing.JLabel();
jScrollPane1 = new javax.swing.JScrollPane();
MessageTextArea = new javax.swing.JTextArea();
StartServerToggleButton = new javax.swing.JToggleButton();
CloseServerToggleButton = new javax.swing.JToggleButton();
IPLabel = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Chatroom-Server");
PortTextField.setFont(new java.awt.Font("Harlow Solid Italic", 0, 18)); // NOI18N
PortTextField.setText("9999");
PortLabel.setFont(new java.awt.Font("Harlow Solid Italic", 0, 18)); // NOI18N
PortLabel.setText("Port:");
MessageTextArea.setEditable(false);
MessageTextArea.setColumns(20);
MessageTextArea.setFont(new java.awt.Font("Harlow Solid Italic", 0, 18)); // NOI18N
MessageTextArea.setRows(5);
jScrollPane1.setViewportView(MessageTextArea);
StartServerToggleButton.setFont(new java.awt.Font("Harlow Solid Italic", 0, 18)); // NOI18N
StartServerToggleButton.setText("Start");
CloseServerToggleButton.setFont(new java.awt.Font("Harlow Solid Italic", 0, 18)); // NOI18N
CloseServerToggleButton.setText("Close");
IPLabel.setFont(new java.awt.Font("Harlow Solid Italic", 0, 18)); // NOI18N
IPLabel.setText("IP: 0.0.0.0");
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 459, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addComponent(IPLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(PortLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(PortTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(16, 16, 16)
.addComponent(StartServerToggleButton, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(CloseServerToggleButton, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(PortTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(StartServerToggleButton)
.addComponent(CloseServerToggleButton)
.addComponent(PortLabel)
.addComponent(IPLabel))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 250, Short.MAX_VALUE)
.addContainerGap())
);
pack();
}// </editor-fold>
public static void main(String args[]) {
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(JFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new JFrame().setVisible(true);
}
});
}
// Variables declaration - do not modify
public javax.swing.JToggleButton CloseServerToggleButton;
public javax.swing.JLabel IPLabel;
public javax.swing.JTextArea MessageTextArea;
public javax.swing.JLabel PortLabel;
public javax.swing.JTextField PortTextField;
public javax.swing.JToggleButton StartServerToggleButton;
private javax.swing.JScrollPane jScrollPane1;
// End of variables declaration
}
You are making a mistake by creating a new instance of JFrame every time you get the portTextField so it's normal to receive it's initial value. 每次获取portTextField时都会创建一个新的JFrame实例,这是一个错误,因此通常会收到它的初始值。 You have to get a reference of the running instance of your JFrame. 您必须获取JFrame的运行实例的引用。
The reason you do not get the user input is because of this code: 您没有得到用户输入的原因是由于以下代码:
if(PortisInteger(new JFrame().getPortTextField())) {
You are creating a new JFrame instance every time the above code is executed. 每次执行上述代码时,您都在创建一个新的JFrame实例。 This refers to a different instance of the JFrame and not the one which has the JTextField that contains the user input. 这是指JFrame的另一个实例,而不是具有包含用户输入的JTextField的实例。
I suggest you do the following: 我建议您执行以下操作:
Add this before your Server constructor in Server.java 在Server.java中的服务器构造函数之前添加此代码
private JFrame frame;
Add this inside your Server constructor in Server.java 添加这Server.java您的服务器里面的构造
frame = new JFrame();
Modify the actionPerformed method in Server.java to: 将Server.java中的actionPerformed方法修改为:
public void actionPerformed(ActionEvent e) {
Object scr = e.getActionCommand();
if (scr.equals("Start") && (serverSocket == null || serverSocket.isClosed())) {
// new JFrame().StartServerToggleButton.setEnabled(false);
if(PortisInteger(frame.getPortTextField())) {
if(ServerStart(portNumber)) {
frame.setIPLabel("IP: " + serverSocket.getInetAddress().getHostName());
}
}
}
Hope this helps. 希望这可以帮助。 Good luck and have fun programming! 祝您好运,编程愉快!
Cheers, 干杯,
Lofty 高远
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.