2012-02-13 76 views
5

Tôi muốn vẽ một hình chữ nhật trên một JPanel. Có thể vẽ bằng mã sau đây.Vẽ hình chữ nhật trên một 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); 
     } 
    } 
} 

Nhưng getContentPane(). Thêm (new MyComponent()); Thay vì tuyên bố này, tôi cần phải thêm một bảng cơ sở vào khung. Trên bảng điều khiển cơ sở, tôi muốn thêm bảng MyComponent.

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

Nếu tôi làm như thế này, hình chữ nhật sẽ không hiển thị. bất kỳ ý tưởng? Và tôi cũng cần phải thay đổi kích thước của hình chữ nhật khi chạy. là nó có thể?

+0

Hãy thụt mã của bạn. – MByD

+0

+1, câu hỏi thú vị mặc dù, Giúp tôi tìm hiểu những điều :-) –

Trả lời

1

Tôi đã cố gắng vẽ một hình vuông và khoanh tròn, tự động thay đổi kích thước trong thời gian chạy .... gắn mã hoàn chỉnh .. nếu nó giúp.

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, mã đẹp :-) –

+0

Tại sao lại thụt lề lớn đối với mã? –

+0

Tôi đã thử định dạng mã, nhưng anh ấy không chấp nhận, GOD BIẾT tại sao, mặc dù nó hoạt động tốt. –

8

1) cho Swing JComponent bạn phải sử dụng paintComponent() thay vì paint() phương pháp

2) JComponent của bạn không lợi nhuận PreferredSize

ví dụ

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

+1 cho paintComponent() và ghi đè getPreferredSize(). –

+0

@mKorbel: Mã này hoạt động tốt, nhưng đã có một jpanel nó đã được thêm vào jframe, ở trên jpanel tôi muốn thêm CustomComponents. Bảng JPanel = new JPanel(); frame.add (bảng điều khiển); panel.add (new CustomComponents()); Đối với mã này, tôi không thể thấy hình chữ nhật. – Sathish

+0

@Sathish vui lòng đọc câu trả lời của tôi về LayoutManager đã sử dụng tại đây http://stackoverflow.com/a/9259186/714968, vui lòng đọc hướng dẫn BorderLayout được liên kết – mKorbel

2

Vì bạn muốn thay đổi kích thước của hình chữ nhật của bạn tại thời gian chạy, hãy thử mã này cho rằng:

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

có thể chấp nhận được +1 – mKorbel

Các vấn đề liên quan