2015-11-18 7 views
0

Я пытаюсь имитировать светофор с переключателями. Независимо от того, где я поместил вызов repaint(), он, похоже, не вызывает метод paintComponent. Любая помощь будет оценена по достоинству. Вот мой код. Извините, если это долго.repaint, кажется, не называет paintComponent

package trafficlight; 

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

public class Frame extends JFrame{ 
    Drawing ob = new Drawing(); 
    private JPanel buttonPanel; 
    private JRadioButton red; 
    private JRadioButton yellow; 
    private JRadioButton green; 

    public Frame(String title, int width, int height) { 
     super(title);      
     setSize(width, height);  

     buttonPanel = new JPanel(); 

     //creating JFrame components 
     red = new JRadioButton("Red"); 
     yellow = new JRadioButton("Yellow"); 
     green = new JRadioButton("Green"); 

     buttonPanel.add(red); 
     buttonPanel.add(yellow); 
     buttonPanel.add(green); 

     //JRadioButton group allows only one button to be selected at a time 
     ButtonGroup group = new ButtonGroup(); 
     group.add(red); 
     group.add(yellow); 
     group.add(green); 

     //adding components to frame 
     add(buttonPanel, BorderLayout.SOUTH); 

     //Adding action listeners 
     red.addActionListener(new Listener()); 
     yellow.addActionListener(new Listener()); 
     green.addActionListener(new Listener()); 

     setLocationRelativeTo(null);   
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 

    } 

    //Listener class to handle action events 
    private class Listener implements ActionListener{ 

     @Override 
     public void actionPerformed(ActionEvent e){    

      if(red.isSelected()){ 
       ob.setRed(true); 
       ob.setYellow(false); 
       ob.setGreen(false); 
       ob.repaint(); 
      } 

      else if(yellow.isSelected()){ 
       ob.setYellow(true); 
       ob.setGreen(false); 
       ob.setRed(false); 
       ob.repaint(); 
      } 

      else if(green.isSelected()){ 
       ob.setGreen(true); 
       ob.setYellow(false); 
       ob.setRed(false); 
       ob.repaint(); 
      }  
     } 
    } 
} 

Вот мои секунды класс

package trafficlight; 

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

public class Drawing extends JPanel{ 

    private boolean red = false; 
    private boolean yellow = false; 
    private boolean green = false; 

    public void setRed(boolean clicked){ 
     this.red = clicked; 
    } 

    public void setYellow(boolean clicked){ 
     this.yellow = clicked; 
    } 

    public void setGreen(boolean clicked){ 
     this.green = clicked;  
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.black); 
     g.drawRect(85, 20, 60, 110); 

     if(!red){ 
      g.setColor(Color.black);     
      g.drawOval(100, 25, 30, 30);   
     } 
     else{ 
      g.setColor(Color.red); 
      g.fillOval(100, 25, 30, 30);  
     } 

     if(!yellow){ 
      g.setColor(Color.black);     
      g.drawOval(100, 60, 30, 30); 
     } 
     else{ 
      g.setColor(Color.yellow);     
      g.fillOval(100, 60, 30, 30); 
     } 

     if(!green){ 
      g.setColor(Color.black);     
      g.drawOval(100, 95, 30, 30); 
     } 
     else{ 
      g.setColor(Color.green);     
      g.fillOval(100, 95, 30, 30);   
     } 
    } 
} 

И вот главный метод

package trafficlight; 


public class TrafficLight { 


    public static void main(String[] args) { 
     Frame test = new Frame("TrafficLight", 250, 250); 
     test.add(new Drawing()); 
    } 
} 
+0

'paint' фактически называет' paintComponent' но ваша ошибка исть вам нужно переопределить 'paintComponent' вместо 'paint', и там вы делаете супер-вызов. – Flown

+0

Ой, что плохо, когда я искал свой код, я возился с краской, и я забыл изменить его на paintComponent. Он не будет работать с paintComponent. – eclair

+0

Вы используете два экземпляра «Рисование». Вам нужно добавить поле 'ob' в ваш фрейм, а не новый. – Flown

ответ

0

Некоторые улучшения для вашего кода

  • Не унаследовать от JFrame. Вы не добавить любое значение для этого класса (композиции над наследованием)
  • Ваш ActionListener не должен быть именем класса, потому что он не получил какого-либо государства
  • Нет необходимости для поля в вашем случае
  • Используйте Color константы с Прописная т.е. Color.BLACK
  • Enqueue приложение Свинг в EDT
  • использовать более описательные имена для классов и переменных

Тогда ваша программа может выглядеть следующим образом:

public class TrafficLightUI { 

    public TrafficLightUI(String title, int width, int height) { 
    JFrame frame = new JFrame(title); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(width, height); 
    frame.setResizable(false); 
    frame.setLocationRelativeTo(null); 

    JPanel mainPanel = new JPanel(new BorderLayout()); 

    JPanel buttonPanel = new JPanel(); 

    JRadioButton redRadioButton = new JRadioButton("Red"); 
    JRadioButton yellowRadioButton = new JRadioButton("Yellow"); 
    JRadioButton greenRadioButton = new JRadioButton("Green"); 
    buttonPanel.add(redRadioButton); 
    buttonPanel.add(yellowRadioButton); 
    buttonPanel.add(greenRadioButton); 

    //JRadioButton group allows only one button to be selected at a time 
    ButtonGroup buttonGroup = new ButtonGroup(); 
    buttonGroup.add(redRadioButton); 
    buttonGroup.add(yellowRadioButton); 
    buttonGroup.add(greenRadioButton); 

    TrafficLightPanel trafficLight = new TrafficLightPanel(); 

    //adding components to frame 
    mainPanel.add(buttonPanel, BorderLayout.SOUTH); 
    mainPanel.add(trafficLight, BorderLayout.CENTER); 

    //Adding action listeners 
    redRadioButton.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
     setTrafficLight(true, false, false, trafficLight); 
     } 
    }); 
    yellowRadioButton.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
     setTrafficLight(false, true, false, trafficLight); 
     } 
    }); 
    greenRadioButton.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
     setTrafficLight(false, false, true, trafficLight); 
     } 
    }); 

    frame.add(mainPanel); 
    frame.setVisible(true); 
    } 

    private void setTrafficLight(boolean red, boolean yellow, boolean green, TrafficLightPanel trafficLight) { 
    trafficLight.setGreen(green); 
    trafficLight.setYellow(yellow); 
    trafficLight.setRed(red); 
    trafficLight.repaint(); 
    } 
} 

TrafficLightPanel

public class TrafficLightPanel extends JPanel { 
    private static final long serialVersionUID = 1L; 
    private boolean red = false; 
    private boolean yellow = false; 
    private boolean green = false; 

    public void setRed(boolean isRed) { 
    this.red = isRed; 
    } 

    public void setYellow(boolean isYellow) { 
    this.yellow = isYellow; 
    } 

    public void setGreen(boolean isGreen) { 
    this.green = isGreen; 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.setColor(Color.BLACK); 
    g.drawRect(85, 20, 60, 110); 

    if (!red) { 
     g.setColor(Color.BLACK); 
     g.drawOval(100, 25, 30, 30); 
    } else { 
     g.setColor(Color.RED); 
     g.fillOval(100, 25, 30, 30); 
    } 

    if (!yellow) { 
     g.setColor(Color.BLACK); 
     g.drawOval(100, 60, 30, 30); 
    } else { 
     g.setColor(Color.YELLOW); 
     g.fillOval(100, 60, 30, 30); 
    } 

    if (!green) { 
     g.setColor(Color.BLACK); 
     g.drawOval(100, 95, 30, 30); 
    } else { 
     g.setColor(Color.GREEN); 
     g.fillOval(100, 95, 30, 30); 
    } 
    } 
} 

Главная

public class TrafficLight { 

    public static void main(String... args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
     new TrafficLightUI("TrafficLight", 250, 250); 
     } 
    }); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^