Button
Button
- Demonstration: Button and Fileupload
- Java API: org.zkoss.zul.Button
- JavaScript API:
zul.wgt.Button
Employment/Purpose
You could assign a label
and an image
to a button by the label
and
image
properties. If both are specified, the dir
property control
which is displayed up front, and the orient
property controls whether
the layout is horizontal or vertical.
Within ZK 5, the file upload has been redesigned so it can be integrated with any widget. For example, the button now can be used to upload a file. In addition to this, the display of the upload status has been enhanced and can be customized easily.
Example
<button label="Left" image="/img/network.gif" width="125px"/>
<button label="Right" image="/img/network.gif" dir="reverse" width="125px"/>
<button label="Above" image="/img/network.gif" orient="vertical" width="125px"/>
<button label="Below" image="/img/network.gif" orient="vertical" dir="reverse" width="125px"/>
In addition to employing URLs to specify images, you can dynamically
assign a generated image to a button using the setImageContent
method.
Refer to the following section for details.
Tip: The setImageContent
method is supplied by all components that
have an image
property. Simply put, setImageContent
is used for
dynamically generated images, while image
is used for images
identifiable by a URL.
File Upload
A button or a Toolbarbutton can be used to upload files. All you need to do is:
- Specify the
upload
attribute withtrue
- Handles the
onUpload
event
<button upload="true" label="Fileupload" onUpload="myProcessUpload(event.getMedia())"/>
When the file is uploaded, an instance of org.zkoss.zk.ui.event.UploadEvent is sent to the button. Then, the event listener can retrieve the uploaded content by examining the return value of
.
Custom Error Message When Fileupload Over Maxsize
1. Write your own AuLoader
package test;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.zkoss.zk.au.http.AuUploader;
public class MyUploader extends AuUploader {
protected String handleError(Throwable ex) {
if(ex instanceof SizeLimitExceededException){
SizeLimitExceededException e = (SizeLimitExceededException) ex;
return e.getActualSize() + " is over our limit";
}
return super.handleError(ex);
}
}
2. Apply it in the web.xml
<servlet>
<description>The asynchronous update engine for ZK</description>
<servlet-name>auEngine</servlet-name>
<servlet-class>org.zkoss.zk.au.http.DHtmlUpdateServlet</servlet-class>
<init-param>
<param-name>extension0</param-name>
<param-value>/upload=test.MyUploader</param-value>
</init-param>
</servlet>
- Result Video Demo
Limitation of the Default Mold
The default mold of a button uses HTML BUTTON tag to represent it visually. It is efficient, but it has some limitations:
- The look might be different from one browser to another.
- It doesn’t support the file upload. In fact, it will become the
trendy mold automatically if
upload
is specified. - If it is disabled it can not receive mouse events and hence can not use ZK popup component as tooltip.
If it is an issue, you could use the trendy mold instead.
<button label="OK" mold="trendy"/>
Configure to Use the Trendy Mold as Default
If you prefer to use the trendy mold as default, you could configure ZK
by adding the following to /WEB-INF/zk.xml
<library-property>
<name>org.zkoss.zul.Button.mold</name>
<value>trendy</value>
</library-property>
File Download and browser processed links
Similar to file download link problem,
if you specify href
to use a button for downloading, or if you are
using a browser-processed link such as mailto:
, tel:
, or other
similar user-processed instruction which would trigger a page unloading
event, you also need to specify target
:
<button label="download" href="/myfile.pdf" target="_blank"/>
- If no specifying
target
, you will find event firing doesn’t work anymore after you download a file.
Properties
Autodisable
is used to disable a button automatically, when it is clicked. It is useful to prevent the user from clicking it twice (and firing redundant requests), which is common if the request takes long to serve.
The simplest use is to specify it with self
as follows. Then, the
button is disabled when it is clicked.
<button id="ok" label="OK" autodisable="self" />
If you’d like to disable several buttons, you could specify all of them in this property by separating with a comma. For example, the following disables both buttons, when one of them is clicked.
<button id="ok" label="OK" autodisable="ok,cancel" />
<button id="cancel" label="Cancel" autodisable="ok,cancel" />
The button will be enabled automatically, after the request has been served (i.e., the response has been sent back to the client). If you prefer to enable them manually (i.e., by calling
explicitly), you could prefix the ID with a plus (+
). For example,
<button id="ok" label="OK" autodisable="+self, +cancel" />
Then, you could enable them manually under the situation depending on your application’s requirement, such as
if (something_happens) {
ok.setDisabled(false);
cancel.setDisabled(false);
}
Enable Autodisable for All Buttons
As described in ZK Developer’s Reference: Customization,
you could customize ZK to enable autodisable
for all button by
specifying the following in the custom language addon:
<language-addon>
<component>
<component-name>button</component-name>
<extends>button</extends>
<property>
<property-name>autodisable</property-name>
<property-value>self</property-value>
</property>
</component>
</language-addon>
Href
In addition to handling the onClick event, you could specify the URL in
the href property
(
(just like using a HTML A tag).
Notice that the end user could hold the Control
key and click on the
button to visit the link in a new browser window (like a HTML A tag
does).
Href and the onClick Event
There are two ways to add behavior to a button
and toolbarbutton
.
Firstly, you can specify a listener to the onClick
event. Secondly,
you could specify a URL for the href
property
(href
property has the higher priority,
i.e., the onClick event won’t be sent.
<zk>
<window title="example">
<button label="click me" onClick="do_something_in_Java()"/>
<button label="don't click that one, click me" href="/another_page.zul"/>
</window>
</zk>
Href and SendRedirect
The href property is processed at the client. In other words, the browser will jump to the URL specified in the href property, so your application running at the server has no chance to process it.
If you have to process it at the server or you have to decide whether to jump to another URL based on certain condition, you could listen to the onClick event, process it, and then invoke
if it shall jump to another URL.
For end users, there is no difference between the use of
and
.
<zk>
<window>
<button label="redirect" onClick="Executions.sendRedirect("another.zul")"/>
<button label="href" href="another.zul"/>
</window>
</zk>
Since the onClick event is sent to the server for processing, you are able to perform additional tasks before invoking
, such as redirecting to another page only if certain conditions are satisfied.
On the other hand, the href
property is processed at the client side.
Your application won’t be notified when users click the button.
Type
since 5.0
sets the button’s type. It is designed to work with the HTML