2012-02-13 184 views
5

我想在JPanel上绘制一个矩形。能够用下面的代码绘制。在JPanel上绘制矩形

public class DrawingColor extends JFrame 
{ 
    public static void main(String[] args) 
    { 
     DrawingColor d = new DrawingColor(); 
    } 

    public DrawingColor() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     getContentPane().add(new MyComponent()); 
     setSize(400,400); 
     setVisible(true); 
    } 

    public class MyComponent extends JComponent 
    { 
     @Override 
     public void paint(Graphics g) 
     { 
      int height = 200; 
      int width = 120; 
      g.setColor(Color.red); 
      g.drawRect(10, 10, height, width); 
      g.setColor(Color.gray); 
      g.fillRect(11, 11, height, width); 
      g.setColor(Color.red); 
      g.drawOval(250, 20, height, width); 
      g.setColor(Color.magenta); 
      g.fillOval(249, 19, height, width); 
     } 
    } 
} 

但是getContentPane().add(new MyComponent()); 而不是这个声明,我需要添加一个基本面板到框架。在基础面板上,我想添加MyComponent面板。

JPanel basePanel = new JPanel(); 
    basePanel = new MyComponent(); 
    getContentPane().add(basePanel); 

如果我这样做,矩形不可见。任何想法? 而且我还需要在运行时更改矩形的大小。可能吗?

+0

请缩进代码。 – MByD 2012-02-13 11:26:32

+0

+1,有趣的问题虽然,帮助我学习的东西:-) – 2012-02-13 13:31:28

回答

1

我曾试图绘制一个正方形并循环,在运行时动态改变大小....附上完整的代码..如果它有帮助。

import java.awt.Color; 
import java.awt.Container; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.awt.geom.Ellipse2D; 
import java.awt.geom.Rectangle2D; 
import javax.swing.*; 
import java.*; 
import java.awt.Canvas; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener;      

class DisplayCanvas extends Canvas 
{ 
    static boolean clip = false; 
    static boolean clipfurther = false; 
    static boolean isReset = false, isSlider = false; 
    int w, h; 
    static int wi = 300, hi = 300; 
    public DisplayCanvas() 
    { 
     //setSize(300, 300); 
    setBounds(20, 40, 300, 300); 
    setBackground(Color.white); 
    } 
    public void paint(Graphics g) 
    { 
     Graphics2D g2=(Graphics2D) g; 
    w = getSize().width; 
    h = getSize().height; 

    if(clip) 
    { 
     // Ellipse2D e = new Ellipse2D.Float(w/4.0f,h/4.0f,w/2.0f,h/2.0f); 
     Rectangle2D r = null; 
     if(isSlider) 
     { 
      r = new Rectangle2D.Float((w)/(4.0f), (h)/(4.0f), wi/2.0f, hi/2.0f); 
     //  isSlider=false; 
     } 
     else 
     r = new Rectangle2D.Float(w/4.0f, h/4.0f, wi/2.0f, hi/2.0f); 
      //g2.setClip(e); 

     System.out.println("Width : "+ wi +" Height : "+ hi); 
     g2.setClip(r); 
     System.out.println(g2.getClipBounds()); 

     if(shape.selectedcolor == "red") 
     { 
      g2.setColor(Color.red); 
     } 
     else if(shape.selectedcolor == "blue") 
     { 
      g2.setColor(Color.BLUE); 
     } 
     else if(shape.selectedcolor == "yellow") 
     { 
      g2.setColor(Color.yellow); 
     } 

     //g2.setColor(Color.RED); 
     g2.fillRect(0, 0, w, h); 
     } 
    else if(clipfurther) 
    { 
     //Rectangle r = new Rectangle(w/4, h/4, w/4, h/4); 
     Ellipse2D r = new Ellipse2D.Float(w/4.0f, h/4.0f, wi/2.0f, hi/2.0f); 
     g2.clip(r); 
     //g2.setColor(Color.green); 
     //g2.setColor(Color.getColor(shape.selectedcolor)); 

     if(shape.selectedcolor == "red") 
     { 
      g2.setColor(Color.red); 
     } 
     else if(shape.selectedcolor == "blue") 
     { 
     g2.setColor(Color.BLUE); 
     } 
     else if(shape.selectedcolor == "yellow") 
     { 
     g2.setColor(Color.yellow); 
     } 

     g2.fillRect(0, 0, w, h); 
     } 
    } 
} 

class RadioListener implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     if(e.getSource() == shape.circle) 
     { 
     shape.selectedcolor = shape.selectedcolor_reset; 
     System.out.println("Inside circle "+   shape.selectedcolor_reset); 
     System.out.println("2222222222"); 
     DisplayCanvas.clip = true; 
     DisplayCanvas.clipfurther = false; 
     shape.canvas.repaint(); 
    } 
    if (e.getSource() == shape.square) 
    { 
     shape.selectedcolor = shape.selectedcolor_reset; 
     System.out.println("333333333333333"); 
     DisplayCanvas.clip = false; 
     DisplayCanvas.clipfurther = true; 
     shape.canvas.repaint(); 
    }     
    } 
} 

class shape extends JFrame implements ActionListener 
{ 
    static String fname; 
    static JPanel panel, draw; 
    static Container contentpane, draw_pane; 
    static JFrame frame; 
    static JLayeredPane layer, draw_layer; 
    static JTextField user; 
    static JButton reset, cancel; 

    static JLabel file1, file2; 
    static JTextField text1; 
    static JRadioButton circle, square; 
    static JInternalFrame iframe, errmessage; 
    static JComboBox colors; 
    static JEditorPane sqc; 
    static JScrollPane scroller; 
    static JSlider slider; 
    String colors_array[]={"...", "red", "blue", "yellow"}; 
    static DisplayCanvas canvas; 
    static String selectedcolor, selectedcolor_reset; 

    shape() 
    { 
     canvas=new DisplayCanvas(); 

    panel= new JPanel(); 
    panel.setBounds(20,20,250,140); 
    //panel.setLayout(new FlowLayout(10, 10, 10)); 
    panel.setLayout(null); 
    contentpane = getContentPane(); 
    contentpane.add(canvas); 
    //draw_pane=getContentPane(); 

    layer = new JLayeredPane(); 
    layer.setBounds(50,245,300,205); 
    layer.setForeground(Color.blue); 

    draw_layer = new JLayeredPane(); 
    draw_layer.setBounds(200, 200, 80, 30); 
    draw_layer.setForeground(Color.BLACK); 

    draw = new JPanel(); 
    draw.setBounds(20, 20, 250, 300); 
    draw.setLayout(null); 

    reset = new JButton("RESET"); 
    reset.setBounds(360, 60, 100, 25); 

    circle = new JRadioButton("Square"); 
    circle.setBounds(400, 100, 100, 40); 
    circle.setActionCommand("encryption"); 

    square = new JRadioButton("Circle"); 
    square.setBounds(330,100, 60, 40); 
    square.setActionCommand("decryption"); 

    colors = new JComboBox(colors_array); 
    colors.setBounds(405, 140, 80, 30); 
    colors.setVisible(true); 

    file1 = new JLabel(" Select Color :"); 
    file1.setBounds(320, 130, 150, 50); 
    //defining the Button Group for the Radio Buttons 

    ButtonGroup group = new ButtonGroup(); 
    group.add(circle); 
    group.add(square); 

    cancel = new JButton("Exit"); 
    cancel.setBounds(365, 250, 85, 25); 

    file2 = new JLabel("SIZE :"); 
    file2.setBounds(336, 180, 150, 50); 
    setslider(0, 100, 100, 25, 5); 
    slider.setBounds(386, 190, 100, 50); 

     slider.setVisible(true); 

    panel.add(file2); 
    panel.add(layer); 
     panel.add(circle); 
    panel.add(square); 
    panel.add(colors); 
    panel.add(slider); 
    panel.add(file1); 
    panel.add(reset); 
    panel.add(cancel); 
    //panel.add(new CircleDraw()); 

    //draw.add(draw_layer); 
    // draw_pane.add(draw); 
    contentpane.add(panel); 
    // contentpane.add(draw); 
    // contentpane.add(scroller); 
    RadioListener radio = new RadioListener(); 
    circle.addActionListener(radio); 
    square.addActionListener(radio); 
    reset.addActionListener(this); 
    cancel.addActionListener(this); 

    colors.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent ae) 
     {       
      JComboBox cb = (JComboBox)ae.getSource(); 
     selectedcolor = (String)cb.getSelectedItem(); 
     System.out.println(selectedcolor); 
     selectedcolor_reset = selectedcolor; 
     System.out.println("SELECTED "+ cb.getSelectedIndex()); 
     canvas.repaint(); 
     } 
     }); 

    addWindowListener(new WindowAdapter() 
    { 
     public void windowClosing(WindowEvent e) 
     { 
      System.exit(0); 
     } 
    }); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     if(e.getSource()== cancel) 
    { 
     System.exit(0); 
    } 
    if (e.getSource() == reset) 
    { 
     System.out.println("111111111"); 
     DisplayCanvas.clip = true; 
     DisplayCanvas.clipfurther = false; 
     DisplayCanvas.isReset = true; 
     shape.selectedcolor = "..."; 
     System.out.println(" PREVIOUS " + selectedcolor_reset); 
     DisplayCanvas.hi = DisplayCanvas.wi = 300; 
     canvas.repaint(); 
    } 
    } 
    public class SliderListener implements ChangeListener 
    { 
     public SliderListener() 
     { 
    } 
    public void stateChanged(ChangeEvent e) 
     { 
     JSlider slider = (JSlider)e.getSource(); 
     System.out.println(slider.getValue()); 
     DisplayCanvas.wi = slider.getValue() * 3; 
     DisplayCanvas.hi = DisplayCanvas.wi; 
     DisplayCanvas.isSlider = true; 
     canvas.repaint(); 
    } 
    } 
    public void setslider(int min,int max,int init,int mjrtk,int mintk) 
    { 
     slider = new JSlider(JSlider.HORIZONTAL, min, max, init); 
    slider.setPaintTicks(true); 
    slider.setMajorTickSpacing(mjrtk); 
    slider.setMinorTickSpacing(mintk); 
    slider.setPaintLabels(true); 
    slider.addChangeListener((ChangeListener) new SliderListener()); 
    } 
} 

public class display 
{ 
    static JFrame frame; 
    /** 
     * @param args the command line arguments 
     */ 
    public static void main(String[] args) 
    { 
     // TODO code application logic here 
    frame=new shape(); 

    frame.setBounds(380, 200, 500, 400); 
    frame.setTitle("SHAPE AND COLOR"); 
    frame.setVisible(true); 

    } 
} 
+0

+1,不错的代码:-) – 2012-02-13 12:11:45

+0

为什么代码的巨大缩进? – 2012-02-13 12:25:47

+0

我试着格式化代码,但他不接受,上帝知道为什么,即使它工作正常。 – 2012-02-13 12:39:30

8

1)为Swing的JComponent,你必须使用paintComponent()代替paint()方法

2)你的JComponent没有回报PreferredSize

例如

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.ComponentEvent; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 

public class CustomComponent extends JFrame { 

    private static final long serialVersionUID = 1L; 

    public CustomComponent() { 
     setTitle("Custom Component Graphics2D"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public void display() { 
     CustomComponents cc = new CustomComponents(); 
     /*cc.addComponentListener(new java.awt.event.ComponentAdapter() { 

      @Override 
      public void componentResized(ComponentEvent event) { 
       setSize(Math.min(getPreferredSize().width, getWidth()), 
         Math.min(getPreferredSize().height, getHeight())); 
      } 
     });*/ 
     add(cc, BorderLayout.CENTER); 

     CustomComponents cc1 = new CustomComponents(); 
     add(cc1, BorderLayout.EAST); 

     pack(); 
     // enforces the minimum size of both frame and component 
     setMinimumSize(getSize()); 
     //setMaximumSize(getMaximumSize()); 
     setVisible(true); 

    } 

    public static void main(String[] args) { 
     CustomComponent main = new CustomComponent(); 
     main.display(); 
    } 
} 

class CustomComponents extends JComponent { 

    private static final long serialVersionUID = 1L; 

    @Override 
    public Dimension getMinimumSize() { 
     return new Dimension(100, 100); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(400, 300); 
    } 

    @Override 
    public Dimension getMaximumSize() { 
     return new Dimension(800, 600); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     int margin = 10; 
     Dimension dim = getSize(); 
     super.paintComponent(g); 
     g.setColor(Color.red); 
     g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2); 
    } 
} 
+0

为paintComponent()和重写getPreferredSize()+1。 – 2012-02-13 10:42:37

+0

@mKorbel:这段代码工作正常,但已经有一个jpanel被添加到jframe,在jpanel上面我想添加CustomComponents。 JPanel面板=新JPanel(); frame.add(面板); panel.add(新的CustomComponents());对于此代码,我无法看到矩形。 – Sathish 2012-02-13 10:54:01

+0

@Sathish请阅读我关于使用LayoutManager的回答这里http://stackoverflow.com/a/9259186/714968,请阅读链接BorderLayout教程 – mKorbel 2012-02-13 10:56:19

2

既然你想改变你的矩形的尺寸在运行时,试试这个代码为:

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

public class RectangleTest extends JFrame { 

    private int x; 
    private int y; 
    private static JButton buttonFullSize; 
    private static JButton buttonHalfSize; 

    public RectangleTest() { 
     x = 0; 
     y = 0; 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     final JPanel basePanel = new JPanel(); 
     basePanel.setLayout(new BorderLayout()); 

     final MyComponent component = new MyComponent(400, 400); 
     component.setOriginAndSize(0, 0, 100, 100); 
     buttonFullSize = new JButton("DRAW FULL SIZE"); 
     buttonFullSize.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       component.setOriginAndSize(x++, y++, 
        (basePanel.getHeight()/4), (basePanel.getWidth()/4));    
      } 
     }); 

     buttonHalfSize = new JButton("DRAW HALF SIZE"); 
     buttonHalfSize.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       component.setOriginAndSize(x++, y++, 
        (basePanel.getHeight()/8), (basePanel.getWidth()/8)); 
      } 
     }); 

     basePanel.add(buttonHalfSize, BorderLayout.PAGE_START); 
     basePanel.add(component, BorderLayout.CENTER); 
     basePanel.add(buttonFullSize, BorderLayout.PAGE_END); 

     setContentPane(basePanel); 
     pack(); 
     setVisible(true);    
    } 

    public static void main(String... args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new RectangleTest();     
      } 
     }); 
    } 
} 

class MyComponent extends JComponent { 

    private int x; 
    private int y; 
    private int width; 
    private int height; 
    private int compWidth; 
    private int compHeight; 

    MyComponent(int w, int h) { 
     this.compWidth = w; 
     this.compHeight = h; 
    } 

    public void setOriginAndSize(int x, int y, int w, int h) { 
     this.x = x; 
     this.y = y; 
     this.width = w; 
     this.height = h; 
     repaint(); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return (new Dimension(compWidth, compHeight)); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(getBackground()); 
     g.fillRect(x, y, width, height); 
     g.setColor(Color.RED); 
     g.drawOval(x, y, width, height); 
     g.setColor(Color.MAGENTA); 
     g.fillOval(x, y, width, height); 
    } 
} 
+0

可以接受+1 – mKorbel 2012-02-13 12:54:31