我创建了两个相互交互的JFrame。第一个框架询问您的全名,然后在您按下一步时,会将您的名字转移到第二个框架,说“欢迎使用,无论您的姓名是什么”。但是,我遇到以下问题:
当我键入nameField并按next时,它将覆盖“ Welcome”消息。 “ Welcome”应始终保持不变,后跟您的名字,每当输入其他名称时,“ Welcome”应会明显更改。我该如何解决这个问题?
其次,有时在nameWelcome.setText中,nameWelcome出现语法错误,要求我创建该名称的新变量,但是我已经创建了新的mathApo();。该变量所在的位置。为什么我看到此错误?
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class mathMulti extends JFrame {
JButton nextButton;
TextField nameField;
JLabel fullName;
JFrame frameOne;
JPanel panelOne;
public mathMulti() {
frameStart();
}
public void frameStart() {
frameOne = new JFrame();
frameOne.setSize(500, 500);
frameOne.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panelOne = new JPanel(new GridBagLayout());
panelOne.setBackground(Color.gray);
frameOne.add(panelOne);
GridBagConstraints g = new GridBagConstraints();
fullName = new JLabel("Full Name: ");
g.insets = new Insets(-390, -195, 0, 0);
g.gridx = 0;
g.gridy = 0;
panelOne.add(fullName, g);
nameField = new TextField(30);
g.insets = new Insets(10, 10, 10, 10);
g.gridx = 1;
g.gridy = 0;
g.weightx = 0;
g.weighty = 0;
g.ipady = 6;
panelOne.add(nameField, g);
nextButton = new JButton(" NEXT " + '\u25BA');
g.insets = new Insets(60, 5, 5, 5);
g.gridx = 2;
g.gridy = 5;
g.weightx = 0;
g.weighty = 0;
nextButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new mathApo();
nameWelcome.setText(nameField.getText());
frameOne.dispose();
}
});
panelOne.add(nextButton, g);
frameOne.setVisible(true);
}
public class mathApo extends JFrame {
JFrame frameTwo;
JPanel panelTwo;
JLabel nameWelcome;
public mathApo() {
frameNext();
}
public void frameNext() {
frameTwo = new JFrame();
frameTwo.setSize(500, 500);
frameTwo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panelTwo = new JPanel(new GridBagLayout());
panelTwo.setBackground(Color.gray);
frameTwo.add(panelTwo);
nameWelcome = new JLabel("Welcome, ");
panelTwo.add(nameWelcome);
frameTwo.setVisible(true);
}
}
}
答案 0 :(得分:1)
1。)当我键入nameField并按next时,它将覆盖“ Welcome”消息。 “ Welcome”应始终保持不变,后跟您的名字,每当输入其他名称时,“ Welcome”应会明显更改。我该如何解决这个问题?
在setText
上调用JLabel
会将现有文本替换为新文本。更好的解决方案是在mathApo
中有一个方法,该方法采用名称并将其应用于自己的标签,因此调用方不需要知道文本的“格式”-这是一个经典的示例为什么不应该将组件的控制权交给其他类
2。)其次,有时在nameWelcome.setText中,nameWelcome出现语法错误,要求我创建该名称的新变量,但我已经创建了新的mathApo();。该变量所在的位置。为什么我会看到此错误?
nameWelcome
中的 ActionListener
在ActionListener
或frameStart
类中没有任何上下文(或定义的变量)。您应该使用mathApo
的实例来引用它(或者更好的是,mathApo
中的方法可以对其进行更新)
我将建议在方法上稍作更改...
而不是依赖于两个框架,您应该使用模式对话框收集所需的信息,然后将结果传递到第二个窗口,也许类似...
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
RequestInfoPane infoPane = new RequestInfoPane();
int result = JOptionPane.showOptionDialog(null, infoPane, "Name", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, null, 0);
if (result == JOptionPane.OK_OPTION) {
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
WelcomePane welcomePane = new WelcomePane();
welcomePane.setFullName(infoPane.getFullName());
frame.add();
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
});
}
public class RequestInfoPane extends JPanel {
private JLabel nameLabel;
private JTextField nameField;
public RequestInfoPane() {
setLayout(new GridBagLayout());
nameLabel = new JLabel("Full name: ");
nameField = new JTextField(20);
add(nameLabel);
add(nameField);
}
public String getFullName() {
return nameField.getText();
}
}
public class WelcomePane extends JPanel {
private JLabel nameLabel;
public WelcomePane(String fullName) {
setLayout(new GridBagLayout());
nameLabel = new JLabel("Welcome");
add(nameLabel);
}
public void setFullName(String fullName) {
nameLabel.setText("Welcome " + fullName);
}
}
}
同样,您应该考虑在这种情况下CardLayout
是否也有用-有关更多详细信息,请参见How to Use CardLayout