在下面的类中,在对话框中创建一个worker。当工人执行时,它会更新对话框中的文本。
不幸的是,TextField的宽度不会根据内容增长。
此外,文本字段宽度最初很窄,完全符合它的内容,尽管它被配置为在MigLayout
中增长。
如何解决?
public abstract class JStatusMessageWorkerDialog<T> extends JDialog {
private static final long serialVersionUID = -6373593735878434741L;
private class Worker extends SwingWorker<T, String> {
private String statusMessage;
private Worker() {
}
public synchronized String getStatusMessage() {
return statusMessage;
}
public synchronized void setStatusMessage(String newValue) {
String oldValue = this.statusMessage;
this.statusMessage = newValue;
firePropertyChange("statusMessage", oldValue, newValue);
}
@Override
protected T doInBackground() throws Exception {
return JStatusMessageWorkerDialog.this.doInBackground();
}
@Override
protected void done() {
JStatusMessageWorkerDialog.this.dispose();
}
} // CorpusWorker class
Worker worker;
Icon corpusPropgressIcon = createIcon();
JLabel corpusProgressIconLabel = new JLabel(corpusPropgressIcon);
JPanel iconPanel = new JPanel();
{
iconPanel.setLayout(new MigLayout("fill"));
iconPanel.add(corpusProgressIconLabel, "");
}
JTextField statusText = new JTextField();
{
statusText.setEditable(false);
statusText.setText("text");
}
JPanel statusPanel = new JPanel();
{
statusPanel.setLayout(new MigLayout("fill"));
statusPanel.add(statusText, "growx");
}
AbstractAction closeAction = new AbstractAction("Отмена") {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
closeAction.setEnabled(false);
worker.cancel(true);
}
};
JButton closeButton = new JButton(closeAction);
JPanel buttonPanel = new JPanel();
{
buttonPanel.setLayout(new FlowLayout());
buttonPanel.add(closeButton);
}
{
setLayout(new MigLayout("debug, fill"));
add(iconPanel, "split");
add(statusPanel, "wrap");
add(buttonPanel, "w 640px, grow");
}
public JStatusMessageWorkerDialog() {
worker = createWorker();
worker.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if( "statusMessage".equals(evt.getPropertyName()) ) {
statusText.setText((String) evt.getNewValue());
//statusText.validate();
//statusPanel.invalidate();
//statusPanel.doLayout();
statusText.revalidate();
}
}
});
setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
setModalityType(ModalityType.APPLICATION_MODAL);
addComponentListener(new ComponentAdapter() {
@Override
public void componentShown(ComponentEvent e) {
worker.execute();
}
});
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
closeAction.actionPerformed(null);
}
});
}
protected Worker createWorker() {
return new Worker();
}
protected Icon createIcon() {
return UIManager.getDefaults().getIcon("OptionPane.informationIcon");
}
protected void setStatusMessage(String newValue) {
worker.setStatusMessage(newValue);
}
public String getStatusMessage() {
return worker.getStatusMessage();
}
protected abstract T doInBackground() throws Exception;
public static void main(String[] args) {
JStatusMessageWorkerDialog<Object> dialog = new JStatusMessageWorkerDialog<Object>() {
@Override
protected Object doInBackground() throws Exception {
Thread.sleep(5000);
setStatusMessage("state 2");
Thread.sleep(5000);
setStatusMessage("state 3");
return null;
}
};
dialog.pack();
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
}
}
答案 0 :(得分:0)
目前,我无法访问我的电脑,所以我只会这样做 写下我的头脑。
首先,要更改文本字段的初始大小,您需要
向JTextField
构造函数添加一个参数,其数量为
colums。文本字段
根据它的列数计算其初始宽度:
JTextField statusText = new JTextField(10);
grow
和fill
约束的组合构成了组件
窗口调整大小时会增长。它不会使它成长的时候
内容更改 - 必须手动完成。
在我看来,最好创建一个足够大的文本字段 包含最大的文本,而不是动态地改变它。