我正在通过 Java 查询 MySQL 数据库,从结果集中提取数据并将其放入 DefaultTableModel,然后放入 JTable,然后放入 JScrollPane 以显示。
在 JTable 中,我通过在表中启用排序
table.setAutoCreateRowSorter(true);
Run Code Online (Sandbox Code Playgroud)
但是,如果我要排序的行中的单元格不是 String 类,那么我会收到 java.lang.ClassCastException。我的表中的数据具有以下类:
java.sql.Date
java.sql.Time
java.lang.Double
java.lang.Boolean
java.lang.String
Run Code Online (Sandbox Code Playgroud)
下面是当我尝试对 java.lang.Double 类的列进行排序时遇到的错误,然后是将结果集作为输入输出 JTable 的类。如果有人对我如何解决排序问题有任何想法,将不胜感激。
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.Double `enter code here`cannot be cast to java.lang.String
at java.text.Collator.compare(Collator.java:327)
at javax.swing.DefaultRowSorter.compare(DefaultRowSorter.java:968)
at javax.swing.DefaultRowSorter.access$100(DefaultRowSorter.java:112)
at javax.swing.DefaultRowSorter$Row.compareTo(DefaultRowSorter.java:1376)
at javax.swing.DefaultRowSorter$Row.compareTo(DefaultRowSorter.java:1366)
at java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:290)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:157)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:146)
at java.util.Arrays.sort(Arrays.java:472)
at javax.swing.DefaultRowSorter.sort(DefaultRowSorter.java:607)
at javax.swing.DefaultRowSorter.setSortKeys(DefaultRowSorter.java:319)
at javax.swing.DefaultRowSorter.toggleSortOrder(DefaultRowSorter.java:480)
at javax.swing.plaf.basic.BasicTableHeaderUI$MouseInputHandler.mouseClicked(BasicTableHeaderUI.java:112)
at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:270)
at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:269)
at java.awt.Component.processMouseEvent(Component.java:6508)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861) …Run Code Online (Sandbox Code Playgroud) 可能的重复:
如何向 JTable 的行添加工具提示
我想在给定的特定列下的单元格上为用户鼠标悬停事件添加工具提示,以便单元格的值完全显示给用户。
我试图用MySql数据填充JTable.事情是当我运行Login类时,我收到消息"java.SQLException:没有为参数2指定值",当我运行JTable类时,我一直收到java.lang.NullPointerException错误.我有三个类:1 - 连接到DB:
import java.sql.Connection;
import java.sql.DriverManager;
import javax.swing.JOptionPane;
public class javaconnect {
Connection conn = null;
public static Connection ConnecrDB() {
try {
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mydb",
"root", "root");
JOptionPane.showMessageDialog(null, "Connected");
return con;
} catch (Exception e) {
System.out.println("ERROR: " + e.getMessage());
}
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
第二类是登录框架:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import java.awt.*;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.sql.Connection;
import …Run Code Online (Sandbox Code Playgroud) 我目前有一个JTable,其中填充了一系列数据,这些数据构成了导入屏幕的基础.当我选择了我想要或不想要的更新时,我按下Apply按钮并成功应用更新,但JTable没有完全更新.
这是处理应用更改的方法的代码:
private void doProcessChanges() {
ChangeProcessor cp = new ChangeProcessor();
final List<Integer> rowsToRemove = new ArrayList<Integer>();
BeanTableModel<UpdateModel> model = (BeanTableModel<UpdateModel>) table.getModel();
for (int i=0; i<model.getRowCount(); i++) {
UpdateRow ur = mode.getObject(i);
if (ur.isAccepted() <> ChangeAcceptance.NO_ACTION) {
cp.processChange(ur);
rowsToRemove.add(i);
}
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
for (int row : rowsToRemove) {
model.removeObject(row);
model.fireTableDataChanged();
}
}
);
}
Run Code Online (Sandbox Code Playgroud)
从SwingWorker线程中调用该方法,如下所示:
SwingWorker<Object, Object> worker = new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
doProcessChanges();
return null; …Run Code Online (Sandbox Code Playgroud) 在这里,我想使用构造函数动态分配表中的行数.datamodel是类,datamodel(int count)方法指定no.of行.
import javax.swing.table.AbstractTableModel;
@SuppressWarnings("serial")
public class datamodel extends AbstractTableModel{
int row1;
datamodel(int count){
row1 = count;
count = 0;
}
private String[] columnNames = {"Sl No","Material Code", "Material Name", "Select", "Received QTY", "Unit", "To Be Delivered", "PO No", "PO Sl"};//new String[9];
//table has 100 rows and 9 columns
private Object[][] data = new Object[row1][9];
public int getColumnCount() { return columnNames.length; }
public int getRowCount() { return data.length;}
public String getColumnName(int col) {
// TODO Auto-generated method stub
return columnNames[col]; …Run Code Online (Sandbox Code Playgroud) 我需要从中删除行JTable.我写了这样的代码:
DefaultTableModel dtm = (DefaultTableModel) jTable1.getModel();
int x = 0;
int row = dtm.getRowCount();
while(row>=x){
dtm.removeRow(x);
x++;
}
Run Code Online (Sandbox Code Playgroud)
但它会产生错误,例如:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException:
24 >= 24
Run Code Online (Sandbox Code Playgroud) 我在框架上向 JTable 添加了一个 keylistner。现在在 kepressed 我有代码
if (ke.getKeyCode()==10)
{
int rowIndex = jTable2.getSelectedRow();
int colIndex = jTable2.getSelectedColumn();
jTable2.editCellAt(rowIndex, colIndex);
ke.consume();
Run Code Online (Sandbox Code Playgroud)
这确实编辑了单元格,但直到我用鼠标单击它才会显示光标
我正在使用JTable以图形方式显示我正在开发的应用程序的搜索结果.我希望能够在不再需要表时删除表,然后用新创建的表替换它.以下是我目前将表格添加到JFrame的方法:
userLibrary = new CustomLibrary(users, LIBRARY_WIDTH, LIBRARY_HEIGHT);
userLibrary.setOpaque(true);
userLibrary.setBounds(LIBRARY_START_X, LIBRARY_START_Y, LIBRARY_WIDTH, LIBRARY_HEIGHT);
getContentPane().add(userLibrary);
Run Code Online (Sandbox Code Playgroud)
我的自定义库(扩展了JPanel)执行以下操作:
public CustomLibrary(LinkedList<User> usernames, int width, int height) {
CustomTable table = new CustomTable(userRows,columnNames);
table.setPreferredScrollableViewportSize(new Dimension(width, height));
table.setFillsViewportHeight(true);
table.setAutoCreateRowSorter(true);
JScrollPane scrollPane = new JScrollPane(table);
// Add the scroll pane to this panel.
add(scrollPane);
}
Run Code Online (Sandbox Code Playgroud)
现在一切正常并显示我的表,但我无法弄清楚如何从我的内容窗格中完全删除表.我试过打电话
getContentPane().remove(userLibrary);
Run Code Online (Sandbox Code Playgroud)
但这似乎什么都不做.
所以我的一般问题是.一旦我已经创建并绘制了一个表,我如何从我的JFrame中完全删除它?
我有一个JTable基于表模型,使用一个List,我想删除在这里选择的元素JTable,从List,JTable是可排序的,所以当我得到选定的行,我不能简单地list.remove,因为顺序是不同的.有什么想法解决这个问题?
我需要一些getValue方法的帮助
我正在读取文件并将值存储在
public List<Object[]> students;
Run Code Online (Sandbox Code Playgroud)
现在我想将所有这些值添加到我的JTable中
@Override
public Object getValueAt(int row, int col) {
//return data[row][col];
// Here I have to get data from students
}
Run Code Online (Sandbox Code Playgroud)
通常从很多例子中我看到他们Object[][] data用来做这种事情,这可能是这样的
//return data[row][col];
Run Code Online (Sandbox Code Playgroud)
但是因为我从我想要的文件中读取 List<Object[]> students;
任何想法如何在getValueAt方法中实现它?
我的解决方案就是这个
@Override
public Object getValueAt(int row, int col) {
//return data[row][col];
for(Object[] j: students)
{
return j[col];
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
但这只会占用第一个对象,并将分配给我的JTable中的所有行