2017-01-24 2 views
-2

В настоящее время я работаю над стоп-сигналом, который автоматически меняет свет.AppletViewer прослушивает и пытается задействовать таймер

Что у меня есть: В настоящее время у меня есть код для стоп-сигнала, который работает при нажатии кнопки.

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

/** 
    * 
    * Beschreibung 
    * 
    * @version 1.0 vom 23.01.2017 
    * @author 
    */ 

public class ampel extends JApplet { 
    // Anfang Attribute 
    private JLabel jLabel1 = new JLabel(); 
    private JLabel jLabel2 = new JLabel(); 
    private JLabel jLabel3 = new JLabel(); 
    private JButton jButton1 = new JButton(); 
    private JButton jButton2 = new JButton(); 
    private JButton jButton3 = new JButton(); 
    private JButton jButton4 = new JButton(); 
    private JLabel jLabel4 = new JLabel(); 
    private JLabel jLabel5 = new JLabel(); 
    private JLabel jLabel6 = new JLabel(); 
    // Ende Attribute 

    public void init() { 
    Container cp = getContentPane(); 
    cp.setLayout(null); 
    cp.setBounds(0, 0, 314, 300); 
    // Anfang Komponenten 
    jButton1.setVisible(true); 
    jButton2.setVisible(false); 
    jButton3.setVisible(false); 
    jButton4.setVisible(false); 
    jLabel1.setBounds(16, 24, 75, 41); 
    jLabel1.setText(""); 
    jLabel1.setOpaque(true); 
    cp.add(jLabel1); 
    jLabel2.setBounds(16, 88, 75, 33); 
    jLabel2.setText(""); 
    jLabel2.setOpaque(true); 
    cp.add(jLabel2); 
    jLabel3.setBounds(16, 144, 75, 33); 
    jLabel3.setText(""); 
    jLabel3.setOpaque(true); 
    cp.add(jLabel3); 
    jButton1.setBounds(112, 96, 73, 25); 
    jButton1.setText("jButton1"); 
    jButton1.setMargin(new Insets(2, 2, 2, 2)); 
    jButton1.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent evt) { 
     jButton1_ActionPerformed(evt); 
     } 
    }); 
    cp.add(jButton1); 
    jButton2.setBounds(112, 96, 73, 25); 
    jButton2.setText("jButton2"); 
    jButton2.setMargin(new Insets(2, 2, 2, 2)); 
    jButton2.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent evt) { 
     jButton2_ActionPerformed(evt); 
     } 
    }); 
    cp.add(jButton2); 
    jButton3.setBounds(112, 96, 73, 25); 
    jButton3.setText("jButton3"); 
    jButton3.setMargin(new Insets(2, 2, 2, 2)); 
    jButton3.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent evt) { 
     jButton3_ActionPerformed(evt); 
     } 
    }); 
    cp.add(jButton3); 
    jButton4.setBounds(112, 96, 73, 25); 
    jButton4.setText("jButton4"); 
    jButton4.setMargin(new Insets(2, 2, 2, 2)); 
    jButton4.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent evt) { 
     jButton4_ActionPerformed(evt); 
     } 
    }); 
    cp.add(jButton4); 
    cp.setBackground(new Color(0xC0C0C0)); 
    jLabel4.setBounds(224, 16, 75, 49); 
    jLabel4.setText(""); 
    jLabel4.setBackground(Color.WHITE); 
    jLabel4.setOpaque(true); 
    cp.add(jLabel4); 
    jLabel5.setBounds(224, 80, 75, 49); 
    jLabel5.setText(""); 
    jLabel5.setBackground(Color.WHITE); 
    jLabel5.setOpaque(true); 
    cp.add(jLabel5); 
    jLabel6.setBounds(224, 144, 75, 33); 
    jLabel6.setText(""); 
    jLabel6.setBackground(Color.WHITE); 
    jLabel6.setOpaque(true); 
    cp.add(jLabel6); 
    // Ende Komponenten 

    } // end of init 

    // Anfang Methoden 
    public void jButton1_ActionPerformed(ActionEvent evt) { 
    jButton2.setVisible(true); 
    jButton1.setVisible(false); 

    jLabel1.setBackground(new Color(255,0,0)); 
    jLabel2.setBackground(new Color(255,255,255)); 
    jLabel3.setBackground(new Color(255,255,255)); 

    jLabel4.setBackground(new Color(255,255,255)); 
    jLabel5.setBackground(new Color(255,255,255)); 
    jLabel6.setBackground(new Color(0,255,0)); 
    } // end of jButton1_ActionPerformed 

    public void jButton2_ActionPerformed(ActionEvent evt) { 
    jButton3.setVisible(true); 
    jButton2.setVisible(false); 
    jLabel1.setBackground(new Color(255,0,0)); 
    jLabel2.setBackground(new Color(255,255,0)); 
    jLabel3.setBackground(new Color(255,255,255)); 

    jLabel4.setBackground(new Color(255,255,255)); 
    jLabel5.setBackground(new Color(255,255,0)); 
    jLabel6.setBackground(new Color(255,255,255)); 
    } // end of jButton2_ActionPerformed 

    public void jButton3_ActionPerformed(ActionEvent evt) { 
    jButton4.setVisible(true); 
    jButton3.setVisible(false); 
    jLabel1.setBackground(new Color(255,255,255)); 
    jLabel2.setBackground(new Color(255,255,255)); 
    jLabel3.setBackground(new Color(0,255,0)); 

    jLabel4.setBackground(new Color(255,0,0)); 
    jLabel5.setBackground(new Color(255,255,255)); 
    jLabel6.setBackground(new Color(255,255,255)); 
    } // end of jButton3_ActionPerformed 

    public void jButton4_ActionPerformed(ActionEvent evt) { 
    jButton1.setVisible(true); 
    jButton4.setVisible(false); 
    jLabel1.setBackground(new Color(255,255,255)); 
    jLabel2.setBackground(new Color(255,255,0)); 
    jLabel3.setBackground(new Color(255,255,255)); 

    jLabel4.setBackground(new Color(255,0,0)); 
    jLabel5.setBackground(new Color(255,255,0)); 
    jLabel6.setBackground(new Color(255,255,255)); 
    } // end of jButton4_ActionPerformed 

    // Ende Methoden 

} // end of class ampel 

Теперь мои проблемы:

  1. Казалось бы мой Appletviewer прослушивается. (скриншоты моего связанного кодекса, ButtonPress Stoplight)

enter image description here

enter image description here

Эти 2 Gif должны дать вам представление.

  1. Я прочитал несколько статей о том, как создать таймер и методы, но я действительно не знаю сейчас. Как реализовать его в своем исходном коде или изменить его так, чтобы он работает с таймером.

Я понял это так:

сделать метод, который говорит, что делать х, у, г ...

public void timer1_ActionPerformed(ActionEvent evt) { 

    timer.setInitialDelay 

    // tell him to do x 

    Thread.sleep(5000); // or something similare so it will wait 5 seconds 

    // Tell him to do y 
    // wait 

    // Tell him to do z 
    // ...repeat 
} 
+2

где ваш код? –

+0

Я сделал это выделенным жирным шрифтом в моем редактировании. – Shaddy

+0

Я бы «догадался», что ваша проблема начинается с использования апплета и запускается в «Thread.sleep (5000);», что, вероятно, блокирует EDT и предотвращает обновление пользовательского интерфейса. Апплеты устарели (возможно, не в JDK, а в жизни), почти все браузеры либо активно блокируют их, либо отказываются от поддержки для них, тем лучше их вообще избегать. При «угадывании» вы используете Swing 'Timer', который находится в правильном направлении, но' Timer' будет ждать вас, вам не нужно ничего делать самостоятельно. Подумайте о «Таймер» как псевдо-петле, каждый тик - итерация цикла. – MadProgrammer

ответ

3

Есть некоторые проблемы в вашем коде:

  1. Вы используете макет null, что является плохой практикой, потому что это приведет к некоторым layou t специфические проблемы, в том числе перекраски (возможно, ваш «глючный» графический интерфейс из-за этой первой проблемы), см. Null layout is evil и Why is it frowned upon to use a null layout in Swing?, чтобы узнать, почему их плохая практика.

    В то время как пиксельные приложения и использование setBounds() могут показаться лучшим способом создания сложных графических интерфейсов для новичков Swing, чем больше вы делаете, тем больше проблем вы столкнетесь из-за этого, и вам будет трудно. пытаясь исправить их, вместо этого попробуйте использовать диспетчер компоновки или combinations of them вместе с пустыми границами для extra space между компонентами.

  2. Вы играете с заметности JButton с, вы могли бы вместо того, чтобы использовать Card Layout или иметь один JButton, который управляет всеми этими событиями. Таким образом вам нужно всего лишь обработать одно действие, а не много (что в итоге одно и то же).

  3. Вы используете JApplet, который, как сказал ранее в comment из @MadProgrammer:

    апплеты являются устаревшими (возможно, не в JDK, но и в жизни), почти все браузер либо активно блок их или прекратили поддержку для них, лучше просто избегать их вообще

    Вы можете использовать JPanel вместо и проверить это на самом деле interesting post о том, почему CS учителя должны остановить обучения апплетов.

  4. Пока вы меняете свою программу с JApplet на приложение на основе JPanel, вы должны поместить свою программу на Event Dispatch Thread (EDT), что может вызвать проблемы с потоками. Самый простой способ исправить это, чтобы сделать ваш метод main следующим образом:

    public static void main(String[] args) { 
        SwingUtilities.invokeLater(new Runnable() { 
         @Override 
         public void run() { 
          //Place your constructor here 
         } 
        }); 
    } 
    
  5. Вы не следуете Java naming conventions, так как ваш класс называется ampel, который должен начинаться с CapitalLetter в Ampel.


После этих рекомендаций, вы можете получить действительно похожий графический интерфейс с помощью следующего кода:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.Timer; 

public class StopLightSample { 

    private JFrame frame; 
    private JPanel pane; 
    private JPanel leftPane; 
    private JPanel centerPane; 
    private JPanel rightPane; 
    private JPanel[] leftLights; 
    private JPanel[] rightLights; 
    private JButton button; 
    private int leftLightFocus = 0; 
    private int rightLightFocus = 2; 
    private Color[] leftColors = {Color.GREEN, Color.YELLOW, Color.RED}; 
    private Color[] rightColors = {Color.RED, Color.YELLOW, Color.GREEN}; 
    private Timer timer; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new StopLightSample().createAndShowGui(); 
      } 
     }); 
    } 

    private ActionListener actionListener = new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      for (int i = 0; i < 3; i++) { 
       leftLights[i].setBackground(Color.WHITE); 
       rightLights[i].setBackground(Color.WHITE); 
      } 

      leftLights[leftLightFocus].setBackground(leftColors[leftLightFocus]); 
      rightLights[rightLightFocus].setBackground(rightColors[rightLightFocus]); 

      leftLightFocus++; 
      rightLightFocus--; 

      if (leftLightFocus > 2) { 
       leftLightFocus = 0; 
      } 

      if (rightLightFocus < 0) { 
       rightLightFocus = 2; 
      } 
     } 
    }; 

    public void createAndShowGui() { 
     frame = new JFrame("Stoplight sample"); 
     pane = new JPanel(); 
     pane.setLayout(new GridLayout(1, 3, 20, 5)); 
     leftLights = new JPanel[3]; 
     rightLights = new JPanel[3]; 
     button = new JButton("Button"); 

     leftPane = new JPanel(); 
     rightPane = new JPanel(); 

     centerPane = new JPanel(); 
     centerPane.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 100)); 

     button.addActionListener(actionListener); 

     centerPane.add(button); 

     leftPane.setLayout(new GridLayout(3, 1, 0, 25)); 
     rightPane.setLayout(new GridLayout(3, 1, 0, 25)); 

     for (int i = 0; i < 3; i++) { 
      leftLights[i] = new JPanel() { 
       @Override 
       public Dimension getPreferredSize() { 
        return new Dimension(100, 50); 
       } 
      }; 

      rightLights[i] = new JPanel() { 
       @Override 
       public Dimension getPreferredSize() { 
        return new Dimension(100, 50); 
       } 
      }; 

      leftLights[i].setBackground(Color.WHITE); 
      rightLights[i].setBackground(Color.WHITE); 

      leftLights[i].setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
      rightLights[i].setBorder(BorderFactory.createLineBorder(Color.BLACK)); 

      leftPane.add(leftLights[i]); 
      rightPane.add(rightLights[i]); 
     } 

     pane.add(leftPane); 
     pane.add(centerPane); 
     pane.add(rightPane); 

     frame.add(pane); 

     timer = new Timer(1000, actionListener); 
     timer.setInitialDelay(0); 
     timer.start(); 

     frame.pack(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

enter image description hereenter image description hereenter image description here

Как вы можете видеть, как (кнопка и Таймер) прослушивают тот же actionListener, поэтому нет необходимости использовать их много (как было сказано ранее в пункте № 2).

Я думаю, что я ничего не теряю и надеюсь, что это поможет вам, однако вы должны размещать свой код в своем вопросе (как я это сделал в своем ответе). Пожалуйста, прочитайте, как сделать действительный Minimal, Complete and Verifiable Example (MCVE) или Short, Self Contained, Correct Example (SSCCE) для следующих вопросов, поэтому из-за этого они не получают вниз.