2017-11-15 24 views
2

에 의해 변경된다. "fire"버튼을 누르면 불꽃 놀이가 나타납니다. 그러나 전략적 print 문을 사용하여 코드를 래핑하는 조건문이 충족 되어도 내 paintComponent() 메서드가 실행되지 않는다는 사실을 발견했습니다. 정확한 값이 정확한 시간에 생성되도록하기 위해 다른 모든 방법을 두 번 확인했습니다. 이 문제가 가장 가능성이 도서관과 친숙 나의 부족에서 파생 - 내가 찾을 수있는 JComponent의 문학과의 모든 질문을 통해 찾고 후, 나는 그것이 동작하지 않습니다 두려워 해요. 즉, 아무리 초보적인 조언이라도 대단히 감사 할 것입니다. 요약 텍스트 코드는 다음과 같습니다 : 나는 그것을 사용한 경우없는 확신에 대한은 내가 두 JFrames, 두 번째에 불꽃의 그래픽 표시 변경 가능한 슬라이더와 텍스트 필드와 하나 개의 프레임을 사용하는 JComponent의 응용 프로그램을 만들려고 노력하고 별도의 GUI

* 스윙 타이머가 또한 문제가 될 수 올바르게

[fireworksCanvas.java]

public class fireworkCanvas extends JComponent implements ActionListener{ 

private static final long serialVersionUID = 1L; 
private ArrayList<Ellipse2D> nodes = new ArrayList<Ellipse2D>(); 
private ArrayList<Line2D> cNodes = new ArrayList<Line2D>(); 
private ArrayList<QuadCurve2D> bCurves = new ArrayList<QuadCurve2D>(); 
private int[] arcX; 
private int[] arcY; 
private Color userColor; 
private Random rand = new Random(); 
private int shellX, shellY, fType, theta, velocity; 
private Timer timer; 
private int time; 
private double g = -9.8; //gravity in m/s 
public boolean explosivesSet; 

public fireworkCanvas() { 
    time = rand.nextInt(3000) + 2000; 
    timer = new Timer(time, this); // 5 seconds 
    timer.start(); 
    fType = 0; 
} 

@Override 
public void paintComponent(Graphics g){ 

    if (explosivesSet) { 
     System.out.println("fType" + fType); 
     super.paintComponent(g); 
     Graphics2D g2D = (Graphics2D) g; 

     g.setColor(Color.BLACK); 
     g.drawPolyline(arcX, arcY, arcX.length); 

     for (Ellipse2D e : nodes) { 
      System.out.println("painting nodes"); // NEVER PRINTS 
      g.setColor(userColor); 
      g.fillOval(shellX + (int) e.getX(), shellY + (int) e.getY(), (int) e.getWidth(), (int) e.getHeight()); 
     } 
     for (Line2D l: cNodes) { 
      System.out.println("painting cNodes"); // NEVER PRINTS 
      g.setColor(determineColor("l")); 
      g.drawLine(shellX + (int) l.getX1(), shellY + (int) l.getY1(), shellX + (int) l.getX2(), shellY + (int) l.getY2()); 
     } 
     for (QuadCurve2D c: bCurves) { 
      System.out.println("painting curves"); // NEVER PRINTS 
      g.setColor(determineColor("c")); 
      g2D.draw(c); 
     } 
    } 
} 

public Color determineColor(String type) { 

    // returns color 
} 

public void setExplosives() { 

    if (fType != 5 && fType != 0) { 

     nodes.clear(); // clears three array lists with FW components 
     cNodes.clear(); // these are the components to paint for the 
     bCurves.clear(); // firework explosion graphic 
     setArc(); // stores path of shell for a polyLine to be drawn 

     // builds and generates components for FW based on type chosen (fType) 
     setExplosivesSet(true); 
     repaint(); 
    } 
} 

public void setArc() { 
    // builds int[] for shellX, shellY 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    // nothing is here?? 
    // should I use the action performed in some way? 
} 

[GUI.java] 모든

public class GUI extends JFrame implements ActionListener, ChangeListener, ItemListener, MouseListener{ 

private static JFrame canvasFrame = new JFrame("Canvas"); 

private fireworkCanvas canvas = new fireworkCanvas(); 
private Choice fireworkChooser = new Choice(); 
private JSlider launchAngle = new JSlider(); 
private JSlider velocity = new JSlider(); 
private JSlider r = new JSlider(); 
private JSlider g = new JSlider(); 
private JSlider b = new JSlider(); 
private JPanel panel = new JPanel(); 
private JButton button = new JButton("Fire!"); 
private JLabel launchLabel = new JLabel("Launch Angle "); 
private JLabel velocityLabel = new JLabel("Velocity "); 
private JLabel rLabel = new JLabel("Red "); 
private JLabel gLabel = new JLabel("Green "); 
private JLabel bLabel = new JLabel("Blue "); 
public static int fHeight = 500; 
public static int fWidth = 500; 

public GUI() { 

    this.add(panel); 
    panel.add(button); 
    panel.add(fireworkChooser); 
    panel.add(launchAngle); 
    panel.add(launchLabel); 
    panel.add(velocity); 
    panel.add(velocityLabel); 
    panel.add(r); 
    panel.add(rLabel); 
    panel.add(g); 
    panel.add(gLabel); 
    panel.add(b); 
    panel.add(bLabel); 

    addActionListener(this); 
    BoxLayout bl = new BoxLayout(getContentPane(), BoxLayout.Y_AXIS); 
    setLayout(bl); 

    fireworkChooser.addItemListener(this); 
    launchAngle.addChangeListener(this); 
    velocity.addChangeListener(this); 
    r.addChangeListener(this); 
    g.addChangeListener(this); 
    b.addChangeListener(this); 
    button.addActionListener(this); 

    fireworkChooser.add("Firework 1"); 
    fireworkChooser.add("Firework 2"); 
    fireworkChooser.add("Firework 3"); 
    fireworkChooser.add("Firework 4"); 
    fireworkChooser.add("Super Firework"); 

    launchAngle.setMinimum(1); 
    launchAngle.setMaximum(90); 
    velocity.setMinimum(1); 
    velocity.setMaximum(50); 
    r.setMinimum(0); 
    r.setMaximum(255); 
    g.setMinimum(0); 
    g.setMaximum(255); 
    b.setMinimum(0); 
    b.setMaximum(255); 

} 

@Override 
public Dimension getPreferredSize() { 
    return new Dimension(600, 200); 
} 

@Override 
public void stateChanged(ChangeEvent e) { 

    // sets FW variables 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    if (e.getSource() == button) { 
     canvas.setfType(fireworkChooser.getSelectedIndex()+1); 
     canvas.setExplosives(); 
     canvas.repaint(); 
     canvas.setExplosivesSet(false); 
     System.out.println("button fired"); 
    } 
} 

public static void createAndShowGUI() { 
    GUI gui = new GUI(); 
    gui.pack(); 
    gui.setLocationRelativeTo(null); 
    gui.setVisible(true); 
    gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    fireworkCanvas canvas = new fireworkCanvas(); 
    canvasFrame.pack(); 
    canvasFrame.add(canvas); 
    canvasFrame.setLocationRelativeTo(null); 
    canvasFrame.setVisible(true); 
    canvasFrame.setSize(fWidth, fHeight); 
    canvasFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGUI(); 
     } 
    }); 
} 


} 
+1

제거'(false)를 setExplosivesSet. paintComponent가 호출되는 빈도를 제어 할 수 없습니다. 다양한 운영 체제 이벤트에 응답하여 초당 여러 번 호출 될 수 있습니다. 페인팅 메서드는 상태를 수정해서는 안됩니다. 많은 이해 – VGR

+0

는 - 나는'setExplosivesSet (거짓)를 이동 한; '의 actionPerformed에()를 GUI.java 클래스 - 내가 믿는 작동합니다 - 내 죽음에, 아직, 아직하지 않습니다. –

+0

'nodes','cNodes','bCurves'리스트에 아무 것도 추가하지 않고'arcX'와'arcY'를 초기화하지 않으므로 페인트 할 것이 없습니다. 타이머의 지속 시간이 지날 때마다 Timer에 의해 호출되는'actionPerformed'에서 모든 작업을하고 싶었을 것입니다. – VGR

답변

2

첫째 :

public fireworkCanvas() 

클래스 이름은 대문자로 시작해야합니다. 코드의 다른 모든 클래스는이 규칙을 따릅니다. 예제를 통해 학습하십시오.

private Choice fireworkChooser = new Choice(); 

선택은 스윙 응용 프로그램에서 AWT 구성 요소를 함께 사용하지 마십시오가 AWT 구성 요소입니다. JComboBox을 사용하십시오. 내의 paintComponent() 메소드는) (프레임 팩 후에

fireworkCanvas canvas = new fireworkCanvas(); 
canvasFrame.pack(); 
canvasFrame.add(canvas); 

당신은 프레임에 캔버스를 추가 실행되지 않기 때문에, 캔버스의 크기가 (0

, 0) 페인트 칠할 것이 없습니다.

pack() 전에 프레임에 캔버스를 추가해야하며 fireworkCanvas 클래스에 getPreferredSize()을 구현하여 pack() 메서드가 제대로 작동 할 수 있도록해야합니다.

는 기본과 당신이 시작하는 예제 작업을위한 Custom Painting에 스윙 튜토리얼 섹션을 읽어보십시오. 당신의 paintComponent 메소드로부터`;

+0

JCheckBox가 아니라 JComboBox를 의미한다고 생각합니다. – VGR

+0

@vgr, 죄송합니다. – camickr