2016-06-19 14 views
1

私は数年後にJavaに触れていませんでしたが、今はJFrameをテストするためのGUIを作ろうとしています。私は、クリックするとプログラムを閉じるJButtonを作成しようとしています。現在のコードでは、エラー"The method addActionListener(java.awt.event.ActionListener) in the type javax.swing.AbstractButton is not applicable for the arguments (new ActionListener(){})"が表示されます。私が見つけた他の質問は、私の問題に役立たない複数のクラスやその他の問題に取り組んでいます。任意の解決策または代替案が認められるだろう。JButtonにアクションリスナーを追加できません

import javax.swing.*; 
import java.awt.*; 

public class testFrame 
{ 
    public static void main(String args[]) 
    { 
    long base = System.currentTimeMillis(); 

    JFrame frame = new JFrame("Test Window"); 
    frame.setLocationRelativeTo(null); 
    frame.setUndecorated(true); 
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    frame.setVisible(true); 

    JLabel label = new JLabel(); 
    JLabel label2 = new JLabel("How Long Have I Been Running?"); 
    JButton button = new JButton("EXIT"); 
    button.addActionListener(new ActionListener(){ 
     public void actionPerformed (ActionEvent e) { 
      JFrame.dispose(); 
     } 
    }); 
    Box box = Box.createVerticalBox(); 
    box.add(label2); 
    box.add(label); 
    box.add(button); 
    label2.setAlignmentX(Component.CENTER_ALIGNMENT); 
    label.setAlignmentX(Component.CENTER_ALIGNMENT); 
    button.setAlignmentX(Component.CENTER_ALIGNMENT); 
    frame.getContentPane().add(box, BorderLayout.CENTER); 

    while(true) 
    { 

     long input = System.currentTimeMillis(); 
     label.setText(Long.toString(input - base)); 
    } 
    } 
} 
+1

'ActionListener'と' ActionEvent'のインポートを追加した後、私は '静的コンテキストから使用することができない'処分()旨をコンパイルエラーが表示さ.. –

+0

1) 'while(true)'これはEDTをブロックします。その代わりにSwingタイマーを使用してループのコードを呼び出します。 2) 'frame.setVisible(true);'は最後に行うべきです。 3)一般的なJava命名法(命名規則、例えば 'EachWordUpperCaseClass'、' firstWordLowerCaseMethod() '、' firstWordLowerCaseAttribute'が 'UPPER_CASE_CONSTANT'でない限り)を学び、一貫して使用してください。 –

+0

@Andrew Thompsonどのようなインポートを追加しましたか?私は 'ActionListener'と' ActionEvent'の両方が 'javax.swing。*'に含まれていたという印象を受けました。また、他にもたくさんの問題があると確信しています。私は今、この問題に対処しようとしています。 – SkippyNBS

答えて

1

私はプログラムを進めるためにいくつかのことを変更しました。

  • 必ずevent dispatch threadにスイングプログラムを構築。

  • スイングTimerを使用すると、しばらく毎回何かが起こることがあります。ループをフラットにして部屋を暖かくするだけです。

  • デフォルトクローズ操作に使用JFrame.EXIT_ON_CLOSE、そしてあなたのEXITボタンからWINDOW_CLOSINGイベントを送信します。

  • の後にpack()のフレームを追加した後にsetVisible()を呼び出します。

screenshot

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.WindowEvent; 
import javax.swing.Box; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 
import javax.swing.Timer; 

public class TestFrame { 

    public static void main(String args[]) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame("Test Window"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       //frame.setUndecorated(true); 
       //frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
       Box box = Box.createVerticalBox(); 
       JLabel time = new JLabel("0"); 
       time.setAlignmentX(Component.CENTER_ALIGNMENT); 
       JLabel label = new JLabel("How Long Have I Been Running?"); 
       label.setAlignmentX(Component.CENTER_ALIGNMENT); 
       JButton button = new JButton("EXIT"); 
       button.setAlignmentX(Component.CENTER_ALIGNMENT); 
       button.addActionListener(new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         frame.dispatchEvent(new WindowEvent(
          frame, WindowEvent.WINDOW_CLOSING)); 
        } 
       }); 
       box.add(label); 
       box.add(time); 
       box.add(button); 
       frame.add(box, BorderLayout.CENTER); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 

       long base = System.currentTimeMillis(); 
       Timer timer = new Timer(100, new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         long input = System.currentTimeMillis(); 
         time.setText(Long.toString(input - base)); 
        } 
       }); 
       timer.start(); 
      } 
     }); 
    } 
} 
関連する問題