#java #union
#java #объединение
Вопрос:
Я очень новичок Java
, и я был бы признателен за вашу помощь в теме, которую я пытаюсь решить. Я хотел бы запрограммировать небольшую Java
программу, которая может:
- чтение данных (таблиц)
union
их по строкам- отображать их во фрейме
- загрузите файл
Я дошел до того, что не уверен, действительно ли написанный мной код действительно продуктивен, и я застрял при отображении данных. Я подготовил небольшой пример двух файлов данных:
Автомобиль
Row Description Type Example
1 Name String XX
2 Year int 2021
3 Value double 0.37
4 Area double 2.84
5 Weight double 1000
6 Tyre String 210/10 R1
двигатель
Row Description Type Example
1 A String XY
2 B double 230
3 C int 1000
4 D int 3400
5 E int 1000
Вы можете найти мой Java
код, который на данный момент способен открывать диалоговое окно, выбирать файл JFileChooser
, отображать путь и считывать данные (1). Я застрял с отображением union
двух таблиц и загрузкой файла. Спасибо за любую помощь!
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.io.File;
import javax.swing.*;
import java.nio.file.Paths;
import java.util.Comparator;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.nio.file.Files;
import java.nio.file.Path;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.List;
@SuppressWarnings("serial")
public class JFileChooserExample extends JPanel {
// use a list model and JList that works *directly* with Files
private DefaultListModel<File> fileListModel = new DefaultListModel<>();
private JList<File> fileJList = new JList<>(fileListModel);
List<String> kfz_list = new ArrayList<>();
List<String> motor_list = new ArrayList<>();
static Path filePath;
static Path filePath2;
static Path car;
static Path motor;
public JFileChooserExample() {
JPanel buttonPanel = new JPanel();
buttonPanel.add(new JButton(new SelectFilesAction("Select Files", KeyEvent.VK_S)));
// help set the width and height of the JList
fileJList.setVisibleRowCount(10);
fileJList.setPrototypeCellValue(new File("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"));
JScrollPane scrollPane = new JScrollPane(fileJList);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
setLayout(new BorderLayout(3, 3));
add(buttonPanel, BorderLayout.PAGE_START);
add(scrollPane, BorderLayout.CENTER);
}
private class SelectFilesAction extends AbstractAction {
public SelectFilesAction(String name, int mnemonic) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser fc = new JFileChooser();
fc.setMultiSelectionEnabled(true);
fc.setCurrentDirectory(new File(System.getProperty("user.home")));
int result = fc.showOpenDialog(JFileChooserExample.this);
if(result == JFileChooser.APPROVE_OPTION) {
fileListModel.clear(); // clear the model of prior files
File[] files = fc.getSelectedFiles();
for (File file : files) {
// add all files to the model
boolean matches = Pattern.matches(".*car*.", file.getPath());
boolean matches2 = Pattern.matches(".*motor*.", file.getPath());
if(matches) {
car = file.toPath();
}
if(matches2) {
motor = file.toPath();
}
System.out.println("car path");
System.out.println(car);
System.out.println("motor path");
System.out.println(motor);
Charset charset = StandardCharsets.UTF_8;
// car read ans instantiate
try (BufferedReader bufferedReader = Files.newBufferedReader(car, charset)) {
String line;
while ((line = bufferedReader.readLine()) != null) {
// System.out.println(line);
kfz_list.add(line);
}
} catch (IOException ex) {
System.out.format("I/O error: %s%n", ex);
}
Kfz kfz1 = new Kfz();
//kfz1.Kfz("A", 2015, 23.5, 2.3, "B", 12.0);
kfz1.Kfz(kfz_list.get(0), Integer.parseInt(kfz_list.get(1)), Double.parseDouble(kfz_list.get(2)), Double.parseDouble(kfz_list.get(3)), Double.parseDouble(kfz_list.get(4)), kfz_list.get(5));
System.out.println("checking kfz1");
System.out.println(kfz1.getName() " " kfz1.getBaujahr());
// motor read and instantiate
try (BufferedReader bufferedReader2 = Files.newBufferedReader(motor, charset)) {
String line2;
while ((line2 = bufferedReader2.readLine()) != null) {
// System.out.println(line2);
motor_list.add(line2);
}
} catch (IOException ex) {
System.out.format("I/O error: %s%n", ex);
}
Motor motor1 = new Motor();
motor1.Motor(motor_list.get(0), Double.parseDouble(motor_list.get(1)), Integer.parseInt(motor_list.get(2)), Integer.parseInt(motor_list.get(3)), Integer.parseInt(motor_list.get(4)));
System.out.println("checking motor1");
System.out.println("Bezeichnung: " motor1.getBezeichnung() " " "Max_drehmoment: " motor1.getMax_drehmoment());
// end
fileListModel.addElement(file);
}
}
}
}
private static void createAndShowGui() {
JFileChooserExample mainPanel = new JFileChooserExample();
JFrame frame = new JFrame("JFileChooser Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
Комментарии:
1. У вас должно быть достаточно опыта, чтобы знать, что вы должны задать только один вопрос. Вы задаете несколько вопросов.
2. Спасибо за совет! Мой предыдущий опыт показывает, что очень хорошо документирует вопрос и проясняет проблему. я хотел собрать воедино все проблемы в этой небольшой программе, которую я хотел бы иметь … Но вы правы, я мог бы разделить этот вопрос…
3. Ваш вопрос связан с несколькими проблемами. Сначала вам нужно создать несколько JTables, в которых перечислены данные в строках и столбцах, а затем от вашего выбора зависит, какая строка и какой столбец выбраны, прежде чем можно будет выполнить какую-либо дальнейшую обработку. Много работы.
4. JTable обычно основывается на AbstractTableModel, и эта модель позволяет вам выбирать элемент из определенной строки в определенном столбце. Использование JTable таково: таблица JTable = новая JTable(myAbstractTableModel).
5. Единственный код, который вы опубликовали в своем вопросе, — это то, как вы читаете два текстовых файла, которые были выбраны пользователем с помощью
JFileChooser
. Насколько я понимаю, вы в основном хотите, чтобы кто-то предоставил вам код для всего вашего приложения. Поскольку вы не описали, как вы хотите отобразить данные из двух файлов в aJTable
, я бы сказал, что невозможно предоставить код, потому что вы не полностью описали требования. Я думаю, что этот вопрос следует закрыть, но поскольку вы создали награду, SO предотвращает ее закрытие.
Ответ №1:
При работе с программами с графическим интерфейсом я предлагаю следовать парадигме MVC, где все компоненты GUI расположены в классе Gui. Класс контроллера принимает вызовы GUI и сохраняет их в моделях и обновляет вызовы GUI из моделей.
Для вашего удобства используйте NetBeans IDE, в которую встроен Visual GUI builder
Я намеренно опускаю примеры исходного кода, потому что, как вы можете видеть, вам понадобится довольно много примеров из следующих разделов:
GUI Класс расширяется от javax.swing.JFrame
Контроллер будет реализовывать все прослушиватели, такие как ActionListener, MouseListener, KeyListener, и инициализирует все модели. Будет синхронизироваться с графическим интерфейсом для модели
Модели Одной из моделей является TableModel Чтобы создать пользовательскую TableModel, просто расширьте свой класс из AbstractTableModel, а методы переопределения используют 2-мерный массив для хранения табличных данных.
Загрузить файл Чтобы загрузить данные из модели в файл, вам нужно будет создать объект Java и реализовать сериализуемый интерфейс
Для сохранения как Java
try {
FileOutputStream fout = new FileOutputStream(file);
ObjectOutputStream out = new ObjectOutputStream(fout);
out.writeObject(cars);
out.close();
} catch (IOException ex) {
Logger.getLogger(CarCatalog.class.getName()).log(Level.SEVERE, null, ex);
}