2016-04-09 13 views
0

私は2つの異なるJMenuItems、circle、およびrectangleを押してランダムな場所で図形を描くことができるスイングGUIを作成しようとしています。 私はそれが動作するようになったが、私は、私が使用し、paintComponentをオーバーライドするために助言された paintControllerで問題が発生しました。Java Swing

Graphics2D gg = (Graphics2D) canvas.getGraphics(); 

を使用()。 D 私はこれについて多くの質問があることを知っていますが、私は実際に多くを読んで、試して検索しましたが、私は自分自身を助けることができません..

私を見てくださいRandomDrawerクラス、私はそこにpaintComponent()を実装する必要があることを理解しました(私はそうatleastを望みます)。次の方法でさらに

public void actionPerformed(ActionEvent e) 

occuresどのアクションを知ってもらうイムは、私またはどのように私は彼がその後の描画に伝えることができますすることができますか?または私の全体的なアプローチに欠陥がありますか?

ここに私のコードです。

私に感謝してくれてありがとう、ありがとう。

package plotterpackage; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.Rectangle; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.ComponentEvent; 
import java.awt.event.ComponentListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionListener; 
import java.util.Random; 

import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.WindowConstants; 
import javax.swing.border.BevelBorder; 
import javax.swing.text.JTextComponent; 



public class PlotterApp implements ComponentListener { 
private JFrame frame; 
private JPanel canvas; 
private JPanel statusBar; 
private JTextField status; 
/** 
* Public default constructor.  
*/ 
public PlotterApp() { 
    initialize(); 
} 
/** 
* Start of the application. 
* @param args command line arguments 
*/ 
public static void main(String[] args) { 
    PlotterApp app = new PlotterApp(); 
    app.start(); 
} 
/** 
* Initialize the application. 
*/ 
protected void initialize() { 
    frame = new JFrame("Main"); 
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    frame.setBounds(50,50, 50+640, 50+480); 
    frame.setBackground(Color.GREEN); 
    frame.setJMenuBar(createMenuBar()); 

    frame.getContentPane().add(createContent(), BorderLayout.CENTER); 
    frame.getContentPane().add(createStatusBar(),BorderLayout.SOUTH);   
} 
/** 
* Start the graphical user interface. 
*/ 
public void start() { 
    // show the GUI 
    frame.setVisible(true); 
    status.setText("Application started"); 
} 
/**-* 
* Internal helper to create the main content. 
* @return component with application content. 
*/ 
protected JComponent createContent() { 
    canvas = new JPanel(); 
    canvas.addMouseListener(new Painter()); 
    canvas.addMouseMotionListener(new Painter()); 
    canvas.addComponentListener(this); 
    canvas.setBackground(new Color(128,218,255)); 
    canvas.setForeground(Color.RED); 
    canvas.setBorder(new BevelBorder(BevelBorder.LOWERED)); 
    return canvas; 
} 
/** 
* Internal helper to create the statusbar and -fields. 
* @return component with status/bar. 
*/  
protected JComponent createStatusBar() { 
    FlowLayout layout = new FlowLayout(FlowLayout.LEFT); 
    layout.setHgap(5); 

    statusBar = new JPanel(layout); 
    statusBar.add(new JLabel("Status: ")); 

    status = new JTextField(); 
    status.setPreferredSize(new Dimension(400,25)); 
    status.setEditable(false); 
status.setBorder(newBevelBorder(BevelBorder.RAISED,Color.MAGENTA,Color.LIGHT_GRAY)); 
    status.getInsets().set(2, 10, 2, 10); 
    statusBar.add(status); 

    return statusBar; 
} 
/** 
* Internal helper to create the frames menubar. 
* @return menu bar 
*/ 
protected JMenuBar createMenuBar() { 
    JMenuBar mb = new JMenuBar(); 
    JMenuItem item; 
    JMenu menu; 
    // Action menu 
    menu = new JMenu("Actions"); 
    mb.add(menu); 
    item = new JMenuItem("Draw RandomCircle"); 
    item.addActionListener(new RandomDrawer()); 
    menu.add(item); 

    item = new JMenuItem("Draw RandomRectangle"); 
    item.addActionListener(new RandomDrawer()); 
    menu.add(item); 

    menu.addSeparator(); 
    item = new JMenuItem("Exit"); 
    item.addActionListener(new AppCloser()); 
    menu.add(item); 

    // Color menu not used so far 
    menu = new JMenu("Colors");   
    mb.add(menu); 
    // Help menu not used so far 
    menu = new JMenu("Help");   
    mb.add(menu); 

    return mb; 
} 

class AppCloser implements ActionListener { 
    /* (non-Javadoc) 
    * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) 
    */ 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("application finished, bye-bye... "); 
     frame.setVisible(false); 
     frame.dispose(); 
     System.exit(0); 
    }   
} 

class RandomDrawer extends JPanel implements ActionListener { 
    /* (non-Javadoc) 
    * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) 
    */ 
    @Override 
    protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2 = (Graphics2D) g; 
      g2.setColor(Color.BLACK); 
      g2.drawOval(100, 100, 100, 100); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     Random generator = new Random(); 
     int x = generator.nextInt(100)+100; 
     int y = generator.nextInt(100)+100; 
     int w; 

     if (e.getActionCommand()==("Draw RandomCircle")) { 
      System.out.printf("x = %d y = %d\n", x, y); 
      //status.setText(String.format("rnd draw x: y: ")); 
      //gg.setColor(Color.BLACK); 
      //gg.drawOval(x, y, generator.nextInt(x), generator.nextInt(y));  
     } 

     else if (e.getActionCommand()==("Draw RandomRectangle")) { 
      System.out.printf("x = %d y = %d\n", x, y); 
      //status.setText(String.format("rnd draw x: y: ")); 
      //Graphics2D gg = (Graphics2D) canvas.getGraphics(); 
      //gg.setColor(Color.BLACK); 
      //gg.drawRect(x, y, generator.nextInt(x), generator.nextInt(y));  
     } 
    } 
} 


class Painter extends MouseAdapter implements MouseMotionListener { 

    Point start, end; 
    int startX, startY, oldX, oldY, oldWidth, oldHeight; 

    public void mousePressed(MouseEvent e) { 
    start = e.getPoint(); 
    oldX = startX; 
    oldY = startY; 
    startX = e.getX(); 
    startY = e.getY(); 
    status.setText(String.format("Mouse start: " + start)); 
    } 

    public void mouseDragged(MouseEvent e) { 
    Graphics2D gc = (Graphics2D)canvas.getGraphics(); 
    gc.setColor(new Color(128, 218, 255)); 
    gc.drawOval(oldX, oldY, oldWidth, oldHeight); 
    System.out.printf("oldWidth ist = %3d, oldHeight ist = %3d\n", oldWidth, oldHeight); 
    oldWidth = e.getX(); 
    oldHeight = e.getY(); 
    gc.setColor(Color.BLACK); 
    gc.drawOval(startX, startY, e.getX(), e.getY()); 
    } 

    public void mouseReleased(MouseEvent e) { 
    end = e.getPoint(); 
    status.setText(String.format("Mouse end: " + end)); 
    } 
} 


@Override 
public void componentHidden(ComponentEvent e) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void componentMoved(ComponentEvent e) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void componentResized(ComponentEvent e) { 
    // TODO Auto-generated method stub 

} 
@Override 
public void componentShown(ComponentEvent e) { 
    // TODO Auto-generated method stub 

} 
} 
+1

なぜこのコードはまだgetGraphics()を使用していますか?あなたは特にあなたの他の質問でgetGraphics()を使わないように言われました!あなたの他の質問に注意してください。インクリメンタルに塗りつぶしに楕円を追加したい場合は、 'addOval(...)'型のメソッドを作成する必要があります。あなたは塗装法でそれをしません。あなたはまた見るために働く事例を与えられました。作業コードから開始し、作業コードを変更します。 – camickr

+0

あなたは正しいです、申し訳ありません。もう一度起こりません。私はそれらの事を見渡して、やり直します – Kaw

答えて

1

これは、カスタムペイントが行われるべきかではありません...

Graphics2D gg = (Graphics2D) canvas.getGraphics(); 

をしないでください。スイングでは、何か塗装が必要なときに尋ねられ、コンポーネントの現在の状態を再描画することが期待されます。詳細

ため Painting in AWT and SwingPerforming Custom Painting見を有することにより

スタートは基本的に、あなたはJPanelは、塗料の成分の現在の状態(最初の呼び出しsuper.paintComponentに確認すること)のpaintComponentメソッドをオーバーライドする必要があります。あなたはどのような形で状態を保存する必要があります

は、あなた(ListあるいはカスタムオブジェクトまたはImage)に最も有用である

あなたはAPIを使用するとしたらrepaintを呼び出してUIを更新することを要求することができます状態を変更しました

1

シェイプは、ArrayListのような種類のコンテナに配置できます。 インサイドpaintComponent(グラフィックスグラム)あなたはそのリストからすべての図形を描画するとのactionPerformed(のActionEvent e)のの内側に、あなたは上の描画オブジェクト、上再描画()メソッドを使用する必要があります。

関連する問題