Java 用方法更改jlabel
我正在编写一个转换文件的小程序,我想弹出一个框,要求用户等待程序循环并转换所有相关文件,但我遇到了一个小问题。弹出的框应该有一个JLabel和一个JButton,当用户正在“等待”时,我想显示一条消息,上面写着“请等待”,并显示一个禁用的“OK”JButton,当它完成时,我想设置JLabel的文本,让他们知道它成功地转换了他们的文件,并告诉他们转换了多少文件。(我编写了一个名为alert的方法,该方法设置标签文本并启用按钮。)问题是,当程序运行时,框为空,标签和按钮不可见,当它完成时,标签显示为我想要的最终文本,按钮显示为启用。我不确定到底发生了什么,我尝试了几次更改JLabel和JButton的修改器,但似乎无法使其正常工作。下面是弹出框的代码,非常感谢您的帮助Java 用方法更改jlabel,java,swing,user-interface,jbutton,jlabel,Java,Swing,User Interface,Jbutton,Jlabel,我正在编写一个转换文件的小程序,我想弹出一个框,要求用户等待程序循环并转换所有相关文件,但我遇到了一个小问题。弹出的框应该有一个JLabel和一个JButton,当用户正在“等待”时,我想显示一条消息,上面写着“请等待”,并显示一个禁用的“OK”JButton,当它完成时,我想设置JLabel的文本,让他们知道它成功地转换了他们的文件,并告诉他们转换了多少文件。(我编写了一个名为alert的方法,该方法设置标签文本并启用按钮。)问题是,当程序运行时,框为空,标签和按钮不可见,当它完成时,标签显示
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class PleaseWait extends javax.swing.JFrame{
private static final int height = 125;
private static final int width = 350;
final static JLabel converting = new JLabel("Please Wait while I convert your files");
private static JButton OK = new JButton("OK");
public PleaseWait(){
// creates the main window //
JFrame mainWindow = new JFrame();
mainWindow.setTitle("Chill For A Sec");
mainWindow.setSize(width, height);
mainWindow.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
// creates the layouts//
JPanel mainLayout = new JPanel(new BorderLayout());
JPanel textLayout = new JPanel(new FlowLayout());
JPanel buttonLayout = new JPanel(new FlowLayout());
// Sets Text //
converting.setText("Please wait while I convert your files");
// disables button //
OK.setEnabled(false);
// adds to the layouts //
textLayout.add(converting);
buttonLayout.add(OK);
mainLayout.add(textLayout, BorderLayout.CENTER);
mainLayout.add(buttonLayout, BorderLayout.SOUTH);
// adds to the frame //
mainWindow.add(mainLayout);
// sets everything visible //
mainWindow.setVisible(true);
}
public static void alert(){
OK.setEnabled(true);
String total = String.valueOf(Convert.result());
converting.setText("Sucsess! " + total + " files Converted");
}
}
好吧,问题来了。您正在扩展JFrame。这意味着您的类是JFrame
创建
请编辑框架时,您不会对其执行任何操作。这是你看到的空盒子。而是在构造函数中创建不同的JFrame。删除main窗口
,只需使用此
。现在,所有组件都将添加到plessewait
对象中。这将解决您的空白框问题。您需要一个应用程序来首先创建框架。这是此类应用程序的一个简单示例
import javax.swing.UIManager;
import java.awt.*;
public class Application {
boolean packFrame = false;
//Construct the application
public Application() {
PleaseWait frame = new PleaseWait();
//Validate frames that have preset sizes
//Pack frames that have useful preferred size info, e.g. from their layout
if (packFrame) {
frame.pack();
}
else {
frame.validate();
}
//Center the window
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = frame.getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
frame.setVisible(true);
frame.convert();
}
//Main method
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch(Exception e) {
e.printStackTrace();
}
new Application();
}
}
您必须稍微修改框架才能将控件添加到内容窗格中。您可以在创建框架后执行一些工作,然后调用警报
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class PleaseWait extends JFrame {
private static final int height = 125;
private static final int width = 350;
final static JLabel converting = new JLabel();
private static JButton OK = new JButton("OK");
BorderLayout borderLayout1 = new BorderLayout();
JPanel contentPane;
int count;
public PleaseWait(){
contentPane = (JPanel)this.getContentPane();
contentPane.setLayout(borderLayout1);
this.setSize(new Dimension(width, height));
this.setTitle("Chill For A Sec");
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
// creates the layouts//
JPanel mainLayout = new JPanel(new BorderLayout());
JPanel textLayout = new JPanel(new FlowLayout());
JPanel buttonLayout = new JPanel(new FlowLayout());
// Sets Text //
converting.setText("Please wait while I convert your files");
// disables button //
OK.setEnabled(false);
OK.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
// adds to the layouts //
textLayout.add(converting);
buttonLayout.add(OK);
mainLayout.add(textLayout, BorderLayout.CENTER);
mainLayout.add(buttonLayout, BorderLayout.SOUTH);
// adds to the frame //
contentPane.add(mainLayout);
}
public void convert(){
count = 0;
for (int i = 0; i <10; i++){
System.out.println("Copy "+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
count++;
}
alert();
}
public void alert(){
OK.setEnabled(true);
// String total = String.valueOf(Convert.result());
converting.setText("Sucsess! " + count + " files Converted");
}
}
import java.awt.*;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
公共类扩展了JFrame{
专用静态最终内部高度=125;
专用静态最终整数宽度=350;
最终静态JLabel转换=新JLabel();
私有静态JButton OK=新JButton(“OK”);
BorderLayout borderLayout1=新的BorderLayout();
JPanel内容窗格;
整数计数;
公共娱乐{
contentPane=(JPanel)this.getContentPane();
contentPane.setLayout(borderLayout1);
此.setSize(新尺寸(宽度、高度));
这是setTitle(“冷静一会儿”);
此.setDefaultCloseOperation(在关闭时处理);
//创建布局//
JPanel mainLayout=newjpanel(newborderlayout());
JPanel textLayout=新的JPanel(新的FlowLayout());
JPanel buttonLayout=新的JPanel(新的FlowLayout());
//设置文本//
converting.setText(“请稍候,我正在转换您的文件”);
//禁用按钮//
OK.setEnabled(错误);
好的。addActionListener(新的ActionListener(){
已执行的公共无效操作(操作事件e){
系统出口(0);
}
});
//添加到布局中//
textLayout.add(转换);
按钮布局。添加(确定);
mainLayout.add(文本布局、边框布局、中心);
主布局。添加(按钮布局,边界布局。南);
//添加到框架中//
contentPane.add(主布局);
}
公共void convert(){
计数=0;
对于(int i=0;我可以向您展示您调用了alert()
?我尝试了一下,但没有解决问题。不过,感谢您让我知道这一点,这是有用的信息。此外,alert在我的convert函数中被调用,初始调用的工作方式如下:plesewait holdOnaSec=new plesewait();convert方法holdOnaSec.alert()中的重要内容;我认为在更新控件后重新绘制会很有用,但是控件足够聪明,可以自我更新。所以我按照你说的去做,但我仍然没有任何运气。我有一个应用程序首先创建了框架,但它与你的不同,所以我尝试了你的。这是我最初为应用程序创建的阳离子:这就是我现在拥有的:我明白了,你只是想在GUI线程中运行你的应用程序逻辑,而GUI还没有完成他的工作。你可能想在另一个工作线程中运行它。试试这个`SwingUtilities.invokeLater(new Runnable(){public void run(){//在这里执行你的逻辑} }); `