- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有一个文本框,我想在我的 apache tomcat 7 服务器上用作 ZK 中的控制台形式。现在,当其内容以编程方式更改时,它不会更新,但我只想这样做。每当我的java更改字符串时,它都应该及时显示它,但是如何呢?
(修改了ZK的现有代码)
我的index.zul:
<zk>
<window id="PDFmodifier" border="normal" height="98%"
apply="org.zkoss.bind.BindComposer"
viewModel="@id('vm') @init('toolbox.pdfconverter.FileUploadVM')">
<label value="PDFmodifier"/>
<separator></separator>
<separator></separator>
<hbox>
<label value="Console log: " />
<textbox width="500px" height="400px" id="txt" readonly="true" multiline ="true" value="Press the Upload Button to upload any PDF file. PDFmodifier will cover the unwanted area. After processing, the showPDF button will be active and you can save the modified PDF"/>
<button label="Upload" upload="true"
onUpload="@command('onUploadPDF',upEvent=event)"> </button>
<button label="Show PDF" visible="@load(vm.fileuploaded)"
onClick="@command('showPDF')">
</button>
</hbox>
<iframe height="100%" width="100%" id="reportframe"
content="@bind(vm.fileContent)">
</iframe>
</window>
View 模型:
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Calendar;
import org.zkoss.bind.BindContext;
import org.zkoss.bind.annotation.AfterCompose;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.ContextParam;
import org.zkoss.bind.annotation.ContextType;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.io.Files;
import org.zkoss.util.media.AMedia;
import org.zkoss.util.media.Media;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.UploadEvent;
import org.zkoss.zk.ui.select.Selectors;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;
public class FileUploadVM {
private String filePath;
private boolean fileuploaded = false;
AMedia fileContent;
@Wire("#test")
private Window win;
@Wire("#txt")
Textbox txt;
public AMedia getFileContent() {
return fileContent;
}
public void setFileContent(AMedia fileContent) {
this.fileContent = fileContent;
}
public boolean isFileuploaded() {
return fileuploaded;
}
public void setFileuploaded(boolean fileuploaded) {
this.fileuploaded = fileuploaded;
}
@AfterCompose
public void initSetup(@ContextParam(ContextType.VIEW) Component view) {
Selectors.wireComponents(view, this, false);
Executions.getCurrent().getDesktop().getWebApp().getConfiguration().setMaxUploadSize(10 * 1024);//for larger files
}
@Command
@NotifyChange("fileuploaded")
public void onUploadPDF(
@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx)
throws IOException {
UploadEvent upEvent = null;
Object objUploadEvent = ctx.getTriggerEvent();
if (objUploadEvent != null && (objUploadEvent instanceof UploadEvent)) {
upEvent = (UploadEvent) objUploadEvent;
}
if (upEvent != null) {
Media media = upEvent.getMedia();
Calendar now = Calendar.getInstance();
int year = now.get(Calendar.YEAR);
int month = now.get(Calendar.MONTH);
int day = now.get(Calendar.DAY_OF_MONTH);
int min = now.get(Calendar.MINUTE);
String fileName = year+"_"+month+"_"+day+"_"+min+".pdf";
filePath = Executions.getCurrent().getDesktop().getWebApp().getRealPath("/");
filePath = filePath + fileName;
System.out.println("filePath='"+filePath+"'");
Files.copy(new File(filePath), media.getStreamData());
PDFmodifier mod = new PDFmodifier(txt);//txt
filePath = mod.start(filePath);
System.out.println("Ergbnis-pfad='"+filePath+"'");
Messagebox.show("File Sucessfully altered. Press \"Show PDF\" to download file.");
fileuploaded = true;
}
}
@Command
@NotifyChange("fileContent")
public void showPDF() throws IOException {
File f = new File(filePath);
byte[] buffer = new byte[(int) f.length()];
FileInputStream fs = new FileInputStream(f);
fs.read(buffer);
fs.close();
ByteArrayInputStream is = new ByteArrayInputStream(buffer);
fileContent = new AMedia("report", "pdf", "application/pdf", is);
}
}
大大减少了java代码(虽然多了很多,但这个问题不需要):
import org.zkoss.zul.Textbox;
public class PDFmodifier {
String logText ="";
Textbox text;
public PDFmodifier(Textbox t)
{
text = t;
}
protected void printToTextbox(String txt)
{
logText += "\n"+txt;
text.setValue(logText);
}
}
一切正常,但我想改进它。感谢您提前阅读。
编辑:
索引.zul
<zk xmlns:n="native" xmlns:c="client">
<?page title="RemoveKlausNote" ?>
<window id="RemoveKlausNote"
apply="org.zkoss.bind.BindComposer"
viewModel="@id('vm') @init('toolbox.pdfconverter.FileUploadVM')"
title="Bioinfo Teaching Toolbox" border="normal" width="1000px" position="center,top" mode="embedded">
<hbox>
<label value="Console log: " />
<textbox width="500px" height="200px" readonly="true" value="@bind(vm.getLogText())" multiline ="true"/>
<button label="Upload" upload="true"
onUpload="@command('onUploadPDF',upEvent=event)"> </button>
<button label="Show PDF" visible="@load(vm.fileuploaded)"
onClick="@command('showPDF')">
</button>
</hbox>
<iframe height="100%" width="100%" id="reportframe"
content="@bind(vm.fileContent)">
</iframe>
</window>
View 模型:
public class FileUploadVM {
private String filePath;
private boolean fileuploaded = false;
AMedia fileContent;
@Wire("#test")
private Window win;
LogText logText = new LogText();
public AMedia getFileContent() {
return fileContent;
}
public void setFileContent(AMedia fileContent) {
this.fileContent = fileContent;
}
public boolean isFileuploaded() {
return fileuploaded;
}
public void setFileuploaded(boolean fileuploaded) {
this.fileuploaded = fileuploaded;
}
@AfterCompose
public void initSetup(@ContextParam(ContextType.VIEW) Component view) {
Selectors.wireComponents(view, this, false);
Executions.getCurrent().getDesktop().getWebApp().getConfiguration().setMaxUploadSize(10 * 1024);//for larger files
}
@NotifyChange("logText.log")
public void setLogText(String text) {
logText.setLog(text);
}
@NotifyChange("logText.log")
public String getLogText()
{
return logText.getLog();
}
@Command
@NotifyChange("fileuploaded")
public void onUploadPDF(
@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx)
throws IOException {
UploadEvent upEvent = null;
Object objUploadEvent = ctx.getTriggerEvent();
if (objUploadEvent != null && (objUploadEvent instanceof UploadEvent)) {
upEvent = (UploadEvent) objUploadEvent;
}
if (upEvent != null) {
Media media = upEvent.getMedia();
String webAppPath = Executions.getCurrent().getDesktop().getWebApp().getRealPath("/");
System.out.println("webAppPath='"+webAppPath+"'");
Calendar now = Calendar.getInstance();
int year = now.get(Calendar.YEAR);
int month = now.get(Calendar.MONTH);
int day = now.get(Calendar.DAY_OF_MONTH);
int min = now.get(Calendar.MINUTE);
String originalName = media.getName();
String fileName = originalName +year+"_"+month+"_"+day+"_"+min+".pdf";
String tmpPath = PDFmodifier.getTemp();
if (!tmpPath.endsWith(File.separatorChar+"")) tmpPath = tmpPath + File.separator;
filePath = tmpPath + fileName;
System.out.println("filePath='"+filePath+"'");
Files.copy(new File(filePath), media.getStreamData());
filePath = new PDFmodifier(logText).start(filePath);
System.out.println("Ergbnis-pfad='"+filePath+"'");
Messagebox.show("File Sucessfully altered. Press \"Show PDF\" to download file.");
fileuploaded = true;
}
}
LogText 对象:
public class LogText {
public String log;
public LogText()
{
log ="Press the Upload Button to upload any PDF file. PDFmodifier will cover the unwanted area. After processing, the showPDF button will be active and you can save the modified PDF";
}
public void setLog(String txt)
{
log += "\n"+txt;
}
public String getLog()
{
return log;
}
}
PDFmodifier(我不妨展示我的核心方法 start()):
protected void printToTextbox(String txt)
{
log.setLog("\n"+txt);
}
public String start(String uploadFile) throws IOException
{
setStringVariables(uploadFile);
System.out.println("Processing inputFile='"+inputFile+"'");
File f = new File(inputFile);
if (!f.exists()) {
System.err.println("inputFile not found)");
return null;
}
long startTime = System.currentTimeMillis();
//file can be opened and normally processed
if(accessChecker(inputFile)){
coverWithRectangle(inputFile, outputFile) ;
return outputFile;
}
//file needs further work
else
{
printToTextbox("Accessing PDFsam for split...");
if (createDirectory(outputDir)) {
long startTimeSplit = System.currentTimeMillis();
boolean splitOk = splitPDF(inputFile, outputDir);
long endTimeSplit = System.currentTimeMillis();
printToTextbox("Time for splitting [ms]: "+(endTimeSplit-startTimeSplit));
if (!splitOk) {
printToTextbox("PDF couldn't be split. Exiting.");
return null;
}
else
{
long startTimeMerge = System.currentTimeMillis();
boolean mergeOk = mergePDF(getAllFiles(),tempPDF,tempCSV);
long endTimeMerge = System.currentTimeMillis();
printToTextbox("Time for merging [ms]: "+(endTimeMerge-startTimeMerge));
if (mergeOk) {
coverWithRectangle(tempPDF, outputFile);
deleteTrash();
} else {
printToTextbox("ERROR: merge failed!");
}
}
}
writeLog(outputFile);
long endTime = System.currentTimeMillis();
printToTextbox("Total time needed [ms]: "+(endTime-startTime));
printToTextbox("outputFile='"+outputFile+"'");
return outputFile;
}
编辑2:
祖尔:
<textbox width="500px" height="200px" readonly="true" value="@bind(vm.logText)" multiline ="true"/>
<timer id="timer" delay="50" repeats="true" onTimer="@command('refreshTextbox')" />
View 模型:
String logText;
LogText log = new LogText();
@NotifyChange("logText")
public void setLogText(String txt)
{
log.log ="\n"+txt;
logText = log.log;
}
@NotifyChange("logText")
public String getLogText()
{
logText = log.log;
return logText;
}
@Command
public void refreshTextbox()
{
logText = log.log;
BindUtils.postNotifyChange(null,null,this,"logText");
}
View 模型将 Textlog 对象传递给 Pdfmodifier 的新实例。一次绝望的尝试来解决这个问题。
最佳答案
您正在混合 2 种类型:MVVM 和 MVC。窗口和文本框采用MVC方式使用。
您可以更轻松地做到这一点:
在您的虚拟机中创建:
private String textField = "Press the Upload Button to upload any PDF file. PDFmodifier will cover the unwanted area. After processing, the showPDF button will be active and you can save the modified PDF";
并提供 getter 和 setter。
在 View 模型中更改为:
<textbox width="500px" height="400px" id="txt" readonly="true" multiline ="true" value=@bind(vm.textField)"/>
现在,当想要将更改保留到 GUI 时,您可以使用
@NotifyChange("textField")
但这仅适用于 setter 和命令。
您可以在 View 模型中使用其他方法来完成此操作,例如:
BindUtils.postNotifyChange(null,null,this,"textField");
如果您的文本框需要在文件上传繁忙时多次更新,则需要单独的线程。
如果没有,你就快到了:
public void setLogText(String text) {
logText.setLog(text);
}
public String getLogText() {
return logText.getLog();
}
删除了此处的通知更改,不需要,也是显示文本的完美解决方案。
@Command
@NotifyChange({"fileuploaded","logText"})
public void onUploadPDF(
@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx)
throws IOException {
UploadEvent upEvent = null;
Object objUploadEvent = ctx.getTriggerEvent();
if (objUploadEvent != null && (objUploadEvent instanceof UploadEvent)) {
upEvent = (UploadEvent) objUploadEvent;
}
if (upEvent != null) {
Media media = upEvent.getMedia();
String webAppPath = Executions.getCurrent().getDesktop().getWebApp().getRealPath("/");
System.out.println("webAppPath='"+webAppPath+"'");
Calendar now = Calendar.getInstance();
int year = now.get(Calendar.YEAR);
int month = now.get(Calendar.MONTH);
int day = now.get(Calendar.DAY_OF_MONTH);
int min = now.get(Calendar.MINUTE);
String originalName = media.getName();
String fileName = originalName +year+"_"+month+"_"+day+"_"+min+".pdf";
String tmpPath = PDFmodifier.getTemp();
if (!tmpPath.endsWith(File.separatorChar+"")) tmpPath = tmpPath + File.separator;
filePath = tmpPath + fileName;
System.out.println("filePath='"+filePath+"'");
Files.copy(new File(filePath), media.getStreamData());
filePath = new PDFmodifier(logText).start(filePath);
System.out.println("Ergbnis-pfad='"+filePath+"'");
Messagebox.show("File Sucessfully altered. Press \"Show PDF\" to download file.");
fileuploaded = true;
}
在此命令中添加了logText的notifychange。
现在还有一些其他改进:
<button label="Upload" upload="true"
onUpload="@command('onUploadPDF',upEvent=event)"> </button>
您不会在虚拟机中询问 upEvent,因此只需将其删除即可。
public void onUploadPDF(
@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx)
throws IOException {
可能是这样的:
public void onUploadPDF(
@ContextParam(ContextType.TRIGGER_EVENT) UploadEvent evt)
throws IOException {
因为您要做的唯一一件事就是从 bindContext 获取触发事件,因此无需获取该对象,并且它会删除方法中的大量样板代码。
看起来您需要一个单独的线程来进行处理。 I created a fiddle这样你就可以看到我是如何做到的。
但是如果链接失效了:
@Command
@NotifyChange("timer")
public void longOperation() {
timer = true;
Thread r = new Thread(new Runnable() {
@Override
public void run() {
log = "button pressed, initializing now";
sleep(5000); // this is a private method for calling Thread.sleep
log = "initialized done, processing now";
sleep(5000);
log = "finished";
timer = false;
}
});
r.start();
}
@Command
@NotifyChange({"log","timer"})
public void refreshTextbox(){
if (!timer) {
Clients.showNotification("timer stopped");
}
}
和祖尔:
关于java - 当输入以编程方式更新时,如何刷新 zk 中的文本框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34686575/
我查看了网站上的一些问题,但还没有完全弄清楚我做错了什么。我有一些这样的代码: var mongoose = require('mongoose'), db = mongoose.connect('m
基本上,根据 this bl.ocks,我试图在开始新序列之前让所有 block 都变为 0。我认为我需要的是以下顺序: 更新为0 退出到0 更新随机数 输入新号码 我尝试通过添加以下代码块来遵循上述
我试图通过使用随机数在循环中设置 JSlider 位置来模拟“赛马”的投注结果。我的问题是,当然,我无法在线程执行时更新 GUI,因此我的 JSlider 似乎没有在竞赛,它们从头到尾都在运行。我尝试
该功能非常简单: 变量:$table是正在更新的表$fields 是表中的字段,$values 从帖子生成并放入 $values 数组中而$where是表的索引字段的id值$indxfldnm 是索引
让我们想象一个环境:有一个数据库客户端和一个数据库服务器。数据库客户端可以是 Java 程序或其他程序等;数据库服务器可以是mysql、oracle等。 需求是在数据库服务器上的一个表中插入大量记录。
在我当前的应用程序中,我正在制作一个菜单结构,它可以递归地创建自己的子菜单。然而,由于这个原因,我发现很难也允许某种重新排序方法。大多数应用程序可能只是通过“排序”列进行排序,但是在这种情况下,尽管这
Provisioning Profile 有 key , key 链依赖于它。我想知道 key 什么时候会改变。 Key will change after renew Provisioning Pr
截至目前,我在\server\publications.js 中有我的 MongoDB“选择”,例如: Meteor.publish("jobLocations", function () { r
我读到 UI 应该始终在主线程上更新。但是,当谈到实现这些更新的首选方法时,我有点困惑。 我有各种函数可以执行一些条件检查,然后使用结果来确定如何更新 UI。我的问题是整个函数应该在主线程上运行吗?应
我在代理后面,我无法构建 Docker 镜像。 我试过 FROM ubuntu , FROM centos和 FROM alpine ,但是 apt-get update/yum update/apk
我构建了一个 Java 应用程序,它向外部授权客户端公开网络服务。 Web 服务使用带有证书身份验证的 WS-security。基本上我们充当自定义证书颁发机构 - 我们在我们的服务器上维护一个 ja
因此,我有时会在上传新版本时使用 app_offline.htm 使应用程序离线。 但是,当我上传较大的 dll 时,我收到黄色错误屏幕,指出无法加载 dll。 这似乎与我对 app_offline.
我刚刚下载了 VS Apache Cordova Tools Update 5,但遇到了 Node 和 NPM 的问题。我使用默认的空白 cordova 项目进行测试。 版本 如果我在 VS 项目中对
所以我有一个使用传单库实例化的 map 对象。 map 实例在单独的模板中创建并以这种方式路由:- var app = angular.module('myApp', ['ui', 'ngResour
我使用较早的 Java 6 u 3 获得的帧速率是新版本的两倍。很奇怪。谁能解释一下? 在 Core 2 Duo 1.83ghz 上,集成视频(仅使用一个内核)- 1500(较旧的 java)与 70
我正在使用 angular 1.2 ng-repeat 创建的 div 也包含 ng-click 点击时 ng-click 更新 $scope $scope 中的变化反射(reflect)在使用 $a
这些方法有什么区别 public final void moveCamera(CameraUpdate更新)和public final void animateCamera (CameraUpdate
我尝试了另一篇文章中某人评论中关于如何将树更改为列表的建议。但是,我在某处(或某物)有未声明的变量,所以我列表中的值是 [_G667, _G673, _G679],而不是 [5, 2, 6],这是正确
实现以下场景的最佳方法是什么? 我需要从java应用程序调用/查询包含数百万条记录的数据库表。然后,对于表中的每条记录,我的应用程序应该调用第三方 API 并获取状态字段作为响应。然后我的应用程序应该
只是在编写一些与 java 图形相关的代码,这是我今天的讲座中的非常简单的示例。不管怎样,互联网似乎说更新不会被系统触发器调用,例如调整框架大小等。在这个例子中,更新是由这样的触发器调用的(因此当我只
我是一名优秀的程序员,十分优秀!