我有一个2列的JTable,这个JTable有N行(其中N取决于其他任务),并在每个单元格中显示之前设置一个默认值。每行有一个字符串和一个int值。
我需要这个表格,当我点击OK按钮时,发送所有单元格数据(在用户编辑这些数据之后),作为对象与链表中的2个数据(行x列x)耦合。(接收字符串和int的对象构造函数作业尚未完成。)
我如何编码这个???
这是生成带有my JTable和2个按钮(确定和取消)的windows的代码:
/**
* Create the frame.
*/
public InsertJobWindows() {
setTitle("Welcome");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 551, 293);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
JPanel panel_1 = new JPanel();
JButton btnNewButton = new JButton(" OK ");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
panel_1.add(btnNewButton);
JButton btnNewButton_1 = new JButton("Cancel");
btnNewButton_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
InsertJobWindows.this.dispose();
}
});
JPanel panel = new JPanel();
final JTable table = new JTable(new MyTableModel());
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(true);
table.getSelectionModel().addListSelectionListener(
new ListSelectionListener() {
public void valueChanged(ListSelectionEvent event) {
int viewRow = table.getSelectedRow();
JLabel statusText=new JLabel();
if (viewRow < 0) {
//Selection got filtered away.
statusText.setText("");
} else {
int modelRow =
table.convertRowIndexToModel(viewRow);
statusText.setText(
String.format("Selected Row in view: %d. " +
"Selected Row in model: %d.",
viewRow, modelRow));
}
}
}
);
//Create the scroll pane and add the table to it.
JScrollPane scrollPane = new JScrollPane(table);
//Set up column sizes.
initColumnSizes(table);
panel_1.add(btnNewButton_1);
GroupLayout gl_contentPane = new GroupLayout(contentPane);
gl_contentPane.setHorizontalGroup(
gl_contentPane.createParallelGroup(Alignment.LEADING)
.addGroup(gl_contentPane.createSequentialGroup()
.addGroup(gl_contentPane.createParallelGroup(Alignment.TRAILING, false)
.addComponent(panel_1, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(panel, GroupLayout.DEFAULT_SIZE, 525, Short.MAX_VALUE))
.addContainerGap())
);
gl_contentPane.setVerticalGroup(
gl_contentPane.createParallelGroup(Alignment.LEADING)
.addGroup(gl_contentPane.createSequentialGroup()
.addComponent(panel, GroupLayout.PREFERRED_SIZE, 213, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.RELATED, 61, Short.MAX_VALUE)
.addComponent(panel_1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
);
GroupLayout gl_panel = new GroupLayout(panel);
gl_panel.setHorizontalGroup(
gl_panel.createParallelGroup(Alignment.LEADING)
.addGroup(gl_panel.createSequentialGroup()
.addGap(11)
.addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addContainerGap(12, Short.MAX_VALUE))
);
gl_panel.setVerticalGroup(
gl_panel.createParallelGroup(Alignment.LEADING)
.addGroup(gl_panel.createSequentialGroup()
.addGap(5)
.addComponent(scrollPane, GroupLayout.DEFAULT_SIZE, 197, Short.MAX_VALUE)
.addContainerGap())
);
panel.setLayout(gl_panel);
contentPane.setLayout(gl_contentPane);
}
private void initColumnSizes(JTable table) {
MyTableModel model = (MyTableModel)table.getModel();
TableColumn column = null;
Component comp = null;
int headerWidth = 0;
int cellWidth = 0;
Object[] longValues = model.longValues;
TableCellRenderer headerRenderer =
table.getTableHeader().getDefaultRenderer();
for (int i = 0; i < 2; i++) {
column = table.getColumnModel().getColumn(i);
comp = headerRenderer.getTableCellRendererComponent(
null, column.getHeaderValue(),
false, false, 0, 0);
headerWidth = comp.getPreferredSize().width;
comp = table.getDefaultRenderer(model.getColumnClass(i)).
getTableCellRendererComponent(
table, longValues[i],
false, false, 0, i);
cellWidth = comp.getPreferredSize().width;
if (DEBUG) {
System.out.println("Initializing width of column "
+ i + ". "
+ "headerWidth = " + headerWidth
+ "; cellWidth = " + cellWidth);
}
column.setPreferredWidth(Math.max(headerWidth, cellWidth));
}
}
class MyTableModel extends AbstractTableModel {
private String[] columnNames = {"JobName", "time"};
int numJobs=JobManager.loadNumJob();
private Object[][] data = getDefaultTableData();
public Object[][] getDefaultTableData(){
Object[][] tabella=new Object[numJobs][2];
for(int i=0; i<numJobs; i++){
for(int j=0; j<2; j++){
tabella[i][j]="insert the correct data";
}
}
return tabella;
}
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return numJobs;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public boolean isCellEditable(int row, int col) {
return true;
}
public void setValueAt(Object value, int row, int col) {
if (DEBUG) {
System.out.println("Setting value at " + row + "," + col
+ " to " + value
+ " (an instance of "
+ value.getClass() + ")");
}
data[row][col] = value;
fireTableCellUpdated(row, col);
if (DEBUG) {
System.out.println("New value of data:");
printDebugData();
}
}
public void run() {
try {
InsertJobWindows frame = new InsertJobWindows();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
}
改变你的表模型来保存你的作业的LinkedList
(或者更简单地说,一个List
)。
有点像这样:
public class Job {
public int time; // Should n't this be a long?
public String jobName;
}
class MyTableModel extends AbstractTableModel {
private String[] columnNames = {"JobName", "time"};
int numJobs=JobManager.loadNumJob();
private List<Job> data = getDefaultTableData();
public List<Job> getDefaultTableData(){
List<Job> jobs = new LinkedList<Job>();
for(int i=0; i<numJobs; i++) {
Job job = new Job();
job.time = /* Some int value */ 0;
job.jobName= /* Some string value */ "";
jobs.add(job);
}
return jobs;
}
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return jobs.size();
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
if (col==0) {
return data.get(row).jobName;
} else if (col==1) {
return data.get(row).time;
}
return null;
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public boolean isCellEditable(int row, int col) {
return true;
}
public void setValueAt(Object value, int row, int col) {
if (DEBUG) {
System.out.println("Setting value at " + row + "," + col
+ " to " + value
+ " (an instance of "
+ value.getClass() + ")");
}
if (col==0) {
data.get(row).jobName = value; // Here do the casts and necessary checks.
} else if (col==1) {
data.get(row).time= value; // Here do the casts and necessary checks.
}
fireTableCellUpdated(row, col);
if (DEBUG) {
System.out.println("New value of data:");
printDebugData();
}
}
问题内容: 我想用来编码大量数据,而不必一次将所有数据加载到内存中。 我以为json包中内置了此功能,但事实并非如此。 操场 我目前只是在自己构建json字符串。 操场 有一个更好的方法吗? 如果json.Marshaler像这样,那将是微不足道的。 问题答案: 不幸的是,该程序包还没有办法做到这一点。您现在(手动)执行的操作是执行此操作的最佳方法,而无需修改内置程序包。 如果要打补丁,则可以在e
问题内容: 我有一个无法解决的问题。 众所周知,我对使用JTables还是比较陌生,所以答案可能很简单,但是我找不到解决方案:/ 所以,我有一个使用AbstractTableModel的JTable,它重写了 方法,以告知要显示的每一列的类型。其中之一是布尔值。 当我创建一个简单的JTable时,使用 一切都很好,并且使用复选框(开/关)可以正确显示布尔值。 现在,我想将文本放在每个单元格的中心(
我有个问题无法解决。 一切都很好,并且使用复选框(ON/OFF)正确显示布尔值。 现在,我想将文本居中放在每个单元格上(稍后可能还有更多选项)。 因此我为每个列定义了一个新的DefaultTableCellRenderer,如下所示: 编辑:谢谢你的所有澄清。事实上,我真正的问题是:“如何影响JTable的所有DefaultRenderer,使它们将结果集中在JTable的单元格中。”
问题内容: 我有一个要存储’raw’的数据框: 但似乎试图“解压” numpy.array。 有解决方法吗?除了使用包装器之外(请参见下面的编辑)? 我尝试没有成功。 编辑 这行得通,但是我必须使用’dummy’类来包装数组,这不能令人满意,也不是很优雅。 问题答案: 在numpy数组周围使用包装器,即将numpy数组作为列表传递 输出: 或者您可以通过创建元组来使用,即如果您有一个数据框 输出:
问题内容: 如何加载Spring资源内容并将其用于设置bean属性或将其作为参数构造函数传递? 该资源包含自由文本。 问题答案: 此解决方案需要Apache Commons IO。 @Parvez建议的另一种没有Apache Commons IO依赖性的解决方案是
如EhCache留档所述: 实际上,这意味着持久性内存中缓存将启动,其所有元素都将在磁盘上。[...]因此,Ehcache设计不会在启动时将它们全部加载到内存中,而是根据需要懒惰地加载它们。 我希望内存缓存启动时将所有元素都存储在内存中,我该如何实现? 这是因为我们的网站对缓存执行了大量的访问,所以我们第一次访问网站时,它的响应时间非常长。