- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要创建一个具有以下特征的表:
表格还必须为可编辑单元格提供以下数据验证选项:
我设法让表格按照我想要的方式运行,唯一我没能开始工作的是:
如有任何帮助,我们将不胜感激。
这是我使用的代码:
单元格、列和 FieldUpdater
public class DataCell2 extends EditTextCell{
private TableDTO tableData;
public DataCell2(TableDTO tableData){
this.tableData=tableData;
}
@Override
public void render(com.google.gwt.cell.client.Cell.Context context, String value, SafeHtmlBuilder sb){
super.render(context,value,sb);
}
@Override
public void onBrowserEvent(Context context, Element parent, String value, NativeEvent event,
ValueUpdater<String> valueUpdater){
// If cell non editable exit
if(!isEditable(context)){
return;
}else{
super.onBrowserEvent(context,parent,value,event,valueUpdater);
}
}
private boolean isEditable(Context context){
int row=context.getIndex();
// int column=context.getColumn();
return tableData.isRowEditable(row);
}
public class DataColumn2<DataCell2> extends Column<RowDTO,String>{
public int col;
public DataColumn2(int col, Cell<String> cell){
super(cell);
this.col=col;
}
@Override
public String getValue(RowDTO object){
// TODO Auto-generated method stub
return null;
}
public class LabelColumn2 extends TextColumn<RowDTO>{
public LabelColumn2(){
super();
}
@Override
public String getValue(RowDTO object){
return object.getLabel();
}
public class DataUpdater2 implements FieldUpdater<RowDTO,String>{
private CellTable<RowDTO> table;
private DataCell2 dataCell;
// private ProvidesKey<DataItem> KEY_PROVIDER;
protected int col=0;
public DataUpdater2(int col, CellTable<RowDTO> table, DataCell2 dataCell){
this.dataCell=dataCell;
this.table=table;
this.col=col;
}
public void clear(int index){
// Clear invalid input
dataCell.clearViewData(index);
// Redraw the table.
table.redraw();
}
@Override
public void update(int index, RowDTO object, String value){
// TODO Auto-generated method stub
}
包含标签和行数据的行类及其数据验证类
public class RowDTO{
private final int index;
private Vector<Object> rowData;
private RowValidation validation;
private boolean editable;
public RowDTO(int index, Vector<Object> rowData, int type){
this.index=index;
this.rowData=rowData;
this.validation=buildValidation(index,type);
}
public int getIndex(){
return index;
}
public Vector<Object> getRowData(){
return rowData;
}
public RowValidation getValidation(){
return validation;
}
public String getRowData(int column){
return rowData.get(column).toString();
}
public String getLabel(){
return rowData.get(0).toString();
}
public void setRowData(int column, String newVal){
this.rowData.set(column,newVal);
}
/** Assign a vaildation and editing strategy based on the table type and the row */
private RowValidation buildValidation(int index, int type){
switch(type){
case TableDTO.FIXEDCOST:
switch(index){
case 0:
editable=true;
return RowValidation.getPositiveDouble();
case 1:
editable=true;
return RowValidation.getPositiveInt();
case 2:
editable=true;
return RowValidation.getPositivePercent();
default:
editable=true;
return RowValidation.getPositiveDouble();
}
default:
editable=true;
return RowValidation.getPositiveDouble();
}
}
public boolean isEditable(){
return editable;
}
public class RowValidation{
/* Is double (else is int) */
private boolean digit=true;
/* Values permitted */
private boolean positive=true;
private boolean negative=true;
private boolean zero=true;
private boolean maxEnabled=false;
private double maxValue=2;
/** Default constructor: double number, can be positive, negative or zero, no maximum */
public RowValidation(){}
/**
* @param digit: true if double, false if int
* @param positive: true if can be positive
* @param negative: true if can be negative
* @param zero: true if can be zero
* @param maxEnabled: true if can has maximum
* @param maxValue: maximum value if has maximum
*/
public RowValidation(boolean digit, boolean positive, boolean negative, boolean zero, boolean maxEnabled,
double maxValue){
this.digit=digit;
this.positive=positive;
this.negative=negative;
this.zero=zero;
this.maxEnabled=maxEnabled;
this.maxValue=maxValue;
}
public boolean isDigit(){
return digit;
}
public boolean isPositive(){
return positive;
}
public boolean isNegative(){
return negative;
}
public boolean isZero(){
return zero;
}
public boolean isMaxEnabled(){
return maxEnabled;
}
public double getMaxValue(){
return maxValue;
}
/** Positive or zero Integer */
public static RowValidation getPositiveInt(){
return new RowValidation(false,true,false,true,false,2);
}
/** Positive or zero double */
public static RowValidation getPositiveDouble(){
return new RowValidation(true,true,false,true,false,2);
}
/** Positive double belonging to [0,1] */
public static RowValidation getPositivePercent(){
return new RowValidation(true,true,false,true,true,1);
}
包含行列表的 Table 类:
public class TableDTO{
public static final int FIXEDCOST=0;
private ArrayList<RowDTO> rows;
private Vector<String> headers;
public TableDTO(Vector<Vector<Object>> roughData, Vector<String> headers, int type){
this.headers=headers;
rows=buildRows(roughData,type);
}
private ArrayList<RowDTO> buildRows(Vector<Vector<Object>> roughData, int type){
int nb=roughData.size();
ArrayList<RowDTO> result=new ArrayList<RowDTO>(nb);
for(int i=0;i<nb;i++){
result.add(new RowDTO(i,roughData.get(i),type));
}
return result;
}
public ArrayList<RowDTO> getRows(){
return rows;
}
public RowDTO getRow(int index){
return rows.get(index);
}
public boolean isRowEditable(int index){
return getRow(index).isEditable();
}
public String getHeader(int column){
return headers.get(column);
}
把所有东西放在一起的面板
public class TablePanel extends Composite{
private VerticalPanel main=new VerticalPanel();
private HorizontalPanel btns=new HorizontalPanel();
private Button commitButton=new Button("commit");
private Button redrawButton=new Button("redraw");
private List<DataChange> pendingChanges=new ArrayList<DataChange>();
private CellTable<RowDTO> table;
private TableDTO dataDTO;
/**
* The key provider that allows us to identify data points even if a field changes.
*/
private static final ProvidesKey<RowDTO> KEY_PROVIDER=new ProvidesKey<RowDTO>(){
@Override
public Object getKey(RowDTO item){
return item.getIndex();
}
};
@SuppressWarnings({"unchecked"})
public TablePanel(Vector<Vector<Object>> roughData, Vector<String> headers, int type){
dataDTO=new TableDTO(roughData,headers,type);
// Create a CellTable with a key provider.
table=new CellTable<RowDTO>(KEY_PROVIDER);
table.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED);
// Label
LabelColumn2 nameColumn=new LabelColumn2();
table.addColumn(nameColumn,"Label");
redrawButton.addClickHandler(new ClickHandler(){
@Override
public void onClick(ClickEvent event){
// Delete temporary changes
pendingChanges.clear();
// Redraw table
table.setRowData(0,dataDTO.getRows());
table.redraw();
}
});
commitButton.addClickHandler(new ClickHandler(){
@Override
public void onClick(ClickEvent event){
// Commit the changes.
for(DataChange pendingChange: pendingChanges){
pendingChange.doCommit();
}
pendingChanges.clear();
// Push the changes to the views.
table.setRowData(0,dataDTO.getRows());
table.redraw();
}
});
// myData.getCol();
for(int i=1;i<5;i++){
// Create cell
DataCell2 dataCell=new DataCell2(dataDTO);
// Add a column for every data points.
@SuppressWarnings({"rawtypes"})
DataColumn2<DataCell2> dataColumn=new DataColumn2(i,dataCell){
@Override
public String getValue(RowDTO object){
String newVal=object.getRowData(col);
return format(object,newVal);
}
};
// Add a field updater to be notified when the user enters a new value.
dataColumn.setFieldUpdater(new DataUpdater2(i,table,dataCell){
@Override
public void update(int index, RowDTO object, String value){
// Called when the user changes the value.
if(isValidValue(index,value)){
pendingChanges.add(new DataChange(this.col,object,value));
// TODO kill once ok
int s=pendingChanges.size();
String ss=object.getRowData(col);
Window.alert("Value in myData="+ss+", nb pending changes="+s);
}else{
/* clear the view data and redraw the table */
this.clear(index);
// Alert user: TODO restablish once ok
// Window.alert("Invalid input");
// TODO kill once ok
int s=pendingChanges.size();
String ss=object.getRowData(col);
Window.alert("Value in myData="+ss+", nb pending changes="+s);
}
}
});
table.addColumn(dataColumn,dataDTO.getHeader(i));
}
// Set the total row count. This isn't strictly necessary, but it affects
// paging calculations, so its good habit to keep the row count up to date.
table.setRowCount(dataDTO.getRows().size(),true);
// Push the data into the widget.
table.setRowData(0,dataDTO.getRows());
// Add it to the root panel.
main.add(table);
btns.add(commitButton);
btns.add(redrawButton);
main.add(btns);
initWidget(main);
}
/* Formatting */
private String format(RowDTO row, String value){
RowValidation rv=row.getValidation();
if(rv.isDigit()){
if(rv.isMaxEnabled()){
return formatAsPercent(value);
}else{
return formatAsDouble(value);
}
}else{
return formatAsInt(value);
}
}
private static String formatAsDouble(String val){
try{
double value=Double.parseDouble(val);
NumberFormat fmt=NumberFormat.getDecimalFormat();
fmt.overrideFractionDigits(2,2);
String formatted=fmt.format(value);
return formatted;
}catch(NumberFormatException e){
// TODO
return val;
}
}
private static String formatAsInt(String val){
try{
double value=Double.parseDouble(val);
NumberFormat fmt=NumberFormat.getDecimalFormat();
fmt.overrideFractionDigits(0,0);
String formatted=fmt.format(value);
return formatted;
}catch(NumberFormatException e){
// TODO
return val;
}
}
private static String formatAsPercent(String val){
try{
double value=Double.parseDouble(val);
NumberFormat fmt=NumberFormat.getPercentFormat();
fmt.overrideFractionDigits(2,2);
String formatted=fmt.format(value);
return formatted;
}catch(NumberFormatException e){
// TODO
return val;
}
}
private boolean isValidValue(int index, String data){
/* if data formatted as pct, convert into double */
if(data.endsWith("%")){
data=data.substring(0,data.length()-2);
try{
double v=Double.parseDouble(data);
v=v/100;
data=Double.toString(v);
}catch(NumberFormatException e){
return false;
}
}
RowDTO row=dataDTO.getRow(index);
RowValidation validation=row.getValidation();
if(validation.isDigit()){
double val;
try{
val=Double.parseDouble(data);
}catch(Exception e){
return false;
}
if(val>0&&!validation.isPositive()){ return false; }
if(val<0&&!validation.isNegative()){ return false; }
if(val==0&&!validation.isZero()){ return false; }
if(validation.isMaxEnabled()&&val>validation.getMaxValue()){ return false; }
}else{
int val;
try{
val=Integer.parseInt(data);
}catch(Exception e){
return false;
}
if(val>0&&!validation.isPositive()){ return false; }
if(val<0&&!validation.isNegative()){ return false; }
if(val==0&&!validation.isZero()){ return false; }
if(validation.isMaxEnabled()&&val>validation.getMaxValue()){ return false; }
}
return true;
}
private class DataChange{
private final RowDTO object;
private final String value;
private final int col;
public DataChange(int col, RowDTO object, String value){
this.object=object;
this.value=value;
this.col=col;
}
public void doCommit(){
object.setRowData(col,value);
}
}
以及入口点方法:
public class Mpp implements EntryPoint{
/** Entry point method. */
@Override
public void onModuleLoad(){
int a=3;
int b=13;
Vector<Vector<Object>> roughData=new Vector<Vector<Object>>(a);
Vector<String> headers=new Vector<String>(b);
Vector<Object> r0=new Vector<Object>(b);
Vector<Object> r1=new Vector<Object>(b);
Vector<Object> r2=new Vector<Object>(b);
r0.add("Amount (double)");
r1.add("Credit (int)");
r2.add("Advance (%)");
headers.add("Col ");
for(int i=1;i<b;i++){
headers.add("Col "+(i));
r0.add(i*1.2);
r1.add(i);
r2.add(i/100);
}
roughData.add(r0);
roughData.add(r1);
roughData.add(r2);
TablePanel panel=new TablePanel(roughData,headers,TableDTO.FIXEDCOST);
RootPanel.get().add(panel);
}
最佳答案
据我所知,您的任务不是显示来自数据库等的数据,您只是想要一个漂亮的 13 x 3 表格中的数据,对吧?在那种情况下,我建议根本不要使用 CellTable
,而是简单地制作一堆小部件,然后您可以使用 FlexTable
进行布局;这应该更容易控制。
关于java - 显示财务数据的 GWT 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15451443/
初学者 android 问题。好的,我已经成功写入文件。例如。 //获取文件名 String filename = getResources().getString(R.string.filename
我已经将相同的图像保存到/data/data/mypackage/img/中,现在我想显示这个全屏,我曾尝试使用 ACTION_VIEW 来显示 android 标准程序,但它不是从/data/dat
我正在使用Xcode 9,Swift 4。 我正在尝试使用以下代码从URL在ImageView中显示图像: func getImageFromUrl(sourceUrl: String) -> UII
我的 Ubuntu 安装 genymotion 有问题。主要是我无法调试我的数据库,因为通过 eclipse 中的 DBMS 和 shell 中的 adb 我无法查看/data/文件夹的内容。没有显示
我正在尝试用 PHP 发布一些 JSON 数据。但是出了点问题。 这是我的 html -- {% for x in sets %}
我观察到两种方法的结果不同。为什么是这样?我知道 lm 上发生了什么,但无法弄清楚 tslm 上发生了什么。 > library(forecast) > set.seed(2) > tts lm(t
我不确定为什么会这样!我有一个由 spring data elasticsearch 和 spring data jpa 使用的类,但是当我尝试运行我的应用程序时出现错误。 Error creatin
在 this vega 图表,如果我下载并转换 flare-dependencies.json使用以下 jq 到 csv命令, jq -r '(map(keys) | add | unique) as
我正在提交一个项目,我必须在其中创建一个带有表的 mysql 数据库。一切都在我这边进行,所以我只想检查如何将我所有的压缩文件发送给使用不同计算机的人。基本上,我如何为另一台计算机创建我的数据库文件,
我有一个应用程序可以将文本文件写入内部存储。我想仔细看看我的电脑。 我运行了 Toast.makeText 来显示路径,它说:/数据/数据/我的包 但是当我转到 Android Studio 的 An
我喜欢使用 Genymotion 模拟器以如此出色的速度加载 Android。它有非常好的速度,但仍然有一些不稳定的性能。 如何从 Eclipse 中的文件资源管理器访问 Genymotion 模拟器
我需要更改 Silverlight 中文本框的格式。数据通过 MVVM 绑定(bind)。 例如,有一个 int 属性,我将 1 添加到 setter 中的值并调用 OnPropertyChanged
我想向 Youtube Data API 提出请求,但我不需要访问任何用户信息。我只想浏览公共(public)视频并根据搜索词显示视频。 我可以在未经授权的情况下这样做吗? 最佳答案 YouTube
我已经设置了一个 Twilio 应用程序,我想向人们发送更新,但我不想回复单个文本。我只是想让他们在有问题时打电话。我一切正常,但我想在发送文本时显示传入文本,以确保我不会错过任何问题。我正在使用 p
我有一个带有表单的网站(目前它是纯 HTML,但我们正在切换到 JQuery)。流程是这样的: 接受用户的输入 --- 5 个整数 通过 REST 调用网络服务 在服务器端运行一些计算...并生成一个
假设我们有一个名为 configuration.js 的文件,当我们查看内部时,我们会看到: 'use strict'; var profile = { "project": "%Projec
这部分是对 Previous Question 的扩展我的: 我现在可以从我的 CI Controller 成功返回 JSON 数据,它返回: {"results":[{"id":"1","Sourc
有什么有效的方法可以删除 ios 中 CBL 的所有文档存储?我对此有疑问,或者,如果有人知道如何从本质上使该应用程序像刚刚安装一样,那也会非常有帮助。我们正在努力确保我们的注销实际上将应用程序设置为
我有一个 Rails 应用程序,它与其他 Rails 应用程序通信以进行数据插入。我使用 jQuery $.post 方法进行数据插入。对于插入,我的其他 Rails 应用程序显示 200 OK。但在
我正在为服务于发布请求的 API 调用运行单元测试。我正在传递请求正文,并且必须将响应作为帐户数据返回。但我只收到断言错误 注意:数据是从 Azure 中获取的 spec.js const accou
我是一名优秀的程序员,十分优秀!