使用Jframe / textfields

时间:2016-02-04 04:54:23

标签: java eclipse swing windowbuilder

如何使用eclipse中的WindowBuilder将for循环中的数字打印到文本字段中,我已经为点击开始时计数器的for循环开始(计数最多为60)。我只是想知道如果我点击开始你将如何让它显示在不同的文本字段中。 如果这个解释不那么清楚,换句话说我正在制作一个Stop-watch,当你点击start时,它会在eclipse控制台中打印出最多60个。当我点击开始时,我希望这些数字显示在窗口的JTextfield中。任何帮助表示赞赏:)

这是代码页,我希望你们(或女孩)可以帮助我:)(这是我试图做的。

package com.racecar484.user;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.SwingConstants;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.Color;
import javax.swing.JLabel;
import javax.swing.JTable;

public class StopWatch extends ForLoopTesting {

    private JFrame frmStopWatchPro;
    private JTextField txtClickMeTo;
    private JButton Terminate;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    StopWatch window = new StopWatch();
                    window.frmStopWatchPro.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public StopWatch() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     * @param i 
     */



    private void initialize(String i) {
        frmStopWatchPro = new JFrame();
        frmStopWatchPro.getContentPane().setBackground(new Color(255, 127, 80));
        frmStopWatchPro.setTitle("Stop Watch Pro");
        frmStopWatchPro.setBounds(100, 100, 450, 300);
        frmStopWatchPro.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmStopWatchPro.getContentPane().setLayout(null);

        txtClickMeTo = new JTextField();
        for(int i1 = 0; i1 < 60; i1++){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }

        txtClickMeTo.setText(i);
        txtClickMeTo.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent arg0) {

            System.out.println("Oh my god this worked!");

            }
        });
        txtClickMeTo.setEditable(false);
        txtClickMeTo.setBounds(19, 24, 300, 58);
        frmStopWatchPro.getContentPane().add(txtClickMeTo);
        txtClickMeTo.setColumns(10);

        JButton btnNewButton = new JButton("Start");
        btnNewButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("Stop-Watch activated.");
                for(int i = 0; i < 60; i++){
                    System.out.println(i);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                }
            }
        });
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            }
        });
        btnNewButton.setBounds(53, 121, 108, 40);
        frmStopWatchPro.getContentPane().add(btnNewButton);

        JButton btnStop = new JButton("Stop");
        btnStop.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
            String Meow = "hey";
                System.out.println("Stop-Watch stopped.");
            }
        });
        btnStop.setBounds(211, 121, 108, 40);
        frmStopWatchPro.getContentPane().add(btnStop);

        Terminate = new JButton("Terminate");
        Terminate.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {

            frmStopWatchPro.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                System.out.println("Closing Application.");
            System.exit(0);
            }
        });
        Terminate.setBounds(329, 0, 105, 261);
        frmStopWatchPro.getContentPane().add(Terminate);

        JLabel lblonlyOneThat = new JLabel("(Only one that actually works without console ->)");
        lblonlyOneThat.setBounds(53, 211, 266, 39);
        frmStopWatchPro.getContentPane().add(lblonlyOneThat);

        JLabel lblStopWatchPro = new JLabel("Stop Watch Pro V.1- made by Andrew Lopez ");
        lblStopWatchPro.setBounds(53, 187, 257, 29);
        frmStopWatchPro.getContentPane().add(lblStopWatchPro);
    }
}

2 个答案:

答案 0 :(得分:1)

在我看来,您对Java swing框架的理解有些局限。你有两个主要问题。其中一个你已经在你的问题中描述过了。另一个是你不知道如何制作计时器。

目前您正在使用Thread.sleep(1000)来等待&#34;等待&#34;持续1秒但是你把它放在initialize方法中。为什么要在窗口初始化时等待60秒?这对我来说毫无意义。

我看到启动按钮的点击监听器中有另一个Thread.sleep(1000)。这是有道理的,但你没有设置txtClickMeTo的文字。

应该是这样的:

for(int i = 0; i < 60; i++){
    System.out.println(i);
    try {
        Thread.sleep(1000);
        txtClickMeTo.setText(Integer.toString(i));
     } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
}

如果您这样做,还需要将txtClickMeTo标记为final

final JTextField txtClickMeTo = new JTextField();

这样,开始按钮就可以正常工作。

但停止按钮怎么样?为什么当我启动计时器时它不起作用?

这是因为Thread.sleep导致阻止。该方法阻止线程继续运行,因此用户交互只能在60秒后响应。

因此,不建议将Thread.sleep用于swing应用程序。你使用的是javax.swing.Timer。它非常人性化。它提供了许多方便的方法来实现您的停止按钮。

以下是该文档:https://docs.oracle.com/javase/7/docs/api/javax/swing/Timer.html

这是一个教程: https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html

编辑:

我将向您展示使用摇摆计时器来满足要求的代码。

首先,您需要创建一个(当然!)

Timer t = new Timer(1000, new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // blah blah blah
    }
});

在此代码中,1000表示计时器将每1000毫秒或1秒触发一次。第二个参数是计时器触发时需要执行的操作,在这种情况下,您应该将txtClickMeTo的文本设置为某个数字。

当然,您需要跟踪数字应该是多少,因此请创建一个变量来存储:

int secondsElapsed = 0;

您基本上只需将JTextField的文字设置为secondsElasped并将其递增。

答案 1 :(得分:1)

Swing是单线程的,这意味着如果您执行任何阻止事件调度线程的操作,比如运行循环,使用Thread.sleep或其他一些长时间运行的进程,UI将不会更新(并且不会更新)事件将被处理)。

Swing也不是线程安全的,这意味着你永远不应该从EDT以外的任何线程更新UI

首先查看Concurrency in Swing了解更多详情。

问题是,你怎么解决它?您可以使用ThreadSwingUtilities.invokeLater,但这有点混乱。你可以使用SwingWorker,但这对问题来说很重要。最好的解决方案是使用Swing Timer,它在EDT内定期调用已注册的回调(ActionListener),从而可以安全地从内部更新UI。

请查看How to use Swing Timers了解更多详情。

举个例子......

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class StopWatch {

    public static void main(String[] args) {
        new StopWatch();
    }

    public StopWatch() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JTextField field;
        private Timer timer;
        private int counter;

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            field = new JTextField(4);
            add(field, gbc);

            JButton btn = new JButton("Start");
            btn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (timer.isRunning()) {
                        timer.stop();
                        btn.setText("Start");
                    } else {
                        counter = 0;
                        timer.start();
                        field.setText(Integer.toString(counter));
                        btn.setText("Stop");
                    }
                }
            });
            add(btn, gbc);

            timer = new Timer(1000, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    counter++;
                    if (counter >= 60) {
                        timer.stop();
                        btn.setText("Start");
                    }
                    field.setText(Integer.toString(counter));
                }
            });

        }

    }

}

Cavet:这是一个简单的例子。 Swing Timer仅保证在规定的延迟之后调用ActionListener,这使得它稍微不准确(以毫秒为单位)。更合适的解决方案是使用Timer开始的时间与通知ActionListener的时间之间的比较

您可能还想查看How to Use Buttons, Check Boxes, and Radio ButtonsHow to Write an Action Listeners,了解更适合使用按钮的机制