Я новичок в реализации компонентов GUI в JAVA и новичок в JTables.Я пытаюсь найти JTable, который я назвал myTable в этом коде, через пользовательский текст внутри JTextField, который я назвал searchTable в этом коде.
Я попытался реализовать в моем коде RowSorter, который работает так, что когда пользователь нажимает клавишу ввода, элемент обновляется, находя и отображая элемент, который соответствует пользовательскому вводу в JTextField, а затем также обновляя его, возвращаясь назад.в исходное состояние, показывая все элементы в JTable, когда пользователь выполняет другое действие.
Ниже приведен мой код для моих элементов графического интерфейса JTable:
(я также пыталсясделайте это с двумя циклами for, один циклически перебирает строки, а другой - столбцы. Мне это не понравилось, и поэтому комментарий ниже).
package westminsterlibraryrun;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.table.*;
import javax.swing.*;
import javax.swing.RowFilter.*;
/*
*
* @author w1640643
*/
public class LibraryItemTableGUI extends JFrame implements ActionListener {
JTable myTable;
JTextField searchTable;
LibraryItemTable tableModel;
ArrayList<LibraryItem> itemList;
public LibraryItemTableGUI(ArrayList<LibraryItem> itemList) {
this.itemList = itemList;
tableModel = new LibraryItemTable(itemList);
myTable = new JTable(tableModel);
setBounds(10, 10, 400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myTable.setAutoCreateRowSorter(true);
myTable.getColumnModel().getColumn(4).setCellRenderer(new DefaultTableCellRenderer() {
Color originalcolor = null;
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component renderer = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (value == "Borrowed") {
renderer.setBackground(Color.red);
} else {
renderer.setBackground(Color.GREEN);
}
return renderer;
}
});
searchTable = new JTextField("Enter Item TItle You Wish to Search");
searchTable.addActionListener(this);
JScrollPane scrollPane = new JScrollPane(myTable);
scrollPane.setPreferredSize(new Dimension(380, 280));
JPanel panel = new JPanel();
panel.add(scrollPane);
panel.add(searchTable);
add(scrollPane, BorderLayout.CENTER);
add(searchTable, BorderLayout.SOUTH);
}
@Override
public void actionPerformed(ActionEvent e) {
RowFilter<LibraryItemTable, String> filterJTable = new RowFilter<LibraryItemTable, String>() {
@Override
public boolean include(Entry<? extends LibraryItemTable, ? extends String> entry) {
for (int i = entry.getValueCount() - 1; i >= 0; i--) {
if (entry.getStringValue(i).equalsIgnoreCase(searchTable.getText())) {
return true;
}
}
System.out.println("False");
return false;
}
};
}
}
// @Override
// public void actionPerformed(ActionEvent e) {
// for (int i = 0; i < myTable.getRowCount(); i++) {
// for (int j = 0; j < myTable.getColumnCount(); j++) {
// String jtableChecker = searchTable.getText();
// if (myTable.getModel().getValueAt(i,
//j).equals(jtableChecker)) {
// searchTable.setText("Item Search: " + //myTable.getModel().getValueAt(i, j));
Ниже приведен мой код для моей таблицыМодель:
package westminsterlibraryrun;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
/**
*
* @author w1640643
*/
public class LibraryItemTable extends AbstractTableModel {
private String[] columnTitles = {"Item ISBN", "Item Title", "Item Type", "Item Category", /* "Item Published Date", */ "Item Status"};
private ArrayList<LibraryItem> itemList;
public LibraryItemTable(ArrayList<LibraryItem> itemList) {
this.itemList = itemList;
}
@Override
public int getRowCount() {
return itemList.size();
}
@Override
public int getColumnCount() {
return columnTitles.length;
}
@Override
public Object getValueAt(int rows, int cols) {
Object tb = null;
if (cols == 0) {
tb = itemList.get(rows).getISBN();
} else if (cols == 1) {
tb = itemList.get(rows).getTitle();
} else if (cols == 2) {
tb = itemList.get(rows).getItem();
} else if (cols == 3) {
tb = itemList.get(rows).getCategory();
// } else if (cols == 4) {
// tb = itemList.get(rows).getPublishedDate();
} else if (cols == 4) {
tb = itemList.get(rows).getStatus();
}
return tb;
}
@Override
public String getColumnName(int cols) {
return columnTitles[cols];
}
} //end
Указатели на то, где я собираюсь работать, и как в целом будет приветствоваться RowSorter (я пытался понять данную страницу API RowSorter без реального понимания того, как он работает).
Спасибо.
Обновление:
Я исправил свой код следующим образом:
package westminsterlibraryrun;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.table.*;
import javax.swing.*;
import javax.swing.RowFilter.*;
/*
*
* @author w1640643
*/
public class LibraryItemTableGUI extends JFrame implements ActionListener {
JTable myTable;
JTextField searchTable;
LibraryItemTable tableModel;
ArrayList<LibraryItem> itemList;
public LibraryItemTableGUI(ArrayList<LibraryItem> itemList) {
this.itemList = itemList;
tableModel = new LibraryItemTable(itemList);
myTable = new JTable(tableModel);
setBounds(10, 10, 400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myTable.setAutoCreateRowSorter(true);
myTable.getColumnModel().getColumn(4).setCellRenderer(new DefaultTableCellRenderer() {
Color originalcolor = null;
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component renderer = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (value == "Borrowed") {
renderer.setBackground(Color.red);
} else {
renderer.setBackground(Color.GREEN);
}
return renderer;
}
});
searchTable = new JTextField("Enter Item TItle You Wish to Search");
searchTable.addActionListener(this);
JScrollPane scrollPane = new JScrollPane(myTable);
scrollPane.setPreferredSize(new Dimension(380, 280));
JPanel panel = new JPanel();
panel.add(scrollPane);
panel.add(searchTable);
add(scrollPane, BorderLayout.CENTER);
add(searchTable, BorderLayout.SOUTH);
}
public void searchJTable(String query) {
TableRowSorter<TableModel> table = new TableRowSorter<>(tableModel);
myTable.setRowSorter(table);
table.setRowFilter(RowFilter.regexFilter(query));
}
@Override
public void actionPerformed(ActionEvent e) {
String query = searchTable.getText();
searchJTable(query);
}
}
// @Override
// public void actionPerformed(ActionEvent e) {
// for (int i = 0; i < myTable.getRowCount(); i++) {
// for (int j = 0; j < myTable.getColumnCount(); j++) {
// String jtableChecker = searchTable.getText();
// if (myTable.getModel().getValueAt(i, j).equals(jtableChecker)) {
// searchTable.setText("Item Search: " + myTable.getModel().getValueAt(i, j));
Однако, является ли вышеизложенное в настоящее время хорошей практикой кодирования?И мне все еще интересно, почему это не работало раньше?