为什么TextField不是静态增长还是动态增长?

时间:2014-08-01 15:51:22

标签: java swing swingworker miglayout

在下面的类中,在对话框中创建一个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);
    }

}

1 个答案:

答案 0 :(得分:0)

目前,我无法访问我的电脑,所以我只会这样做 写下我的头脑。

首先,要更改文本字段的初始大小,您需要 向JTextField构造函数添加一个参数,其数量为 colums。文本字段 根据它的列数计算其初始宽度:

JTextField statusText = new JTextField(10);

growfill约束的组合构成了组件 窗口调整大小时会增长。它不会使它成长的时候 内容更改 - 必须手动完成。

在我看来,最好创建一个足够大的文本字段 包含最大的文本,而不是动态地改变它。