Проблема с записью в таблицу
Друзья, у меня возникла проблема. Я считываю массив с файла и потом должен занести его в таблицу (JTable).Но вместо этого выводит нули. Как я понимаю , оно не может достать данные . Помогите разобраться.
Файл:
2 2 2
4 5 4
7 8 6
Код:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
public class LabSixSecond extends JPanel implements ActionListener {
private JFrame wnd;
private float w, q, p;
private int i;
private JButton start, stop, apply;
private JLabel nl, wl;
private JTextField ntf, wtf;
JTextArea txaSome = new JTextArea();
JTextArea txaSome1 = new JTextArea();
JTextArea txaSome2 = new JTextArea();
JTextArea txaSome3 = new JTextArea();
private DefaultTableModel tableModel;
JButton btnSome = new JButton("Load file");
final String THE_FILE = "D:\\IntelliJ IDEA Community Edition 2019.3.2\\works\\src\\Array6.txt"; // адрес к читаемому файлу
// private static List<Character> chars = new ArrayList<Character>();
int rows = 3;
int columns = 3;
int [][] myArray = new int[rows][columns];
public static void main(String[] args) {
new LabSixSecond();
}
private Object[] headers = new String[] {"x0", "x1", "x2"};
LabSixSecond(){
wnd = new JFrame("Array");
wnd.setLayout(null);
wnd.setSize(500, 500);
wnd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
wnd.setBounds(100, 50, 300, 300);
btnSome.addActionListener(new ActionListener() { //обработчик события
public void actionPerformed(ActionEvent ae) {
File file = new File(THE_FILE);
String str = "";
ArrayList<String> list = new ArrayList<String>();
//---------------------------------------------------
try{
Scanner sc = new Scanner(new BufferedReader(new FileReader("D:\\\\IntelliJ IDEA Community Edition 2019.3.2\\\\works\\\\src\\\\Array6.txt")));
while(sc.hasNextLine()) {
for (int i=0; i<myArray.length; i++) {
String[] line = sc.nextLine().trim().split(" ");
for (int j=0; j<line.length; j++) {
myArray[i][j] = Integer.parseInt(line[j]);
}
}
}
System.out.println(Arrays.deepToString(myArray));
txaSome.setText(Arrays.deepToString(myArray));
} catch (IOException exc) {
exc.printStackTrace();
}
for (int i = 0; i < myArray.length; i++) {
int k = 1;
for (int j = 0; j < myArray[i].length - 1; j++) {
if (myArray[i][j] == myArray[i][j + 1]) {
k += 1;
if (k == myArray[i].length) {
System.out.println("element:" + myArray[i][j]);
System.out.println("# of row:" + i);
txaSome1.setText("element:" + myArray[i][j]);
txaSome2.setText("# of row:" + i);
}
}
}
}
for (int i = 0; i < myArray.length; i++) {
int k = 1;
for (int j = 0; j < myArray[i].length; j++)
if (myArray[j][i] % 2 != 0)
k = 0;
if (k == 1) {
System.out.println("# of column:" + i);
txaSome3.setText("# of column:" + i);
}
}
}
}
);
//--------------------------------------------------------------
Vector<Vector<Integer>> data = new Vector<Vector<Integer>>();
Vector<String> header = new Vector<String>();
Vector<Integer> row = new Vector<>();
for (int j = 0; j < myArray.length; j++) {
header.add((String)headers[j]);
for (int i = 0; i < myArray[j].length; i++) {
row.add(myArray[j][i]);
}
data.add(row);
}
JTable table3 = new JTable(data, header);
Box contents3 = new Box(BoxLayout.Y_AXIS);
table3.setForeground(Color.red);
table3.setSelectionForeground(Color.yellow);
table3.setSelectionBackground(Color.blue);
table3.setShowGrid(true);
contents3.add(table3);
wnd.setContentPane(contents3);
setSize(500, 400);
//---------------------------------------------------
wnd.add(table3);
wnd.add(txaSome);
wnd.add(txaSome1);
wnd.add(txaSome2);
wnd.add(txaSome3);
wnd.add(btnSome);
setLayout(new FlowLayout());
wnd.setVisible(true);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, getWidth(), getHeight());
}
@Override
public void actionPerformed(ActionEvent e) {
}
}
(Там дополнительно у меня два циклы для того,что бы выводил номер рядка которого все элементы равны и номер столбца у которого все элементы четные)
Ответы (2 шт):
У вас просто огромное количество бесполезного кода (в т.ч. неиспользуемых переменных). Код вполне ужасный, это делает практически невозможным его отладку. Я не знаю, зачем вам потребовался свинг, но в любом случае вьюхи такого рода никто руками не пишет. Это все делается в визуальной среде. При работе с таблицами для отрисовки в них данных проще всего использовать специальный класс DefaultTableModel, как я и сделал. Также я не уверен, что ваш путь к файлу корректный,поэтому перенесите свой файл в корневой каталог проекта (именно такой путь я указал в своем коде). Так что если после нажатия на кнопку загрузки файла увидите пустую таблицу, а в консоли File not found : java.nio.file.NoSuchFileException: Array6.txt, то это означает, что путь к вашему файлу некорректный. В остальном примерно это должно выглядеть так:
import java.awt.EventQueue;
import java.awt.Font;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class LabSixSecond extends javax.swing.JFrame {
private JButton buttonLoad;
private JScrollPane jScrollPane1;
private JTable table;
private final String fileName = "Array6.txt";
private final String[] titles = new String[]{"Title 1", "Title 2", "Title 3"};
public LabSixSecond() {
initComponents();
}
private void initComponents() {
jScrollPane1 = new JScrollPane();
table = new JTable();
buttonLoad = new JButton("Load file");
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
table.setFont(new Font("Times New Roman", 0, 14));
table.setModel(new DefaultTableModel(
new Object[][]{
{null, null, null},
{null, null, null},
{null, null, null}
},
titles
) {
Class[] types = new Class[]{String.class, String.class, String.class};
public Class getColumnClass(int columnIndex) {
return types[columnIndex];
}
});
jScrollPane1.setViewportView(table);
buttonLoad.addActionListener(this::jButton1ActionPerformed);
GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(buttonLoad)
.addContainerGap())
);
layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 128, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(buttonLoad)
.addGap(0, 138, Short.MAX_VALUE))
);
pack();
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
DefaultTableModel createTableModel = createTableModel(titles);
table.setModel(createTableModel);
}
private DefaultTableModel createTableModel(String... titles) {
return new DefaultTableModel(read(), titles);
}
private String[][] read() {
try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
return stream.map(line -> line.split(" ")).toArray(String[][]::new);
} catch (IOException e) {
System.out.println("File not found : " + e);
return null;
}
}
public static void main(String args[]) {
EventQueue.invokeLater(() -> {
new LabSixSecond().setVisible(true);
});
}
}
Во-первых, у Вас загрузка данных идет в обработчике события кнопки (который отрабатывает при нажатии на кнопку), а заполнение таблицы - в конструкторе. Но в конструкторе загрузки данных не происходит, поэтому таблица заполняется нулями.
Вам нужно вынести в отдельный метод все, что в обработчике кнопки и этот же метод вызвать в конструкторе перед заполнением JTable.
При заполнении таблицы у вас тоже ошибочка: переместите строку Vector<Integer> row = new Vector<>(); перед внутренним циклом, а то в таблицу постоянно добавляются данные, а нужно для каждой строки новый вектор.