Nano Hash - криптовалюты, майнинг, программирование

Как отображать записи в JTable из файла arraylist .TXT в java MVC?

В настоящее время это мой главный экран: (Main Screen) У меня есть 2 файла: «patient.txt» и «лечение.txt», в котором хранятся записи о нескольких пациентах и ​​методах лечения.

Что я пытаюсь сделать, так это отображать все эти записи в красивой JTable всякий раз, когда я нажимаю «Показать лечение» или «Показать пациентов» на экране, подобном этому: введите здесь описание изображения

Я использую модель MVC для этой системы управления больницей (с файлами HMSGUIModel.java, HMSGUIView.java, HMSGUIController.java, HMSGUIInterface.java) и добавляю записи, используя следующий код:

 FileWriter tfw = new FileWriter(file.getAbsoluteFile(), true); 
                BufferedWriter tbw = new BufferedWriter(tfw);
                tbw.write(this.view.gettNumber() + "," + this.view.gettName() + "," +     this.view.gettDoctor() + "," + this.view.gettRoom());
                tbw.newLine();
                tbw.flush();
                JOptionPane.showMessageDialog(null, "Successfully added treatment!"); }

Пожалуйста, помогите, как я могу добавить читалку, чтобы отображать все записи из текстового файла в таблицу?

Спасибо заранее!!


Ответы:


1

В соответствии с вашим MVC вы можете создать TableModel, который знает, как читать данные пациента.

Однако лично я предпочел бы отделить управление данными пациента от представления, чтобы представление не заботилось о том, откуда берутся данные.

С этой целью я бы начал с создания объекта Patient и объекта Treatment, они будут хранить данные в автономном объекте, что упростит управление...

Вам нужно будет прочитать эти данные и проанализировать результаты...

List<Treatment> treatments = new ArrayList<Treatment>(25);
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
    String text = null;
    while ((text = br.readline()) != null) {
        String parts[] = text.split(",");
        Treatmeant treament = new Treatment(parts[0],
            parts[1],
            parts[2],
            parts[3]);
        treatments.add(treament);
    }
} // Handle exception as required...

Я бы обернул это в метод readTreatments в каком-нибудь служебном классе, чтобы упростить его использование...

Где-то здесь я бы подумал об использовании автономной базы данных или даже XML-документа, но это только я.

Получив это, вы можете спроектировать TableModel для его поддержки...

public class TreatmentTableModel extends AbstractTableModel {

    protected static final String[] COUMN_NAMES = {
        "Treatment-Number", 
        "Treatment-Name",
        "Doctor-in-charge",
        "Room-No",
    };
    protected static final Class[] COLUMN_CLASSES = new Class[]{
        Integer.class, 
        String.class,
        Doctor.class,
        Integer.class,
    };
    private List<Treatment> treatments;

    public TreatmentTableModel() {
        this.treatments = new ArrayList<>();
    }

    public TreatmentTableModel(List<Treatment> treatments) {
        this.treatments = new ArrayList<>(treatments);
    }

    @Override
    public int getRowCount() {
        return treatments.size();
    }

    @Override
    public int getColumnCount() {
        return 4;
    }

    @Override
    public String getColumnName(int column) {
        return COUMN_NAMES[column];
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return COLUMN_CLASSES[columnIndex];
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Treatment treatment = treatments.get(rowIndex);
        Object value = null;
        switch (columnIndex) {
            case 0:
                value = treatment.getNumber();
                break;
            case 1:
                value = treatment.getName();
                break;
            case 2:
                value = treatment.getDoctor();
                break;
            case 3:
                value = treatment.getRoomNumber();
                break;
        }
        return value;
    }

}

Затем вы просто применяете его к тому, что JTable вам нужно...

private JTable treatments;

//...
treatments = new JTable(new TreatmentTableModel());
add(new JScrollPane(treatments));

Затем, если вам нужно, вы загрузите List из Treatments и примените их к таблице...

File file = new File("...");
treatments.setModel(new TreatmentTableModel(TreatmentUtilities.readTreatments(file)));
18.07.2014
  • спасибо... меня смущает то, куда добавлять каждый фрагмент кода. какую часть добавить в модель, какую в вид и какую в контроллер? 18.07.2014
  • Подумай об этом. Ваша модель должна будет предоставить представлению информацию о том, что показывать, поэтому ей необходимо предоставить некоторые средства, с помощью которых представление может получить текущие Treatment List. Контроллер знает, когда пользователь изменил представление (или хочет изменить представление), поэтому ему необходимо сообщить модели, когда загружать новые данные ИЛИ загрузить новые данные и передать эту информацию модели. Затем модель вызовет обновление, которое предупредит представление о перезагрузке модели JTable с новыми значениями, которые были загружены. 18.07.2014
  • я не понимаю! уже так много кода, что я все путаю :( 18.07.2014
  • Без более глубокого понимания вашего избыточного кода сложно давать рекомендации. Если вы собираетесь заменить текущее представление на JTable, вам необходимо предоставить некоторые средства, с помощью которых это представление может генерировать (дочернюю) табличную модель. Это предполагает, что ваша текущая модель должна предоставить некоторые средства для обеспечения List из Treatements... 18.07.2014

  • 2

    В зависимости от ваших потребностей в таблице вы можете использовать DefaultTableModel и заполнять свои данные с помощью этой модели. Недостатком этого является то, что вам могут потребоваться специальные возможности вашей таблицы, например, невозможность редактировать ячейки, хранить больше, чем строки, и т. д., и в этом случае вы можете изучить расширение AbstractTableModel и определить собственное поведение для модели. .

    Проще всего было бы начать с модели по умолчанию и расширить ее.

    String[] myColumns = {"Treatment-Number","Treatment-Name", "Doctor-in-charge", "Room-No"};
    // init a model with no data and the specified column names
    DefaultTableModel myModel = new DefaultTableModel(new Object[myList.size()][4](), myColumns);
    
    // assuming you have a list of lists...
    int i = 0;
    int j = 0;
    for (ArrayList<Object> list : myList) {
        for ( Object o : list ) {
            myModel.setValueAt(o, i, j);  // set the value at cell i,j to o
            j++;
        }
        i++;
    } 
    
    JTable myTable = new JTable(myModel);  // make a new table with the specified data model
    // ... do other stuff with the table
    

    Если вы хотите получить доступ к данным таблицы, вы используете myTable.getModel() и обновляете данные. Это автоматически обновит представление таблицы (завершив соединение MVC)

    Подробнее об использовании таблиц см. здесь.

    18.07.2014
  • Модель таблицы является вашей моделью. Представление — это JTable, и контроллер будет там, где вы добавите этот код (или код, в котором ваш класс представления создаст модель таблицы). Это действительно будет зависеть от того, как вы разбили свой код, но класс, который создает и обновляет ваши элементы пользовательского интерфейса, будет там, где вы, вероятно, поместите методы создания и обновления для передачи/получения данных в таблицу, и ваш контроллер для обработка событий от пользователя и обновление модели таблицы. 18.07.2014
  • я все еще не понимаю! уже так много кода, что я все путаю :( 18.07.2014
  • Похоже, вы недостаточно хорошо разбираетесь в MVC, чтобы применить какой-либо совет по этой проблеме, не запутавшись. Попробуйте взглянуть на это руководство и посмотрите, прояснит ли это что-нибудь. для вас. Не видя вашего кода, трудно помочь дальше... 18.07.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..