在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); 

如果我喜欢这样,矩形就不会显示出来。 任何想法? 而且我还需要在运行时更改矩形的大小。 可能吗?

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

 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); } } 

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); } } 

由于您希望在运行时更改Rectangle的Dimensions,请尝试以下代码:

 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); } }