簡體   English   中英

每次單擊JCheckBox時如何繪制矩形?

[英]How do I draw a rectangle every time I click on a JCheckBox?

我正在嘗試繪制一個顏色對應於復選框的填充矩形。 該矩形將隨機調整大小並放置在JPanel 到目前為止,我已經獲得了一個以隨機大小和隨機位置繪制到JPanel的矩形,但是當選擇一個checkbos時,我在繪制矩形時遇到了麻煩。 我的ActionListener的代碼對我的項目的運行沒有任何作用,我嘗試了其他方法,但是遇到了麻煩。

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

無需嘗試每次都創建一個新的JComponent ,只需創建一個簡單的繪圖表面即可添加新的“矩形”並將其繪制到自身上

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

    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM