[英]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.