Заполнение ListView с помощью объектов в Java [duplicate]

$name = $_POST['name'];
$email = $_POST['email'];
$reciver = '/* Reciver Email address */';
if (filter_var($reciver, FILTER_VALIDATE_EMAIL)) {
    $subject = $name;
    // To send HTML mail, the Content-type header must be set.
    $headers = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
    $headers .= 'From:' . $email. "\r\n"; // Sender's Email
    //$headers .= 'Cc:' . $email. "\r\n"; // Carbon copy to Sender
    $template = '<div style="padding:50px; color:white;">Hello ,<br/>'
        . '<br/><br/>'
        . 'Name:' .$name.'<br/>'
        . 'Email:' .$email.'<br/>'
        . '<br/>'
        . '</div>';
    $sendmessage = "<div style=\"background-color:#7E7E7E; color:white;\">" . $template . "</div>";
    // Message lines should not exceed 70 characters (PHP rule), so wrap it.
    $sendmessage = wordwrap($sendmessage, 70);
    // Send mail by PHP Mail Function.
    mail($reciver, $subject, $sendmessage, $headers);
    echo "Your Query has been received, We will contact you soon.";
} else {
    echo "<span>* invalid email *</span>";
}
19
задан David Collins 15 April 2016 в 21:42
поделиться

3 ответа

Подход к решению

Для решения этой проблемы рекомендуется использовать фабрику cell .

listViewOfWords.setCellFactory(param -> new ListCell<Word>() {
    @Override
    protected void updateItem(Word item, boolean empty) {
        super.updateItem(item, empty);

        if (empty || item == null || item.getWord() == null) {
            setText(null);
        } else {
            setText(item.getWord());
        }
    }
});

Пример приложения

import javafx.application.Application;
import javafx.collections.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.stage.Stage;

public class CellFactories extends Application {    
    @Override
    public void start(Stage stage) {
        ObservableList<Word> wordsList = FXCollections.observableArrayList();
        wordsList.add(new Word("First Word", "Definition of First Word"));
        wordsList.add(new Word("Second Word", "Definition of Second Word"));
        wordsList.add(new Word("Third Word", "Definition of Third Word"));
        ListView<Word> listViewOfWords = new ListView<>(wordsList);
        listViewOfWords.setCellFactory(param -> new ListCell<Word>() {
            @Override
            protected void updateItem(Word item, boolean empty) {
                super.updateItem(item, empty);

                if (empty || item == null || item.getWord() == null) {
                    setText(null);
                } else {
                    setText(item.getWord());
                }
            }
        });
        stage.setScene(new Scene(listViewOfWords));
        stage.show();
    }

    public static class Word {
        private final String word;
        private final String definition;

        public Word(String word, String definition) {
            this.word = word;
            this.definition = definition;
        }

        public String getWord() {
            return word;
        }

        public String getDefinition() {
            return definition;
        }
    }

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

Замечания по реализации

Хотя вы можете переопределить toString в вашем классе Word, чтобы предоставить строковое представление слова, предназначенного для представления в вашем ListView, я бы рекомендовал предоставить фабрику ячеек в ListView для извлечения данных вида из объекта слова и представления его в вашем ListView. Используя этот подход, вы получаете разделение проблем, поскольку вы не привязываете графическое представление вашего объекта Word к его текстовому методу toString; поэтому toString может продолжать иметь другой вывод (например, полную информацию о полях Word с именем слова и описанием для целей отладки). Кроме того, фабрика ячеек более гибкая, так как вы можете применять различные графические узлы для создания визуального представления ваших данных за пределами прямой текстовой строки (если вы хотите это сделать).

Кроме того, в качестве стороннего , Я рекомендую сделать ваши объекты Word неизменяемыми объектами , удалив их сеттеры. Если вам действительно нужно изменить сами слова-объекты, тогда лучший способ справиться с ними - открыть видимые свойства для полей объекта. Если вы также хотите, чтобы ваш пользовательский интерфейс обновлялся по мере изменения наблюдаемых свойств ваших объектов, вам необходимо, чтобы ваши ячейки списка знали об изменениях связанных элементов, прослушивая их изменения (что довольно сложно в этом дело). Обратите внимание, что список, содержащий слова, уже наблюдается, и ListView позаботится об обработке изменений в этом списке, но если вы изменили определение слова для экземпляра в отображаемом объекте слова, тогда ваше представление списка не подберет изменения в определение без соответствующей логики слушателя на фабрике ячеек ListView.

23
ответ дан jewelsea 21 August 2018 в 03:24
поделиться
  • 1
    Большое спасибо за ваш очень подробный ответ! На данный момент я попытаюсь переопределить метод toString (), но я собираюсь сделать еще некоторое чтение на Cell Factories, чтобы лучше понять их, а затем изменить приложение, чтобы использовать их вместо этого в соответствии с вашим предложением. Я буду изменять только «определение» каждого отдельного слова с помощью этой кнопки редактирования, и просмотр списка отслеживает только свойство «word», поэтому ему не нужно отслеживать изменения в «определении». – David Collins 16 April 2016 в 14:39

То, что отображает ваш ListView на данный момент, - это toString () Word. Чтобы исправить вашу проблему, просто добавьте следующий метод в свой класс Word (это только пример):

@Override
public String toString(){
    return (this.word + " --- Definition: " + this.definition);
}
1
ответ дан Andrei-Marius Longhin 21 August 2018 в 03:24
поделиться

Я поставил бы вас в никель, что ListView вызывает метод toString () в Word. Если вы не переопределили его, он использует метод toString () по умолчанию, который просто выводит эту ... не очень полезную информацию. Переустановите его для вывода красиво отформатированной строки, и вам должно быть хорошо, чтобы идти!

1
ответ дан GaiusOctavian 21 August 2018 в 03:24
поделиться
  • 1
    Хм, это имеет смысл! Я дам этот выстрел; сейчас у меня есть класс для участия, но я попробую его позже и посмотрю, получится ли это. – David Collins 15 April 2016 в 21:53
  • 2
    Но это не очень хорошее решение: вы можете захотеть, чтобы метод toString() возвращал нечто иное, чем вы хотите отображать в пользовательском интерфейсе. – James_D 16 April 2016 в 02:10
Другие вопросы по тегам:

Похожие вопросы: