Кнопка javafx для чтения строк из текста в текстовые поля - PullRequest
0 голосов
/ 12 октября 2019

Я создаю объект файла, который используется в функциях открытия и закрытия. Сейчас я указываю на конкретное место и использую фиксированное имя. Файл заполняется строками данных. Кнопка находится на панели, у меня есть функция openContact, которая должна построчно читать текстовый файл и отправлять результат в метод setText текстового поля, и эта функция вызывается при нажатии на кнопку. В редакторе нет синтаксических ошибок, но нажатие кнопки не заполняет поля в графическом интерфейсе. Кроме этого, я не уверен, какой вопрос задавать или что искать. Я прилагаю свой код как есть. Будем благодарны за любые намеки или указания относительно соответствующих вопросов или мыслительного процесса.

package programmingassignment1;

import java.awt.Image;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TextArea;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.*;
//import javafx.scene.layout.StackPane;
//import javafx.scene.layout.HBox;
import javafx.stage.Stage;

import java.io.*; //input/output
import java.util.Scanner;
//import java.util.*; //scanner, user input
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.image.ImageView;
import javafx.scene.shape.Rectangle;
import javafx.stage.FileChooser;
import javafx.stage.FileChooser.ExtensionFilter;

public class Address extends Application {
    String contactFirst,
           contactLast,
           spouseFirst,
           spouseLast,
           street,
           city,
           state,
           zip;
    TextField tf_contactFirst = new TextField();
    TextField tf_contactLast = new TextField();
    TextField tf_spouseFirst = new TextField();
    TextField tf_spouseLast = new TextField(); 
    TextField tf_street = new TextField();
    TextField tf_city = new TextField();
    TextField tf_state = new TextField();
    TextField tf_zip = new TextField();
    TextArea ta_notes = new TextArea();

    ExtensionFilter jpgExtension = new ExtensionFilter("JPG", "*.jpg");
    ExtensionFilter pngExtension = new ExtensionFilter("PNG", "*.png");
    ExtensionFilter allExtension = new ExtensionFilter("ALL", "*.*");
    Rectangle imageBox = new Rectangle(10, 0, 10, 20);
    FileChooser fc = new FileChooser();
    @Override
    public void start(Stage primaryStage){
        //modify text area and register actions
        ta_notes.setWrapText(true);
        ta_notes.setEditable(true);
        ta_notes.setPrefColumnCount(12);
        ta_notes.setPrefRowCount(3);

//Setting an action for the Clear button       
        Button bt_cancel = new Button("Cancel");
        bt_cancel.setOnAction(e -> {
            tf_contactFirst.clear();
            tf_contactLast.clear();
            tf_spouseFirst.clear();
            tf_spouseLast.clear();
            tf_street.clear();
            tf_city.clear();
            tf_state.clear();
            tf_zip.clear();

            ta_notes.setText(null);
    });

//Setting an action for the Open Contact  button       
        Button bt_openContact = new Button("Open Contact");
        File file = new File("AddressBook.txt");
        bt_openContact.setOnAction(e -> {
            new EventHandler<ActionEvent>(){
                @Override
                public void handle(ActionEvent e){
                    try{openContact(file);}
                    catch(Exception f){f.getMessage();}
                }
            };
        });
//Setting an action for the Save button        
        Button bt_save = new Button("Save");

        bt_save.setOnAction(
            new EventHandler<ActionEvent>(){
                @Override
                public void handle(ActionEvent e){
                    try{saveContact(file);}
                    catch(Exception f){f.getMessage();}
        }});

        RadioButton rb_male = new RadioButton("Male");
        RadioButton rb_female = new RadioButton("Female");

        ToggleGroup tgrp = new ToggleGroup();
        rb_male.setToggleGroup(tgrp);
        rb_female.setToggleGroup(tgrp);

        rb_male.setOnAction(e -> {
            if(rb_male.isSelected()){int maleContact = 1;}
        });
        rb_female.setOnAction(e -> {
            if(rb_female.isSelected()){int maleContact = 0;}
        });

        //create combo box and add items as an observable list
        String[] x = {"Home Address", "Work Address"};
        ComboBox cbo = new ComboBox(FXCollections.observableArrayList(x));
        //cbo.setEditable(false);
        cbo.setValue("Home Address");

//        cbo.setOnAction(e -> {/**____________***/;});
        //set imageBox rectangle action
        //click in it, choose image, file, its displayed?
        //fc is an import or not?
        //setOnMouseClicked should work for any node or scene, why not this rect
        /*imageBox.setOnMouseClicked((MouseEvent e) -> {
            fc.setTitle("Open Image File");
            fc.setInitialDirectory(new File("."));
            fc.getExtensionFilters().addAll(jpgExtension, pngExtension, allExtension);
            fc.setSelectedExtensionFilter(jpgExtension);

            File picture = fc.showOpenDialog(primaryStage);
            if (picture != null){
                rootPane.getChildren().remove(imageBox);
                contact.setImageFile(picture.getName());

                Image userImage = new Image(picture.getName());
                ImageView userView = new ImageView(userImage);

                rootPane.getChildren().add(userView);
            }
        });*/
        GridPane rootPane = new GridPane();        

        rootPane.add(new Label("First Name"), 1, 1);
        rootPane.add(tf_contactFirst, 1, 2);
        rootPane.add(new Label("Last Name"), 2, 1);
        rootPane.add(tf_contactLast, 2, 2);
        rootPane.add(new Label("Sex"), 3, 1);
        rootPane.add(rb_female, 3, 2);
        rootPane.add(rb_male, 3, 3);       
        rootPane.add(new Label("Spouse's First Name"), 1, 4);
        rootPane.add(tf_spouseFirst, 1, 5);
        rootPane.add(new Label("Spouse's Last Name"), 2, 4);
        rootPane.add(tf_spouseLast, 2, 5);
        rootPane.add(cbo, 1, 6);
        rootPane.add(new Label("Address Street"), 1, 7);
        rootPane.add(tf_street, 1, 8);
        rootPane.add(new Label("City"), 1, 9);
        rootPane.add(tf_city, 1, 10);
        rootPane.add(new Label("State"), 2, 9);
        rootPane.add(tf_state, 2, 10);
        rootPane.add(new Label("Zip Code"), 3, 9);
        rootPane.add(tf_zip, 3, 10);
        rootPane.add(imageBox, 4, 1 );

        //Label label = new Label();
        rootPane.add(new Label("Notes"), 1, 11);
        rootPane.add(ta_notes, 1, 12);

        rootPane.add(bt_cancel, 2, 13);
        rootPane.add(bt_save, 3, 13);
        rootPane.add(bt_openContact, 1, 13);

        //scene = window (isn't it just easier if someon mentions that?)
        Scene scene = new Scene(rootPane, 1000, 500);

        primaryStage.setTitle("Address Book");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    public static void main(String[] args) {
            launch(args);
    }
    public void saveContact(File file) throws FileNotFoundException, Exception{ //declaration
                //this code might cause a FileNotFoundException
                //if it does it creates an exception object of the above type
        try{
                    //PrintWriter output = new PrintWriter (file);
                    PrintStream output = new PrintStream(file);
                    output.println(tf_contactFirst.getText());
                    output.println(tf_contactLast.getText());
                    output.println(tf_spouseFirst.getText());
                    output.println(tf_spouseLast.getText());
                    output.println(tf_street.getText());
                    output.println(tf_city.getText());
                    output.println(tf_state.getText());
                    output.println(tf_zip.getText());
                    output.close();
                }
                //what do do with exception
                //here the catch clause with create another exception
                //that is passed the result of the getMessage() method from the original exception
        catch(FileNotFoundException e){
                    throw new Exception(e.getMessage());
                }
    }

//read same text file you save too
    public void openContact (File file) throws FileNotFoundException, Exception{
        try{
            Scanner read = new Scanner(file);     
            while(read.hasNextLine()){
                //how is a blank field recognized, how are two or three
                //consecutive tokens handled
                //how do I save the imageFileName
                 tf_contactFirst.setText(read.nextLine());
                 tf_contactLast.setText(read.nextLine());
                 //tf_contactGender.setText(read.nextLine());
                 tf_spouseFirst.setText(read.nextLine());
                 tf_spouseLast.setText(read.nextLine());
                 //tf_spouse_gender.setText(read.nextLine());
                 tf_street.setText(read.nextLine());
                 tf_city.setText(read.nextLine());
                 tf_state.setText(read.nextLine());
                 tf_zip.setText(read.nextLine());
                 //ta_notes.setText(read.nextLine());
            }
        }
        catch(FileNotFoundException e){
                    throw new Exception(e.getMessage());
        }
    }
}

Ответы [ 2 ]

1 голос
/ 12 октября 2019

Есть несколько проблем с вашим кодом, которые вызывают проблему.

Прежде всего, лямбда-выражение в вашем методе setOnAction() для bt_openContact неверно. Метод openContact() на самом деле никогда не вызывается.

Это можно исправить, передав непосредственно новый EventHandler:

    bt_openContact.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            try {
                openContact(file);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

или используя правильно отформатированный оператор lamda:

    bt_openContact.setOnAction(event -> {
        try {
            openContact(file);
        } catch (Exception e) {
            e.printStackTrace();
        }
    });

Похоже, вы пытались сделать оба. :)


Обратите внимание также на блок catch. Ваш код просто вызывает f.getMessage(), который возвращает String. Но вы на самом деле не делаете ничего с этим String, поэтому, даже если есть ошибки, вы их не увидите.

Вместо этого вы должны вызвать f.printStackTrace(), чтобы фактически напечататьлюбые исключения для консоли.

Не связано Примечание: Пожалуйста, ознакомьтесь с Соглашениями об именах Java и придерживайтесь их.

0 голосов
/ 15 октября 2019

Ответ Зефира совершенно верен.

Чтобы ответить на ваш вопрос относительно подсказок и указаний:

  1. всегда, если возможно, подумайте: «Почему это здесь? причина для этого? нужно ли мне это? "- это, мы надеемся, предотвратит мертвый код, такой как:" catch (Exception f) {f.getMessage ();} "

  2. научитьсяиспользуйте отладчики.

  3. Похоже, вы пытаетесь понять, как работает язык программирования, и, возможно, у вас уже есть некоторый опыт работы с другими языками программирования. Всякий раз, когда вы пытаетесь это сделать, рекомендуется следовать учебным курсам, например, доступным по адресу https://docs.oracle.com/javase/tutorial/

Это особенно важно, поскольку чем больше у вас опыта работы с разными языками программирования, тем больше начинаетсявыглядеть одинаково, когда на самом деле они совершенно разные. Если вы потратите 3 часа на простые уроки, подобные этим, вы сэкономите дни разочарования, пытаясь понять, что, черт возьми, происходит.

По какой-то причине мне это кажется, будто кто-то пытается написать код прямо в блокноте или какой-либо программе для редактирования текста. Не . Используйте IDE (netbeans, eclipse и т. Д.). Они поставляются с инструментами форматирования и отладчиками, которые позволят вам найти простые проблемы, такие как эти, за меньшее время, чем мне понадобилось, чтобы написать этот ответ.
...