2014-11-12 8 views
0

색이 확인란에 해당하는 채워진 사각형을 그리려고합니다. 사각형은 임의로 크기를 정하고 JPanel에 놓아야합니다. 지금까지 임의의 크기와 임의의 위치로 JPanel에 그릴 직사각형을 가져 왔지만 체크 보스를 선택하면 직사각형을 그리는 데 문제가 있습니다. 내 ActionListener 코드는 내 프로젝트를 실행할 목적이 없으며 다른 것들을 시도했지만 문제가 있습니다. 대신 새로운 JComponent 각 시간을 만들려고 노력의JCheckBox를 클릭 할 때마다 사각형을 그리는 방법은 무엇입니까?

package colorViewerCheck; 

public class ColorViewerCheckFrame extends JFrame 
{ 
private static final int FRAME_WIDTH = 300; 
private static final int FRAME_HEIGHT = 400; 

private JPanel colorPanel; 
private JCheckBox redCheckBox; 
private JCheckBox greenCheckBox; 
private JCheckBox blueCheckBox; 

public ColorViewerCheckFrame() 
{ 
    createColorPanel(); 
createControlPanel(); 
setSize(FRAME_WIDTH, FRAME_HEIGHT); 
} 

public void createControlPanel() 
{ 
    class ColorListener implements ActionListener 
     { 
      public void actionPerformed(ActionEvent event) 
      { 
       if (redCheckBox.isSelected()) {createColorPanel();} 
       if (greenCheckBox.isSelected()) {createColorPanel();} 
       if (blueCheckBox.isSelected()) {createColorPanel();} 
      } 
     } 

    ActionListener listener = new ColorListener(); 

    redCheckBox = new JCheckBox("Red"); 
    greenCheckBox = new JCheckBox("Green"); 
    blueCheckBox = new JCheckBox("Blue"); 
    redCheckBox.setSelected(true); 

    JPanel controlPanel = new JPanel(); 

    controlPanel.add(redCheckBox); 
    controlPanel.add(greenCheckBox); 
    controlPanel.add(blueCheckBox); 

    redCheckBox.addActionListener(listener); 
    greenCheckBox.addActionListener(listener); 
    blueCheckBox.addActionListener(listener); 

    add(controlPanel, BorderLayout.SOUTH); 


} 

public void createColorPanel() 
{ 
    class RectangleComponent extends JComponent 
    { 
     private int x; 
     private int y; 
     private int width; 
     private int height; 
     private Random rand; 

     public void paintComponent(Graphics g) 
     { 
      Graphics2D g2 = (Graphics2D) g; 

      rand = new Random(); 


      x = rand.nextInt(250); 
      y = rand.nextInt(350); 
      width = rand.nextInt(50); 
      height = rand.nextInt(50); 

      Rectangle rect = new Rectangle(x, y, width, height); 
      g2.setColor(getColor()); 
      g2.fill(rect); 
      g2.draw(rect); 
     } 
    } 

    colorPanel = new JPanel(new GridLayout()); 

    RectangleComponent rect = new RectangleComponent(); 
    colorPanel.add(rect); 
    add(colorPanel, BorderLayout.CENTER); 
    colorPanel.setVisible(true); 
} 

public Color getColor() 
{ 
    Color color = null; 
    if (redCheckBox.isSelected()) {color = Color.RED;} 
    else if (greenCheckBox.isSelected()) {color = Color.GREEN;} 
    else if (blueCheckBox.isSelected()) {color = Color.blue;} 
    return color; 
} 
} 
+0

을은 "사각형"을 생성하고, 예를 들어, 도면 용기에 "추가"할 적어도 사용자를 위해서) '새로운 임의의 사각형 추가'를 위해'JCheckBox' 대신에'JButton'을 사용합니다. 확인란을 두 번 클릭하면 첫 번째 클릭에서 사각형이 표시되고 두 번째 클릭에서 사각형이 사라질 것으로 예상됩니다. –

답변

2

, 단순히

BorderLayout 단지 내에서 하나의 구성 요소를 표시 할 수있는 새로운 "사각형"을 추가하고 자체에 그들을 칠 수있는 간단한 그리기 화면을 만들 당신이 가기 전에 그것의 각 훨씬 더 오 개 가능한 위치 ... 업데이트

...

있어, 당신은있어

기본적으로, 당신은 JPanel 같은 것을에서 연장, 단일 사용자 정의 구성 요소를 만들려면 ... 좀보고해야 할 것, 직사각형을 그릴 책임이있다.

다음으로 위치, 크기 및 색상을 알고있는 "직사각형"의 개념이 필요합니다. 사용자가 색상 항목을 선택하면 다음

는, 당신은 내가 (더 나은 것 같아요 ...

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.geom.Rectangle2D; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 
import javax.swing.ButtonGroup; 
import javax.swing.ButtonModel; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JRadioButton; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       final DrawPane drawPane = new DrawPane(); 
       final ControlPane controlPane = new ControlPane(); 
       controlPane.addActionListener(new ActionListener() { 
        private Random rand = new Random(); 

        @Override 
        public void actionPerformed(ActionEvent e) { 

         int x = rand.nextInt(drawPane.getWidth() - 50); 
         int y = rand.nextInt(drawPane.getHeight() - 50); 
         int width = rand.nextInt(50); 
         int height = rand.nextInt(50); 

         ColorRectangle rectangle = new ColorRectangle(x, y, width, height, controlPane.getSelectedColor()); 
         drawPane.add(rectangle); 

        } 
       }); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(drawPane); 
       frame.add(controlPane, BorderLayout.WEST); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class ColorRectangle extends Rectangle2D.Double { 

     private Color color; 

     public ColorRectangle(double x, double y, double w, double h, Color color) { 
      super(x, y, w, h); 
      this.color = color; 
     } 

     public Color getColor() { 
      return color; 
     } 

    } 

    public class ControlPane extends JPanel { 

     private JRadioButton red; 
     private JRadioButton green; 
     private JRadioButton blue; 

     private ButtonGroup bg; 

     public ControlPane() { 
      setLayout(new GridBagLayout()); 

      bg = new ButtonGroup(); 

      red = createButton("Red"); 
      green = createButton("Green"); 
      blue = createButton("Blue"); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 
      gbc.anchor = GridBagConstraints.WEST; 

      add(red, gbc); 
      add(green, gbc); 
      add(blue, gbc); 
     } 

     public void addActionListener(ActionListener listener) { 
      red.addActionListener(listener); 
      green.addActionListener(listener); 
      blue.addActionListener(listener); 
     } 

     public void removeActionListener(ActionListener listener) { 
      red.removeActionListener(listener); 
      green.removeActionListener(listener); 
      blue.removeActionListener(listener); 
     } 

     protected JRadioButton createButton(String text) { 
      JRadioButton btn = new JRadioButton(text); 
      btn.setActionCommand(text); 
      bg.add(btn); 
      return btn; 
     } 

     protected Color getSelectedColor() { 
      Color color = Color.MAGENTA; 
      ButtonModel model = bg.getSelection(); 
      if (model != null) { 
       switch (model.getActionCommand()) { 
        case "Red": 
         color = Color.RED; 
         break; 
        case "Green": 
         color = Color.GREEN; 
         break; 
        case "Blue": 
         color = Color.BLUE; 
         break; 
       } 
      } 
      return color; 
     } 

    } 

    public class DrawPane extends JPanel { 

     private List<ColorRectangle> rectangles; 

     public DrawPane() { 
      rectangles = new ArrayList<>(25); 
     } 

     public void add(ColorRectangle rect) { 
      rectangles.add(rect); 
      repaint(); 
     } 

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

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      for (ColorRectangle rectangle : rectangles) { 
       g2d.setColor(rectangle.getColor()); 
       g2d.fill(rectangle); 
      } 
      g2d.dispose(); 
     } 

    } 

} 
+0

나는 자바에 대해 상당히 익숙하지 않다. 그리기 표면을 만드는 것에 익숙하지 않다. – webberm63