2016-10-14 4 views
0

私の主な問題は、リスナークラスを実装する場所が混乱しているため、アプレットのアクション(キープレスかマウスクリックかに関係なく)更新されます。私のコンパイルの問題は、私のCanvasPanelクラスのCanvasPanelメソッドからであり、私のactionPerformedメソッドで引数を持たないことに気付きました。しかし、この時点では、これらのリスナーがどのように正しく実装されるべきかわかりません。すでに投稿されている別の質問を見てみましたので、重複している場合はごめんなさい。そのコードでアクションをテストすることができないため、アプレットを更新できません

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

public class WholePanel extends JPanel 
{ 
    private Color foregroundColor, backgroundColor; 
    private int currentDiameter, x1, y1; 
    private CanvasPanel canvas; 
    private JPanel buttonPanel; 

    private JRadioButton filledRadio, unfilledRadio; 
    private JRadioButton redRadio, greenRadio; 
    private boolean fill; 
    private Graphics myCircle; 

    public WholePanel() 
    { 
     backgroundColor = Color.CYAN; 
     foregroundColor = Color.RED; 

     currentDiameter = 100; 
     x1 = 200; y1 = 100; 

     unfilledRadio = new JRadioButton("Unfilled", true); 
     filledRadio = new JRadioButton("Filled", false); 
     redRadio = new JRadioButton("Red", true); 
     greenRadio = new JRadioButton("Green", false); 

     buttonPanel = new JPanel(); 
     buttonPanel.add(unfilledRadio); 
     buttonPanel.add(filledRadio); 
     buttonPanel.add(redRadio); 
     buttonPanel.add(greenRadio); 

     canvas = new CanvasPanel(); 

     JSplitPane sPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, buttonPanel, canvas); 

     setLayout(new BorderLayout()); 
     add(sPane, BorderLayout.CENTER); 
    } 

    private class ColorListener implements ActionListener 
    { 
    public void actionPerformed(ActionEvent event) 
     { 
      if (redRadio.isSelected()) { 
       greenRadio.setSelected(false); 
       backgroundColor = Color.RED; 
      } 
      else if (greenRadio.isSelected()) { 
       redRadio.setSelected(false); 
       backgroundColor = Color.GREEN; 
      } 
      // ...extra else/if statements 
     } 
    } // end of ColorListener 


    private class FillListener implements ActionListener 
    { 
    private boolean fill; 

    public void actionPerformed(ActionEvent event) 
     { 
      if (filledRadio.isSelected()) { 
       unfilledRadio.setSelected(false); 
       fill = true; 
       paintComponent(myCircle); 
      } 
      else if (unfilledRadio.isSelected()) { 
       filledRadio.setSelected(false); 
       fill = false; 
       paintComponent(myCircle); 
      } 
     } 
    } 

    private class CanvasPanel extends JPanel 
    { 
    public CanvasPanel() 
     { 
     addKeyListener(new DirectionListener()); 
     addMouseListener(new PointListener()); 

     setBackground(backgroundColor); 

     //This method needs to be called for this panel to listen to keys 
     //When panel listens to other things, and go back to listen 
     //to keys, this method needs to be called again. 

     ColorListener.actionPerformed(); 
     FillListener.actionPerformed(); 
     requestFocus(); 
     } 


    public void paintComponent(Graphics page) 
     { 
      super.paintComponent(page); 
      setBackground(backgroundColor); 

      page.setColor(foregroundColor); 
      page.drawOval(x1, y1, currentDiameter, currentDiameter); 
      if (fill == true) { 
       page.fillOval(x1, y1, currentDiameter, currentDiameter); 
      } 
     } 

    /** This method is overriden to enable keyboard focus */ 
    public boolean isFocusable() 
     { 
     return true; 
     } 

    private class DirectionListener implements KeyListener 
     { 
     public void keyReleased(KeyEvent e) {} 
     public void keyTyped(KeyEvent e) {} 
     public void keyPressed(KeyEvent e) 
      { 
      currentDiameter = 100; 
      x1 = 200; y1 = 100; 
      int keyCode = e.getKeyCode(); 
      // switch statement here 

      } 
      } 
     } // end of DirectionListener 


    public class PointListener implements MouseListener 
     { 
     public void mousePressed (MouseEvent event) 
      { 
      canvas.requestFocus(); 
      } 

     public void mouseClicked (MouseEvent event) {} 
     public void mouseReleased (MouseEvent event) {} 
     public void mouseEntered (MouseEvent event) {} 
     public void mouseExited (MouseEvent event) {} 

     } // end of PointListener 

    } // end of Canvas Panel Class 

} // end of Whole Panel Class 
+0

コードを管理しやすい[mcve]に縮小してください。そこには非常に多くのコードがあり、そのほとんどはあなたの問題に関係しません。リンクをお読みください。 –

+0

私は主にパネル作成の方法を取りましたが、それはほとんど不必要でした。私がCanvasPanelクラスに実装しようとしている4つのクラスがあるので残りの部分は残っています –

+0

私が求めているのではないので、リンクを読んだり再読んでください。はい、私たちは**メインメソッドを必要とします**コンパイルと実行が可能なコードが必要です。 –

答えて

2

いくつかの主要な問題:あなたは直接paintComponentを呼んでいる

  • 、何かあなたがやるべきではありません

    は、ここに私のコードです。クラスの状態フィールドを変更する代わりにrepaint()を呼び出してから、paintComponentに状態フィールドを使用して何をペイントするかを決定させます。

  • グラフィックスフィールドを使用する場合と同じですが、使用しないでください。代わりに、JVMによってpaintComponentメソッドに与えられたGraphicsオブジェクトのみを使用してください。 Swing Graphics tutorial will explain this
  • リスナーがコールバックメソッドを直接呼び出すようにしようとしています。これは、リスナーがどのように動作するかとは正反対であり、リスナーを使用する利点を無効にします。代わりにそれらを使用するコンポーネントにあなたのリスナーを追加 - それらを必要とする部品、のMouseListener ...などに、それらを必要とするボタンにActionListenerにの追加などKeyListenersを...

たとえば、のは、ずっと単純たとえば、2点のJRadioButtonを使用するものを見てみましょう、それはそれです:

はここ
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class PartialPanel extends JPanel { 
    private static final int PREF_W = 800; 
    private static final int PREF_H = 650; 
    private static final int CIRC_W = 200; 
    private int circleX = 300; 
    private int circleY = 200; 
    private Color circleColor = null; 
    private ButtonGroup buttonGroup = new ButtonGroup(); 
    private JRadioButton blueButton = new JRadioButton("Blue"); 
    private JRadioButton redButton = new JRadioButton("Red"); 

    public PartialPanel() { 
     ColorListener colorListener = new ColorListener(); 
     blueButton.addActionListener(colorListener); 
     redButton.addActionListener(colorListener); 

     buttonGroup.add(blueButton); 
     buttonGroup.add(redButton); 

     JPanel buttonPanel = new JPanel(); 
     buttonPanel.add(blueButton); 
     buttonPanel.add(redButton); 

     add(buttonPanel); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (circleColor != null) { 
      g.setColor(circleColor); 
      g.fillOval(circleX, circleY, CIRC_W, CIRC_W); 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } else { 
      return new Dimension(PREF_W, PREF_H); 
     } 
    } 

    private class ColorListener implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (e.getSource() == blueButton) { 
       circleColor = Color.BLUE; 
      } else if (e.getSource() == redButton) { 
       circleColor = Color.RED; 
      } 
      repaint(); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 

    private static void createAndShowGui() { 
     PartialPanel mainPanel = new PartialPanel(); 
     JFrame frame = new JFrame("PartialPanel"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.add(mainPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

我々はのJRadioButtonにColorListenerを追加します。リスナーでは、クラスのcircColorフィールドの状態を変更し、repaint()を呼び出します。次に、paintComponentメソッドは、サークルを描画するときに使用する色を決定するためにcircColorの値を使用します。

+0

ありがとう、これは私の修正プログラムを開始するのに最適な場所です。私はあなたが私のためにそれを分解するために取った時間を感謝します –

+0

@ JordanPagni:あなたは大歓迎です。上記の簡略化されたバージョンを見てください。ただ一つの**リスナーだけを扱うものですが、概念は同じです。リスナーを追加するコンポーネントにリスナーを追加し、リスナーでクラスの状態を変更してrepaintを呼び出し、paintComponentメソッドで状態フィールド(ここではcircColor、circleXおよびcircleY)を使用して何をペイントするかを決定しますそして、どこ。 –

関連する問題