Я исправил проблему с помощью этого простого кода. (Я поделился этим кодом для вас)
public class Information {
private String name ;
private String family ;
// constructor
// Getter & Setter
// override equal and hashCode
}
Это простая услуга. (Я смоделировал базу данных для этого класса)
@Stateless
public class InformationService {
private static final List<Information> db = new ArrayList<>();
@Inject
@Push(channel = "infoChannel")
PushContext push;
@PostConstruct
public void init() {
Information userA = new Information("John", "Vankate");
Information userB = new Information("Julius", "Sampao");
db.add(userA);
db.add(userB);
}
public void remove(Information info) {
db.remove(info);
push.send("deleteInfo");
}
public List<Information> findAll() {
return db;
}
}
и простые ресурсы JaxRs:
@Path("/info")
@RequestScoped
public class InformationResources {
@EJB
private InformationService informationService;
@Path("/delete")
@POST
@Consumes("application/json")
public String send(Information information) {
informationService.remove(information);
return "Receive : " + information;
}
}
Теперь запустите JSF:
@Named
@ViewScoped
public class InformationBean implements Serializable {
private Information info ;
private List<Information> informationList ;
@EJB
private InformationService informationService ;
@PostConstruct
public void init() {
informationList = informationService.findAll();
info = new Information() ;
}
public void deleteInformation() {
informationService.remove(info);
}
public Information getInfo() {
return info;
}
public void setInfo(Information info) {
this.info = info;
}
public List<Information> getInformationList() {
return informationList;
}
public void setInformationList(List<Information> informationList) {
this.informationList = informationList;
}
}
и xhtml:
<h:body>
<p:dataTable value="#{informationBean.informationList}" var="info" id="infoTable">
<p:column rowHeader="name">
<h:outputText value="#{info.name}"/>
</p:column>
<p:column rowHeader="family">
<h:outputText value="#{info.family}"/>
</p:column>
<p:column rowHeader="action">
<h:form>
<p:commandButton value="Delete" action="#{informationBean.deleteInformation}">
<f:setPropertyActionListener value="#{info}" target="#{informationBean.info}"/>
</p:commandButton>
</h:form>
</p:column>
</p:dataTable>
<hr/>
<f:websocket channel="infoChannel">
<p:ajax event="deleteInfo" update="infoTable"/>
</f:websocket>
</h:body>
Я уже думал, что PushContext должен быть реализован на бинах JSF. Теперь я понимаю, что можно реализовать это на уровне сервисной или бизнес-логики .
Теперь вы может удалить информацию из JaxR (Rest API) и удалить запись из p:dataTable
без страницы обновления.
Примечание: в этом примере используется @ViewScoped
При установке Свойства шрифта на TabPage Вы устанавливаете стандартный шрифт для всех средств управления на той вкладке. Вы не устанавливаете его для заголовка, как бы то ни было.
Когда Вы выполняете следующий код:
tabControl.TabPages(index).Font = New Font(Me.Font, FontStyle.Bold)
Любые средства управления на той странице теперь будут полужирными по умолчанию, который не является (я принимаю), что Вы хотите.
Шрифтом заголовка (то есть, сама вкладка) управляет Свойство шрифта TabControl. Если необходимо было изменить код на:
tabControl.Font = New Font(Me.Font, FontStyle.Bold)
Вы будете видеть это в действии. Однако это изменяет шрифт для всех демонстрирующихся вкладок, который является также не, я принимаю, что Вы хотите.
Так, с помощью управления вкладкой WinForms по умолчанию Вы (я верю), ограниченный техникой в ссылке, которую Вы отправили. С другой стороны, можно начать смотреть на сторонние средства управления, такие как обсужденные в они вопросы на StackOverflow.
Простой способ дать различные маркировки средств управления вкладки в зависимости от значения поля состоит в том, чтобы изменить саму подпись:
Например:
Private Sub Form_Current()
If IsNull(Me.Subform.Form.Field_Name) Then
Me.Tab_Name.Caption = "Tab One"
Else
Me.Tab_Name.Caption = "Tab One +++"
End If
End Sub