java - 如何创建一个使用线程从下限到上限计数的程序?

标签 java multithreading swing user-interface

我们上周刚刚介绍了 GUI,现在介绍了线程。我们接到一个任务,需要创建一个面板,通过文本字段从用户那里收集 upperBound、lowerBound、incrementValue 和delayBetweenEachCount。该面板需要包含“开始”、“暂停”和“继续”按钮,使用户能够完全控制程序,因为程序按照带有特定的delayBetweenEachCount 的incrementValue 从lowerBound 到upperBound 进行计数。

我最近才开始研究它,我很困惑,如果代码相当愚蠢,我深表歉意。

我不知道如何阅读错误消息。如果有人能强调我出错的一些地方,我将不胜感激。很感谢任何形式的帮助。提前致谢。

当我尝试运行代码时收到以下错误消息:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at assignment5.CounterPanel.<init>(CounterPanel.java:139)
    at assignment5.CounterPanel$2.run(CounterPanel.java:119)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)

这是我当前不完整的代码:

        public class CounterPanel extends javax.swing.JFrame {

    // Creates new form
    public CounterPanel() {
        initComponents();
    }
//Thread counter = new Thread(new Counter(lower, upper, valueIncrement, timeDelay));
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        lowerBoundLabel = new javax.swing.JLabel();
        upperBoundLabel = new javax.swing.JLabel();
        lowerBoundTextField = new javax.swing.JTextField();
        upperBoundTextField = new javax.swing.JTextField();
        incrementValueLabel = new javax.swing.JLabel();
        delayValueLabel = new javax.swing.JLabel();
        incrementValueTextField = new javax.swing.JTextField();
        delayValueTextField = new javax.swing.JTextField();
        startButton = new javax.swing.JButton();
        pauseButton = new javax.swing.JButton();
        continueButton = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Counter");

        lowerBoundLabel.setText("Lower bound:");
        lowerBoundLabel.setName(""); // NOI18N

        upperBoundLabel.setText("Upper bound: ");

        incrementValueLabel.setText("Increment value:");

        delayValueLabel.setText("Delay value: ");

        startButton.setText("Start");
        startButton.setName(""); // NOI18N
        startButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                startButtonActionPerformed(evt);
            }
        });

        pauseButton.setText("Pause");

        continueButton.setText("Continue");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(incrementValueLabel)
                    .addComponent(upperBoundLabel)
                    .addComponent(lowerBoundLabel)
                    .addComponent(delayValueLabel))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(incrementValueTextField, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 27, Short.MAX_VALUE)
                    .addComponent(upperBoundTextField, javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lowerBoundTextField)
                    .addComponent(delayValueTextField))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 135, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(continueButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(pauseButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(startButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGap(15, 15, 15))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(55, 55, 55)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(lowerBoundTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(lowerBoundLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addGap(18, 18, 18)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(upperBoundLabel)
                            .addComponent(upperBoundTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(18, 18, 18)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(incrementValueLabel)
                            .addComponent(incrementValueTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(65, 65, 65)
                        .addComponent(startButton)
                        .addGap(26, 26, 26)
                        .addComponent(pauseButton)))
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(18, 18, 18)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(delayValueLabel)
                            .addComponent(delayValueTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(5, 5, 5)
                        .addComponent(continueButton)))
                .addContainerGap(87, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void startButtonActionPerformed(java.awt.event.ActionEvent evt) {                                            
      counter.start();
    }                                           

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new CounterPanel().setVisible(true);
            }
        });

    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton continueButton;
    private javax.swing.JLabel delayValueLabel;
    private javax.swing.JTextField delayValueTextField;
    private javax.swing.JLabel incrementValueLabel;
    private javax.swing.JTextField incrementValueTextField;
    private javax.swing.JLabel lowerBoundLabel;
    private javax.swing.JTextField lowerBoundTextField;
    private javax.swing.JButton pauseButton;
    private javax.swing.JButton startButton;
    private javax.swing.JLabel upperBoundLabel;
    private javax.swing.JTextField upperBoundTextField;
    // End of variables declaration                   

int upper = Integer.parseInt(upperBoundTextField.getText());
int lower = Integer.parseInt(lowerBoundTextField.getText());
int valueIncrement = Integer.parseInt(incrementValueTextField.getText());
int timeDelay = Integer.parseInt(delayValueTextField.getText());
Thread counter = new Thread(new Counter(lower, upper, valueIncrement, timeDelay));
}

public class Counter implements Runnable{
    int start;
    int end;
    int delayTime;
    int incrementValue;
    int i;

    public Counter(int lower, int upper, int timeDelay, int valueIncrement){
        start = lower;
        end = upper;   
        delayTime = timeDelay;
        incrementValue = valueIncrement;
        i = lower;
    }


    public void run(){
        try{
            while(i <= end)
                Thread.sleep(delayTime);
                System.out.print(i);
                i += incrementValue;
        }catch(Exception e){}
    }

}

最佳答案

当您创建CounterPanel时,它会创建一个计数器。但是 Counter 扩展了 CounterPanel。因此,构造一个 CounterPanel 创建一个 Counter,它创建一个 Counter,它创建一个 Counter,它创建一个 计数器,...

Counter 绝对没有理由扩展 CounterPanel

关于java - 如何创建一个使用线程从下限到上限计数的程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38141611/

相关文章:

java - 尝试交换矩阵中的偶数/奇数行(Java)

java - 在 HQL 中使用 boolean 值

java - 是否可以将两种不同的样式应用于单个组件

java - 将 XSD 正则表达式转换为 Java 正则表达式

iphone - 如何从 iPhone 的文档目录中读取 pdf 文件?

python - 在 WxPython GUI 线程上运行函数

java - 线程何时超出范围?

java - 如何让我的 TreeCellRenderer 填充我的 JTree?

在 Swing 中处理 JFXPanel 时出现 JavaFX IllegalStateException

java - 二叉 TreeMap 形表示的麻烦