我的Vaadin表在首次显示时看起来像这样:
请注意,最后三列中较长的数字会被切断。如果我在1年和2年之间移动线,则长数字会正确显示,也就是说,它们在该列中右对齐。该程序不设置任何列的任何大小。所以我的第一个问题是如何正确创建表(或添加数据),以便它允许足够的空间。
如果我点击"更多内容"它看起来像这样:
最后三列中的附加信息被截断,因为它比已存在的信息更长。所以我的第二个问题是如何让桌子再次出现,以便它有足够的空间容纳其内容。
我不知道提前在这些列中输入数据的宽度;如果我可以从数据中获取宽度,我不想在程序中设置像素值。似乎有一些规定,因为第二列更宽,以适应其更广泛的数据,没有该计划的帮助。
所涉及的课程如下:
TableUI2
package com.mycompany.vaadin3;
import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.data.Property;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Layout;
import com.vaadin.ui.OptionGroup;
import com.vaadin.ui.Table;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.themes.ValoTheme;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.annotation.WebServlet;
@Theme("mytheme")
public class TableUI2 extends UI{
private static String COL1 = "Col 1";
private static String COL2 = "Col 2";
private static String COL3 = "Col 3";
private static String TERM1 = "1 Year";
private static String TERM2 = "2 Year";
private static String TERM3 = "3 Year";
private static String LESS_STUFF = "Less stuff";
private static String MORE_STUFF = "More Stuff";
private ResizableTable table = null;
private ArrayList<DataRow> rowList = null;
private OptionGroup moreOrLessOption = null;
final private List<Label> hiddenLabels = new ArrayList<>();
@Override
protected void init(VaadinRequest vaadinRequest) {
final VerticalLayout pageLayout = new VerticalLayout();
moreOrLessOption = createOptionGroup();
Layout optionsPanelLayout = new HorizontalLayout();
optionsPanelLayout.addComponents(moreOrLessOption);
rowList = new DataLoader().getRowList();
table = createTable(rowList);
pageLayout.addComponents(optionsPanelLayout, table);
setContent(pageLayout);
}
private OptionGroup createOptionGroup()
{
OptionGroup newGroup = new OptionGroup("");
newGroup.setMultiSelect(false);
newGroup.addItems(LESS_STUFF, MORE_STUFF);
newGroup.addValueChangeListener
( new Property.ValueChangeListener()
{
@Override
public void valueChange(Property.ValueChangeEvent event)
{
// depending on the value of the option, show more or less
boolean showMore = getShowMore(newGroup);
for (Label label: hiddenLabels)
{
label.setVisible(showMore);
}
table.setColumnWidth(COL1, -1);
table.setColumnWidth(COL2, -1);
table.setColumnWidth(COL3, -1);
}
}
);
return newGroup;
}
private boolean getShowMore(OptionGroup mrcOption) throws RuntimeException
{
boolean result = false;
String value = mrcOption.getValue().toString();
switch(value)
{
case "Less stuff": break;
case "More Stuff": result = true; break;
default: throw new RuntimeException("OOPS! -- illegal mrcOption value");
}
return result;
}
private ResizableTable createTable(ArrayList<DataRow> rowList)
{
ResizableTable newTable = createNewTable();
int listIndex = 0;
for (DataRow row : rowList)
{
VerticalLayout c1 = getVerticalLayout(row.getBandwidth());
VerticalLayout c2 = getVerticalLayout(row.getService());
VerticalLayout c3 = getVerticalLayout(row.getProvider());
List<Layout> termLayouts = new ArrayList<>();
for (int i=1; i<=3; i++)
{
Layout termLayout = getTermLayout(1, row, hiddenLabels);
termLayouts.add(termLayout);
}
newTable.addItem
(new Object[]
{
c1,
c2,
c3,
termLayouts.get(0),
termLayouts.get(1),
termLayouts.get(2)
},
listIndex++
);
}
return newTable;
}
private VerticalLayout getVerticalLayout(String s)
{
VerticalLayout vl = new VerticalLayout();
Label l = new Label(s);
l.setSizeUndefined();
vl.addComponents(l);
vl.setComponentAlignment(l,Alignment.TOP_LEFT);
return vl;
}
private Layout getTermLayout(int term, DataRow row, List<Label> costLabels)
{
// get charge data
String charge = null;
switch (term)
{
case 1: charge = row.getOneYearMRCCharge(); break;
case 2: charge = row.getOneYearMRCCharge(); break;
case 3: charge = row.getOneYearMRCCharge(); break;
}
Label chargeLabel = new Label(charge);
// get cost data
String cost = null;
switch (term)
{
case 1: cost = row.getOneYearMRCCost(); break;
case 2: cost = row.getOneYearMRCCost(); break;
case 3: cost = row.getOneYearMRCCost(); break;
}
String percentage = getPercentage(cost, charge);
String costString = String.format("(%s) %s", percentage, cost);
Label costLabel = new Label(costString);
costLabel.setVisible(false);
costLabel.addStyleName("pricingtablecost");
costLabels.add(costLabel); // put in list so we can hide/reveal it later.
VerticalLayout result = new VerticalLayout();
result.setSizeFull();
result.addComponents(chargeLabel, costLabel);
chargeLabel.setSizeUndefined();
costLabel.setSizeUndefined();
result.setComponentAlignment(chargeLabel, Alignment.TOP_RIGHT);
result.setComponentAlignment(costLabel, Alignment.TOP_RIGHT);
return result;
}
private String getPercentage(String numerator, String denominator)
{
double num = Double.parseDouble(numerator);
double denom = Double.parseDouble(denominator);
double percentage = (denom - num) / denom * 100;
String pString = String.format("%5.1f%%", percentage);
return pString;
}
@WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true)
@VaadinServletConfiguration(ui = TableUI2.class, productionMode = false)
public static class MyUIServlet extends VaadinServlet {
}
private ResizableTable createNewTable()
{
table = new ResizableTable();
table.setSelectable(true);
table.setImmediate(true);
table.addStyleName(ValoTheme.TABLE_COMPACT);
table.addStyleName(ValoTheme.TABLE_NO_HORIZONTAL_LINES);
table.setColumnReorderingAllowed(true);
table.setColumnCollapsingAllowed(true);
table.setPageLength(0); // no scrolling for table alone.
table.addContainerProperty(COL1, Layout.class, null);
table.addContainerProperty(COL2, Layout.class, null);
table.addContainerProperty(COL3, Layout.class, null);
table.addContainerProperty(TERM1, Layout.class, null);
table.addContainerProperty(TERM2, Layout.class, null);
table.addContainerProperty(TERM3, Layout.class, null);
table.setColumnAlignment(COL1, Table.Align.CENTER);
table.setColumnAlignment(TERM1, Table.Align.RIGHT);
table.setColumnAlignment(TERM2, Table.Align.RIGHT);
table.setColumnAlignment(TERM3, Table.Align.RIGHT);
table.setColumnWidth(COL1, -1);
table.setColumnWidth(COL2, -1);
table.setColumnWidth(COL3, -1);
table.setColumnWidth(TERM1, -1);
table.setColumnWidth(TERM2, -1);
table.setColumnWidth(TERM3, -1);
return table;
}
}
的DataLoader
package com.mycompany.vaadin3;
import java.util.ArrayList;
/**
* @author rcook
*/
public class DataLoader {
public ArrayList<DataRow> getRowList()
{
ArrayList<DataRow> rowList = new ArrayList<>();
rowList.add(new DataRow("ABCDE", "This thing", "one two", "326.91", "175.76" ));
rowList.add(new DataRow("", "", "four five six", "1514.11", "282.48"));
rowList.add(new DataRow("FGHIJ", "This thing", "seven eight", "523.29", "287.52"));
rowList.add(new DataRow("", "", "nine ten", "2926.20", "520.33"));
return rowList;
}
}
的DataRow:
package com.mycompany.vaadin3;
public class DataRow {
private String bandwidth;
private String provider;
private String oneYearMRCCharge;
private String oneYearMRCCost;
private String service;
public String getBandwidth() {
return bandwidth;
}
public void setBandwidth(String bandwidth) {
this.bandwidth = bandwidth;
}
public String getProvider() {
return provider;
}
public void setProvider(String provider) {
this.provider = provider;
}
public String getOneYearMRCCharge() {
return oneYearMRCCharge;
}
public void setOneYearMRCCharge(String oneYearMRCCharge) {
this.oneYearMRCCharge = oneYearMRCCharge;
}
public String getOneYearMRCCost() {
return oneYearMRCCost;
}
public void setOneYearMRCCost(String oneYearMRCCost) {
this.oneYearMRCCost = oneYearMRCCost;
}
public String getService() {
return service;
}
public void setService(String service) {
this.service = service;
}
public DataRow() {}
public DataRow(String bandwidth, String provider, String service, String charge, String cost) {
setBandwidth(bandwidth);
setOneYearMRCCharge(charge);
setOneYearMRCCost(cost);
setProvider(provider);
setService(service);
}
}
ResizableTable - 我试过的一件事是触发了一个propertySetChange,但是没有用。
package com.mycompany.vaadin3;
import com.vaadin.ui.Table;
/**
* @author rcook
*/
public class ResizableTable extends Table {
public void resize() { firePropertySetChange(); }
}