Java 更新Swing UI内部按钮单击事件
我有一个swing应用程序。我正在试着显示正在加载的玻璃窗 从数据库中读取数据。但这种行为并不是我所期望的Java 更新Swing UI内部按钮单击事件,java,swing,Java,Swing,我有一个swing应用程序。我正在试着显示正在加载的玻璃窗 从数据库中读取数据。但这种行为并不是我所期望的 public class Sample { JFrame frame; JPanel loadingPanel; JLabel iconLabel; JPanel glassPane; pr
public class Sample {
JFrame frame;
JPanel loadingPanel;
JLabel iconLabel;
JPanel glassPane;
private PropertyChangeSupport changeListeners = new PropertyChangeSupport(this);
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Sample window = new Sample ();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Sample () {
initialize();
}
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setSize(new Dimension(500,500));
frame.getContentPane().add(panel);
panel.setLayout(null);
// ---------Select button--------------------------------
JButton btnSelect = new JButton("Select");
btnSelect.addActionListener(loadDataActionListner);
btnSelect.setBounds(132, 7, 137, 32);
btnSelect.setFocusPainted(false);
panel.add(btnSelect);
glassPane = new GlassPanel();
glassPane.setOpaque(false);
glassPane.setLayout(new GridBagLayout());
glassPane.add(new JLabel("loading... "));
frame.setGlassPane(glassPane);
ChangeListener listener = new ChangeListener(this);
changeListeners.addPropertyChangeListener(listener);
}
public void changeVisibility(boolean visibility){
glassPane.setVisible(visibility);
frame.validate();
frame.repaint();
}
ActionListener loadDataActionListner = new ActionListener() {
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setCurrentDirectory(new File(System.getProperty("user.home")));
int result = fileChooser.showOpenDialog(frame);
if (result == JFileChooser.APPROVE_OPTION) {
changeListeners.firePropertyChange("visibility", false, true); //Line 01
Response response = DataManager.getInstance().loadData("myfile.txt");
changeListeners.firePropertyChange("visibility", true, false);
}
}
});
}
};
}
public class GlassPaneUpdateWorker extends SwingWorker<Object, Boolean> {
private boolean visibility;
private Sample sample;
public GlassPaneUpdateWorker(Sample sample) {
this.sample = sample;
}
@Override
protected Object doInBackground() throws Exception {
publish(visibility);
return null;
}
@Override
protected void process(List<Boolean> chunks) {
if (chunks != null && !chunks.isEmpty()) {
sample.changeVisibility(chunks.get(0));
}
}
protected void changeVisibility(boolean visibility) {
this.visibility = visibility;
}
}
public class ChangeListener implements PropertyChangeListener{
private Sample sample;
public ChangeListener(Sample sample) {
this.sample = sample;
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
GlassPaneUpdateWorker glassPaneUpdater = new GlassPaneUpdateWorker(sample);
glassPaneUpdater.changeVisibility((Boolean)evt.getNewValue());
glassPaneUpdater.execute();
}
}
公共类示例{
JFrame框架;
JPanel装载面板;
JLabel-iconLabel;
JPanel玻璃窗格玻璃;
私有PropertyChangeSupport changeListeners=新的PropertyChangeSupport(此);
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
公开募捐{
试一试{
样本窗口=新样本();
window.frame.setVisible(true);
}捕获(例外e){
e、 printStackTrace();
}
}
});
}
公众样本(){
初始化();
}
私有void初始化(){
frame=新的JFrame();
机架立根(100450300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel面板=新的JPanel();
面板设置尺寸(新尺寸(500500));
frame.getContentPane().add(面板);
panel.setLayout(空);
//------选择按钮--------------------------------
JButton btnSelect=新JButton(“选择”);
btnSelect.addActionListener(loadDataActionListner);
b选择立根(132、7、137、32);
b选择setFocusPainted(假);
面板。添加(b选择);
glassPane=新的GlassPanel();
玻璃材质窗格玻璃。设置不透明(假);
setLayout(新的GridBagLayout());
玻璃窗格。添加(新的JLabel(“加载…”);
框架。设置玻璃窗格(玻璃窗格);
ChangeListener listener=新的ChangeListener(此);
addPropertyChangeListener(监听器);
}
公共void变更可见性(布尔可见性){
玻璃材质窗格玻璃。设置为可见(可见性);
frame.validate();
frame.repaint();
}
ActionListener loadDataActionListner=新ActionListener(){
已执行的公共无效操作(操作事件e){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFileChooser fileChooser=新的JFileChooser();
fileChooser.setCurrentDirectory(新文件(System.getProperty(“user.home”));
int result=fileChooser.showOpenDialog(框架);
if(result==JFileChooser.APPROVE\u选项){
changeListeners.firePropertyChange(“可见性”,false,true);//第01行
Response-Response=DataManager.getInstance().loadData(“myfile.txt”);
firePropertyChange(“可见性”,真,假);
}
}
});
}
};
}
公共类GlassPaneUpdateWorker扩展SwingWorker{
私有布尔可见性;
私人样本;
公共玻璃器皿更新工人(样本){
这个样本=样本;
}
@凌驾
受保护对象doInBackground()引发异常{
发布(可见性);
返回null;
}
@凌驾
受保护的无效进程(列表块){
if(chunks!=null&&!chunks.isEmpty()){
sample.changeVisibility(chunks.get(0));
}
}
受保护的void changeVisibility(布尔可见性){
这个.可见性=可见性;
}
}
公共类ChangeListener实现PropertyChangeListener{
私人样本;
公共ChangeListener(示例){
这个样本=样本;
}
@凌驾
公共作废属性更改(属性更改事件evt){
GlassPaneUpdateWorker glassPaneUpdater=新的GlassPaneUpdateWorker(样本);
glassPaneUpdater.changeVisibility((布尔)evt.getNewValue());
glassPaneUpdater.execute();
}
}
在actionPerformed方法中执行所有代码块后,将显示加载玻璃面板。如何更改此设置,以便在执行“第01行”后立即更新UI?我可以使用SwingWorker完成此操作,如下所示,无需任何侦听器
ActionListener loadDataActionListner = new ActionListener() {
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setCurrentDirectory(new File(System.getProperty("user.home")));
int result = fileChooser.showOpenDialog(frame);
if (result == JFileChooser.APPROVE_OPTION) {
SwingWorker<?, ?> worker = new SwingWorker<Void, Integer>() {
protected Void doInBackground() {
showLoadingPanel();
Response response = DataManager.getInstance().loadData("myfile.txt");
hideLoadingPanel();
//Do something..
return null;
}
};
worker.execute();
}
}
});
}
};
ActionListener loadDataActionListner=new ActionListener(){
已执行的公共无效操作(操作事件e){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFileChooser fileChooser=新的JFileChooser();
fileChooser.setCurrentDirectory(新文件(System.getProperty(“user.home”));
int result=fileChooser.showOpenDialog(框架);
if(result==JFileChooser.APPROVE\u选项){
SwingWorker worker=新SwingWorker(){