我正在创建一个TableModel,它将具有固定数量的列,但行数将会发生变化(大多数情况下,随着时间的推移而增加).哪种方法可以更好地存储数据,
ArrayList[] columns = new ArrayList[numberOfColumns];
// Each array element is one column. Fill each of them with a new ArrayList.
...
public Object getValueAt(int row, int column) {
return columns[column].get(row);
}
Run Code Online (Sandbox Code Playgroud)
即创建一个ArrayLists 数组,每个数组ArrayList代表一列,或者:
ArrayList<Object[]> rows = new ArrayList<Object[]>();
// Each ArrayList element is one row.
public Object getValueAt(int row, int column) {
return rows.get(row)[column];
}
Run Code Online (Sandbox Code Playgroud)
即创建一个包含数组的ArrayList,每个数组代表一行.
有哪些想法在速度或存储方面更有效?备选方案1要求ArrayList在每个添加的行中扩展N s,而备选方案2要求仅扩展一个,ArrayList但也创建长度为N的新数组(以表示新行).还是有一个明显的,更好的解决方案?
我正在构建一个treetable使用JXTreeTabble,我想menu根据所选值禁用/能够项目.所以,我试着把这个代码放在我的table model:
public Object getValueAt(int index) {
if (index >= 0 && index < root.getSize()){
return root.get(index);
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
问题
以上仅适用于table未扩展内容的情况.由于index的selected row可能是比较大size的T的able model(模型可以有两个项目和行可以有10当一切都展开).此外,它object type的parent不同之处children(想象一本带有章节的书,因为它的孩子).
你有什么建议正确地做到这一点?
我应该首先告诉它,这不是关于渲染表格单元格.
这是我正在使用基于User我的数据库中的对象的2D数组构建的TableModel .
List<User> userList = userManagerService.getAllUsers();
/* String[] col_user = {"Username", "Name", "Phone", .... } */
String[][] data = new String[userList.size()][col_user.length];
int i = 0;
for (User user : userList) {
String[] userdata = new String[col_user.length];
userdata[0] = user.getUserUsername();
userdata[1] = user.getUserName();
userdata[2] = user.getUserPhone();
userdata[3] = user.getUserNic();
userdata[4] = user.getUserAddress();
userdata[5] = user.getUserEmail();
data[i++] = userdata;
}
VstTableItemModel tiModel = new VstTableItemModel(data, col_user);
dataTable.setModel(tiModel);
Run Code Online (Sandbox Code Playgroud)
我的问题是如何User使用表中的选定行返回一个对象.请注意,我无法创建新User对象并使用行数据填充它.我必须得到被查询的User对象(对象userList).那么,他们用表格行设置对象的方法是什么?
这是我的VstTableItemModel课. …
我能够设置列的标题,但无法在JTable的第一列的所有行中设置图标.
public class iconRenderer extends DefaultTableCellRenderer{
public Component getTableCellRendererComponent(JTable table,Object obj,boolean isSelected,boolean hasFocus,int row,int column){
imageicon i=(imageicon)obj;
if(obj==i)
setIcon(i.imageIcon);
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
setHorizontalAlignment(JLabel.CENTER);
return this;
}
}
public class imageicon{
ImageIcon imageIcon;
imageicon(ImageIcon icon){
imageIcon=icon;
}
}
Run Code Online (Sandbox Code Playgroud)
我的BuildTable()方法中的行和下面的行.
public void SetIcon(JTable table, int col_index, ImageIcon icon){
table.getTableHeader().getColumnModel().getColumn(col_index).setHeaderRenderer(new iconRenderer());
table.getColumnModel().getColumn(col_index).setHeaderValue(new imageicon(icon));
}
Run Code Online (Sandbox Code Playgroud)
我们如何为第一列的所有行设置它?我已尝试使用for循环,但还没有得到行迭代来设置图标.或者还有其他方法吗?
我有一个JTable需要对用户可以输入文本的单元格进行单元验证.当用户输入无效文本时,单元格的边框变为红色.
我设法让这个工作关联一个二维数组来标记每个单元格是否有错误.
问题是用户必须能够重新排序表(按列).我必须将错误标志存储在表模型中,而不是分开存储.任何人都有想法如何做到这一点?
我正在创建一个UI类,其中所有内容都将运行(另一个类将作为运行器).在这个类中,我有一个表,并且该表应该在更改时创建TableModeEvents,但它似乎没有这样做.
每当我对桌子做任何事情时,控制台都会打印出"测试",但事实并非如此.我已经制作了其他SSCCE,只要我将所有内容保存在一个程序中(在主方法中并且只有子类和匿名类),它们就能正常工作,但我似乎无法让它跨类工作.
知道我做错了什么吗?
package SSCCE;
import java.awt.BorderLayout;
import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
public class SSCCE {
static Object[][] data = { {"Abyss", Boolean.FALSE},{"Scepter", Boolean.FALSE},{"FoN", Boolean.FALSE} };
public static void main(String[] args){
//table model------------------------------------------
TableModel model = new AbstractTableModel(){
Object[][] rowData = { {"Abyss", Boolean.FALSE},{"Scepter", Boolean.FALSE},{"FoN", Boolean.FALSE} };
String[] columnNames = {"Name","Boolean"};
public int getColumnCount() {return columnNames.length;}
public String getColumnName(int column) {return columnNames[column];}
public int getRowCount() {return rowData.length;}
public Object getValueAt(int row, int column) {return rowData[row][column];} …Run Code Online (Sandbox Code Playgroud) 嗨,
我创建了我的TableModel,并希望在添加新行后刷新JTable.应该添加什么来监听"刷新"JTable?
public class MyTableModel implements TableModel {
private Set<TableModelListener> listeners = new HashSet<TableModelListener>();
//List<Staff> staffs = Factory.getInstance().getStaffDAO().getAllStaff();
private List<Staff> staffs;
public MyTableModel(List<Staff> staffs){
this.staffs = staffs;
}
@Override
public int getRowCount() {
return staffs.size();
}
@Override
public int getColumnCount() {
return 5;
}
@Override
public String getColumnName(int columnIndex) {
switch (columnIndex){
case 0:
return "First Name";
case 1:
return "Second Name";
case 2:
return "Date";
case 3:
return "Position";
case 4:
return "Salary";
}
return "";
}
@Override
public …Run Code Online (Sandbox Code Playgroud) 我在JTable中有一个列绑定到业务对象列表上的底层布尔属性.我还有一个组合框,应该选择应该选择哪些项目.我基本上将以下代码添加为组合框的处理程序:
macroCombo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JComboBox comboBox = (JComboBox) e.getSource();
Predicate filter = (Predicate) comboBox.getSelectedItem();
for(SelectableKey key : tableEntries){
key.setSelected(filter.evaluate(key));
}
}
});
Run Code Online (Sandbox Code Playgroud)
我还想根据值改变一些其他控件.目前,表中只有少数单元格会更改其状态以进行选择/取消选择.只有当我单击该行或选择多行时,UI才会自行更新.是否有来自我需要做的处理程序的调用来告诉GUI重绘自己?ALOS,如果我修改除JTable之外的其他控件,我怎么告诉他们改变他们的状态?
谢谢
我的问题需要一些帮助.我有一个表,例如双列和字符串列.如果双列中的值为negativ,则字符串应为"negativ".另一种方式,如果值为positiv,则字符串应为"positiv".现在的问题是如果我在jTable中编辑double值,那么字符串也应该更新.
更新我的问题,实际代码如下所示: 但它不起作用,因为在编辑第一列值后,第二列中的字符串不会更新.它只在我第一次启动程序时才有效.
import java.util.Vector;
import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.*;
public class ExampleRemoveAddRows extends JFrame {
private Object[] columnNames = {"Double", "positiv / negativ"};
private Object[][] data = {
{new Double(10.0), "positiv"},
{new Double(-10.0), "negativ"},
{new Double(20.0), "positiv"},
{new Double(-30.0), "negativ"}
};
private JTable table;
private DefaultTableModel model;
public ExampleRemoveAddRows() {
model = new DefaultTableModel(data, columnNames) {
@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
@Override
public Object getValueAt(int row, int column) {
if (column …Run Code Online (Sandbox Code Playgroud) 我正在一个项目中,我们有几个域类来建模业务数据.这些类是简单的POJO,我必须使用它们显示几个表.例如,考虑这个类:
public class Customer {
private Long id;
private Date entryDate;
private String name;
private String address;
private String phoneNumber;
public Customer(Long id, Date entryDate, String name, String address, String phoneNumber) {
this.id = id;
this.entryDate = entryDate;
this.nombre = name;
this.domicilio = address;
this.telefono = phoneNumber;
}
// Getters and setters here
}
Run Code Online (Sandbox Code Playgroud)
我创建了自己的表格模型,从AbstractTableModel扩展,以便直接使用Customer类:
public class CustomerTableModel extends AbstractTableModel {
private final List<String> columnNames;
private final List<Customer> customers;
public CustomerTableModel() {
String[] header = new …Run Code Online (Sandbox Code Playgroud) java ×10
tablemodel ×10
jtable ×8
swing ×8
arraylist ×1
arrays ×1
cellrenderer ×1
jcombobox ×1
jxtreetable ×1
listener ×1
object ×1
selected ×1