0

描画する円の数を取り、ランダムな場所/サイズで drawPanel に描画する GUI を作成しようとしています。actionListener で円を描こうとすると、drawOval に赤い線が表示されます

ファーストクラス:

 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.Dimension;
 import java.awt.FlowLayout;
 import java.awt.Graphics;
 import java.awt.GridLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.util.Random;
 import javax.swing.BorderFactory;
 import javax.swing.JButton;
 import javax.swing.JPanel;
 import javax.swing.JTextArea;

/**
 * 
 * @author Chris
 *
 */
 public class CirclesPanel extends JPanel{
 private JButton draw, clear;
 private JTextArea textArea;
 private JPanel panel, drawPanel, buttonPanel;
 private int count;

 /**constructor
* builds the frame
*/
 public CirclesPanel(){

//creates buttons and textArea
  draw = new JButton("Draw"); 
  clear = new JButton("Clear");
  textArea = new JTextArea(1,10);
  textArea.setBorder(BorderFactory.createTitledBorder("Circles"));

//creats panel
 JPanel panel = new JPanel();
 panel.setLayout(new BorderLayout());
 setPreferredSize(new Dimension(620, 425));
//creates subpanel drawPanel
 JPanel drawPanel = new JPanel();
 drawPanel.setPreferredSize(new Dimension(450,400));
 drawPanel.setBackground(Color.BLACK);
//creates subpanel buttonPanel
 JPanel buttonPanel = new JPanel();
 buttonPanel.setLayout(new GridLayout(3,1));
//adds all the content to the frame
 add(panel);
 add(buttonPanel, BorderLayout.WEST);
 add(drawPanel, BorderLayout.EAST);
 buttonPanel.add(textArea);
 buttonPanel.add(draw);
 buttonPanel.add(clear);
//reads if the draw button is clicked
 draw.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e)
    {
      count =Integer.parseInt(textArea.getText());//takes the count in
      repaint();//repaints the picture to add the circles
    }
 }); 
//reads if the clear button is clicked
 clear.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e)
            {
            count=0;//sets the count to 0 so nothing is painted
              repaint();//repaints the window
            }
         }); 



 }
/**Paint component
 * draws the random circles
 */
  public void paintComponent(Graphics g) {
 Random generator = new Random();
 int x, y, diameter;
 for(int i = 0; i < count; i++){ //loop that takes the count and does this "x" times
  g.setColor(Color.BLUE);//sets color to blue
  x = generator.nextInt(90);//random location for x
  y = generator.nextInt(90);//random location for y
  diameter = generator.nextInt(30);//random size
  g.fillOval(x, y, diameter, diameter);//draws the circle
    }
}
 }

2級

import javax.swing.JFrame;


public class Circles { 
public static void main(String[]args){
JFrame frame = new JFrame("Cicles HW9");
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

frame.getContentPane().add(new CirclesPanel());

frame.pack();
frame.setVisible(true);


}
}
4

2 に答える 2

1

だからあなたの中で、私はほとんど追加しませんでした。まず、プログラム全体を1つのクラス(CIRLCES PANEL)で作成しました.2番目のクラスを使用したい場合は、それを使用できます....描画のActionPerformedメソッドを読み取るのではなく、ボタンと一緒に配置されていないことを意味します。ボタン (DRAW)に直接追加しました。ボタンをクリックするたびに、textArea値が自動的に読み取られ、描画されます。円。テキストエリアをFINALにしたので、どこでも使えるように……

今あなたがする必要があること---- - このプログラムはフレーム全体に円を描いています。つまり、描画パネルではなく、値を設定する必要があるため、描画パネル領域に描画されます - また、する必要があります楕円形に色を追加します。これは、見えない黒色の円を描画するためです.....

また、私があなたに言及するのを忘れていることの1つは、あなたのクリアメソッドのコードも追加する必要があるということです...

 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.Dimension;
 import java.awt.FlowLayout;
 import java.awt.Graphics;
 import java.awt.GridLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.util.Random;
 import javax.swing.BorderFactory;
 import javax.swing.JButton;
 import javax.swing.JPanel;
 import javax.swing.JTextArea;


 public class CirclesPanel extends JPanel{
 private JButton draw, clear;
 private JTextArea textArea;
 private JPanel panel, drawPanel, buttonPanel;
 private int count;

 public CirclesPanel(){

JButton draw = new JButton("Draw");
JButton clear = new JButton("Clear");
final JTextArea textArea = new JTextArea(1,10);
textArea.setBorder(BorderFactory.createTitledBorder("Circles"));


JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
setPreferredSize(new Dimension(620, 425));

JPanel drawPanel = new JPanel();
drawPanel.setPreferredSize(new Dimension(450,400));
drawPanel.setBackground(Color.BLACK);

JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(3,1));

add(panel);
add(buttonPanel, BorderLayout.WEST);
add(drawPanel, BorderLayout.EAST);
buttonPanel.add(textArea);
buttonPanel.add(draw);
buttonPanel.add(clear);

draw.addActionListener(new ActionListener() {

    public void actionPerformed(ActionEvent e)
    {
          count =Integer.parseInt(textArea.getText());
          repaint();
    }
});        
}

  public void paintComponent(Graphics g) {
  Random generator = new Random();
  int x, y, diameter;
  for(int i = 0; i < count; i++){
     x = generator.nextInt(90);
    y = generator.nextInt(90);
    diameter = generator.nextInt(30);
    g.drawOval(x, y, diameter, diameter);


 }
 }


 }

ここに画像の説明を入力

于 2013-04-25T03:47:52.073 に答える
1

あなたがしたいことは、ボタンがクリックされたときにいくつかのランダムな円を描くことです。物事がどのように機能するかを示すために、簡略化したバージョンを書きます。drawPanel

サンプル

物事をシンプルにするために、drawButtonとのみを保持します。paintPanel

public class PaintFrame extends JFrame {

    private JPanel content = new JPanel();
    private JButton drawButton = new JButton("Draw");
    private PaintPanel paintPanel = new PaintPanel();

    public PaintFrame() {

        getContentPane().add(content);
        content.setLayout(new BorderLayout());

        drawButton.setSize(100, 500);
        drawButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // drawButton is fired, repaint the paintPanel
                paintPanel.repaint();
            }
        });
        content.add(drawButton, BorderLayout.WEST);
        content.add(paintPanel, BorderLayout.CENTER);
    }

}

JPanel を拡張する新しいクラスが必要でありpaintComponent、ペイント ジョブを実行するメソッドをオーバーライドします。これにより、確実にパネル上に描画できます

class PaintPanel extends JPanel {

    public PaintPanel() {
        setSize(500, 500);
        setBackground(Color.BLACK);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Random random = new Random();
        g.setColor(Color.WHITE);
        // draw 5 random circles
        int count = 5;
        for (int i = 0; i < count; i++) {
            g.drawOval(random.nextInt(250), random.nextInt(250),
                    random.nextInt(250), random.nextInt(250));
        }
    }

}

メインクラス

public class DrawMain {

    public static void main(String[] args) {

        JFrame frame = new PaintFrame();
        frame.setDefaultCloseOperation(PaintFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 500);
        frame.setVisible(true);

    }

}
于 2013-04-25T04:03:50.313 に答える