我有三个不同的类:Main、WindowFrameDimetnions 和 ValidationOfNumbers。 Main – 调用 WindowFrameDimetnions。这是主要课程 WindowFrameDimetnions – 调用(我正在尝试调用)ValidationOfNumbers。该类创建程序框架、窗格、框标签和按钮。 ValidationOfNumbers – 负责进行数字验证的所有计算。基本上,这个类验证用户输入的数字是否在 1..100,000 的范围内。
目标: 目标是通过使用 ActionListener 将 WindowFrameDimetnions 与 ValidationOfNumbers 连接起来。
package BlueBlueMainFiles;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class WindowFrameDimentions extends JFrame{
final static int WINDOW_WITH = 950;//Window with in pixel
final static int WINDOW_HEIGH = 650;//Window height in pixel
static JPanel panel;//use to reference the panel
static JLabel messageLabel;//use to reference the label
static JTextField textField;//use to reference the text field
static JButton calcButton;//use to reference the button
public WindowFrameDimentions() {
// TODO Auto-generated constructor stub
}
public static void windowFrameDimentions(){
//create a new window
JFrame window = new JFrame();
//add a name to the window
window.setTitle("BLUE BLUE");
//set the size of the window
window.setSize(WINDOW_WITH, WINDOW_HEIGH);
//specify what happens when the close button is pressed
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//BUILD THE PANEL AND ADD IT TO THE FRAME
buildPanel();
//ADD THE PANEL TO THE FRAMES CONTENT PANE
window.add(panel);
//Display the window
window.setVisible(true);
}
public static void buildPanel(){
//create a label to display instructions
messageLabel = new JLabel("Enter a Number from 1..100,000");
//create a text field of 10 characters wide
textField = new JTextField(10);
//create panel
calcButton = new JButton("Calculate");
//Add an action listening to the button. Currently, I can't make it work
//Create the a JPanel object and let the panel field reference it
panel = new JPanel();
panel.add(messageLabel);
panel.add(textField);
panel.add(calcButton);
}
}
现在这是另一个代码:
package TheValidationFiles;
public class ValidationOfNumbers {
static int MAX_NUMBER_TO_VAL = 10000000;
public static void GetValidationOfNumbers(boolean isTrue, String s) {
String[] numberArray = new String [MAX_NUMBER_TO_VAL];
boolean numberMatching = false;
for (int i = 0; i < MAX_NUMBER_TO_VAL; i++){
numberArray[i] = Integer.toString(i);
if (numberArray[i].equals(s)){
System.out.println("The number you typed " + s + " Matches with the array value of: " + numberArray[i]);
System.exit(0);
break;
}
else{
numberMatching = true;
}
}
if(numberMatching){
ValidationOfFiles.ValidationOfFiles(s);
}
}
}
你可以尝试做一个匿名的AbstractAction:
panel.add(new JButton(new AbstractAction("name of button") {
public void actionPerformed(ActionEvent e) {
//do stuff here
}
}));
希望这能起作用..尝试将包
TheValidationFiles
导入到WindowFrameDimentions
然后编写动作监听器的代码
calcButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
ValidationOfNumbers von=new ValidationOfNumbers();
von.GetValidationOfNumbers(boolean value,string);
}});
在我看来,您正在尝试实现类似 MVC 模式的目标。在这种情况下,
请注意,模型和视图不应该知道彼此的存在。他们通过控制器进行通信。
因此你的控制器(主类)应该保存视图(框架类)和模型(验证类)的引用:
//Your controller
public class MainClass{
private WindowFrameDimentions view;
private ValidationOfNumbers model;
}
现在是将视图链接到控制器的关键部分: 因为您的视图不处理逻辑和实现,因此您不需要直接在此类中编写按钮动作侦听器的实现,而是只需添加一个方法来接收 ActionListener:
//The view
public class WindowFrameDimentions{
private JButton calcButton;
private JTextField textField; //please use a better name for this
public WindowFrameDimentions(){
//Initialize all other required attributes here..
calcButton = new JButton("Calculate");
}
//The controller will create a listener and add to calcButton
public void addCalcButtonListener(ActionListener listener){
calcButton.addActionListener(listener)
}
//You need a getter for all the input fields such as your JTextFields
public String getInput(){
textField.getText();
}
}
对于您的验证类,这只是一个简单的验证方法,如下所示:
//The model
public class ValidationOfNumbers{
public ValidationOfNumbers(){
//Initialize all other required attributes here..
}
public boolean validationPassed(String input){
//your validation code goes here..
}
}
现在,将所有 3 个类链接在一起,您将获得:
//The controller
public class MainClass{
private WindowFrameDimentions view;
private ValidationOfNumbers model;
public static void main(String[] args){
view = new WindowFrameDimentions();
model = new ValidationOfNumbers();
view.addCalcButtonListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
//Now, we can use the Validation class here
if(model.validationPassed(view.getInput())){ //Linking Model to View
//If validation passes, do this
}
//Any other actions for calcButton will be coded here
}
});
}
}
这就是链接所有 3 个类的总体思路。通常,在实现 MVC 时我会使用 4 个类而不是 3 个,另外还有 1 个类来驱动代码。但在这个例子中,我使用 Controller 类来驱动代码。
另请注意,您实际上应该扩展为 JPanel 而不是 JFrame,然后将扩展类的实例添加到 JFrame。