单击 java 中的菜单项时如何更改形状和颜色
how to change shape and colors when clicking menuitems in java
我无法更改特定形状的颜色。但是当用户点击一个菜单项时,它会成功地变成另一种形状。现在的问题是我想不出可以解决这个问题的解决方案。谁可以帮我这个事?非常感谢您的帮助。谢谢。
@Override
public void paintComponent(Graphics shapes)
{
super.paintComponent(shapes);
switch(colorNo)
{
case 0 : color = Color.RED;break;
case 1 : color = Color.BLUE;break;
case 2 : color = Color.MAGENTA;break;
}
switch(numbers)
{
case 0 : circle(shapes);break;
case 1 : rectangle(shapes);break;
case 2 : square(shapes);break;
case 3 : triangle(shapes);break;
}
}
public void circle(Graphics shapes)
{
shapes.setColor(color);
shapes.fillOval(250,100, 100, 100);
}
@Override
public void actionPerformed(ActionEvent click) {
if(click.getSource() == circle){
numbers = 0;
repaint();
}else if(click.getSource() == square){
numbers = 1; repaint();
}else if(click.getSource() == rectangle){
numbers = 2; repaint();
}else if(click.getSource() == triangle){
numbers = 3; repaint();
}
if(click.getSource() == red){
colorNo = 0; repaint();
}
}
简单——在你的 paintComponent 方法中,after 你的 super 的 paintComponent 调用,before 你设置形状的 switch 语句,以与设置形状相同的方式设置 Graphics 对象的颜色。您当然必须为每个颜色菜单项添加一个侦听器才能使其工作。
如果您使用 AbstractActions 而不是让所有内容共享同一个 ActionListener, 会更容易和更清晰。例如,这段代码并不完全符合您的要求,但它可以给您一些想法。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import javax.swing.*;
public class MyShapes extends JPanel {
private static final int PREF_W = 400;
private static final int PREF_H = PREF_W;
private JMenuBar menuBar = new JMenuBar();
private Color color = Color.WHITE;
public MyShapes() {
JMenu colorMenu = new JMenu("Color");
colorMenu.add(new JMenuItem(new ColorAction("Black", Color.BLACK)));
colorMenu.add(new JMenuItem(new ColorAction("White", Color.WHITE)));
colorMenu.add(new JMenuItem(new ColorAction("Red", Color.RED)));
colorMenu.add(new JMenuItem(new ColorAction("Blue", Color.BLUE)));
colorMenu.add(new JMenuItem(new ColorAction("Green", Color.GREEN)));
menuBar.add(colorMenu);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(color);
g.fillRect(0, 0, getWidth(), getHeight());
}
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}
public JMenuBar getMenuBar() {
return menuBar;
}
private class ColorAction extends AbstractAction {
private Color actionColor;
public ColorAction(String name, Color color) {
super(name);
this.actionColor = color;
}
@Override
public void actionPerformed(ActionEvent e) {
color = actionColor;
repaint();
}
}
private static void createAndShowGui() {
MyShapes mainPanel = new MyShapes();
JFrame frame = new JFrame("MyShapes");
frame.setJMenuBar(mainPanel.getMenuBar());
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
请注意,您可以用相同的方式绘制形状——通过填充菜单项操作的 actionPerformed 方法中的变量。只有这一次是 DrawShape 接口类型的变量,并将其用于其 方法 ,这里是 public void draw(Graphics g)
。这种程序设计模式称为Command Pattern。例如:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class MyShapes extends JPanel {
private static final int PREF_W = 400;
private static final int PREF_H = PREF_W;
private JMenuBar menuBar = new JMenuBar();
private Color color = null;
public DrawShape drawShape = null;
public MyShapes() {
// create and fill colorMenu
JMenu colorMenu = new JMenu("Color");
colorMenu.add(new JMenuItem(new ColorAction("Black", Color.BLACK)));
colorMenu.add(new JMenuItem(new ColorAction("White", Color.WHITE)));
colorMenu.add(new JMenuItem(new ColorAction("Red", Color.RED)));
colorMenu.add(new JMenuItem(new ColorAction("Blue", Color.BLUE)));
colorMenu.add(new JMenuItem(new ColorAction("Green", Color.GREEN)));
// create and fill shapeMenu
JMenu shapeMenu = new JMenu("Shape");
shapeMenu.add(new JMenuItem(new DrawShapeAction("Square", new DrawShape() {
@Override
public void draw(Graphics g) {
int x = getWidth() / 4;
int y = getHeight() / 4;
int width = getWidth() / 2;
int height = getHeight() / 2;
g.fillRect(x, y, width, height);
}
})));
shapeMenu.add(new JMenuItem(new DrawShapeAction("Circle", new DrawShape() {
@Override
public void draw(Graphics g) {
int x = getWidth() / 4;
int y = getHeight() / 4;
int width = getWidth() / 2;
int height = getHeight() / 2;
g.fillOval(x, y, width, height);
}
})));
shapeMenu.add(new JMenuItem(new DrawShapeAction("Triangle", new DrawShape() {
@Override
public void draw(Graphics g) {
int[] x = new int[3];
int[] y = new int[3];
x[0] = getWidth() / 4;
x[1] = getWidth() / 2;
x[2] = 3 * getWidth() / 4;
y[0] = 3 * getHeight() / 4;
y[1] = getHeight() / 4;
y[2] = y[0];
Polygon polygon = new Polygon(x, y, 3);
g.fillPolygon(polygon);
}
})));
// add both JMenus to the JMenuBar
menuBar.add(colorMenu);
menuBar.add(shapeMenu);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// if either color or drawShape are not set, exit this method and draw nothing
if (color == null || drawShape == null) {
return;
}
// to smooth out the edges
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// set color and call drawShape's draw method
g.setColor(color);
drawShape.draw(g);
}
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}
public JMenuBar getMenuBar() {
return menuBar;
}
private class ColorAction extends AbstractAction {
private Color actionColor;
public ColorAction(String name, Color color) {
super(name);
this.actionColor = color;
}
@Override
public void actionPerformed(ActionEvent e) {
MyShapes.this.color = actionColor;
repaint();
}
}
private class DrawShapeAction extends AbstractAction {
private DrawShape actionDrawShape;
public DrawShapeAction(String name, DrawShape drawShape) {
super(name);
this.actionDrawShape = drawShape;
}
@Override
public void actionPerformed(ActionEvent e) {
MyShapes.this.drawShape = actionDrawShape;
repaint();
}
}
private interface DrawShape {
void draw(Graphics g);
}
private static void createAndShowGui() {
MyShapes mainPanel = new MyShapes();
JFrame frame = new JFrame("MyShapes");
frame.setJMenuBar(mainPanel.getMenuBar());
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
我无法更改特定形状的颜色。但是当用户点击一个菜单项时,它会成功地变成另一种形状。现在的问题是我想不出可以解决这个问题的解决方案。谁可以帮我这个事?非常感谢您的帮助。谢谢。
@Override
public void paintComponent(Graphics shapes)
{
super.paintComponent(shapes);
switch(colorNo)
{
case 0 : color = Color.RED;break;
case 1 : color = Color.BLUE;break;
case 2 : color = Color.MAGENTA;break;
}
switch(numbers)
{
case 0 : circle(shapes);break;
case 1 : rectangle(shapes);break;
case 2 : square(shapes);break;
case 3 : triangle(shapes);break;
}
}
public void circle(Graphics shapes)
{
shapes.setColor(color);
shapes.fillOval(250,100, 100, 100);
}
@Override
public void actionPerformed(ActionEvent click) {
if(click.getSource() == circle){
numbers = 0;
repaint();
}else if(click.getSource() == square){
numbers = 1; repaint();
}else if(click.getSource() == rectangle){
numbers = 2; repaint();
}else if(click.getSource() == triangle){
numbers = 3; repaint();
}
if(click.getSource() == red){
colorNo = 0; repaint();
}
}
简单——在你的 paintComponent 方法中,after 你的 super 的 paintComponent 调用,before 你设置形状的 switch 语句,以与设置形状相同的方式设置 Graphics 对象的颜色。您当然必须为每个颜色菜单项添加一个侦听器才能使其工作。
如果您使用 AbstractActions 而不是让所有内容共享同一个 ActionListener, 会更容易和更清晰。例如,这段代码并不完全符合您的要求,但它可以给您一些想法。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import javax.swing.*;
public class MyShapes extends JPanel {
private static final int PREF_W = 400;
private static final int PREF_H = PREF_W;
private JMenuBar menuBar = new JMenuBar();
private Color color = Color.WHITE;
public MyShapes() {
JMenu colorMenu = new JMenu("Color");
colorMenu.add(new JMenuItem(new ColorAction("Black", Color.BLACK)));
colorMenu.add(new JMenuItem(new ColorAction("White", Color.WHITE)));
colorMenu.add(new JMenuItem(new ColorAction("Red", Color.RED)));
colorMenu.add(new JMenuItem(new ColorAction("Blue", Color.BLUE)));
colorMenu.add(new JMenuItem(new ColorAction("Green", Color.GREEN)));
menuBar.add(colorMenu);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(color);
g.fillRect(0, 0, getWidth(), getHeight());
}
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}
public JMenuBar getMenuBar() {
return menuBar;
}
private class ColorAction extends AbstractAction {
private Color actionColor;
public ColorAction(String name, Color color) {
super(name);
this.actionColor = color;
}
@Override
public void actionPerformed(ActionEvent e) {
color = actionColor;
repaint();
}
}
private static void createAndShowGui() {
MyShapes mainPanel = new MyShapes();
JFrame frame = new JFrame("MyShapes");
frame.setJMenuBar(mainPanel.getMenuBar());
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
请注意,您可以用相同的方式绘制形状——通过填充菜单项操作的 actionPerformed 方法中的变量。只有这一次是 DrawShape 接口类型的变量,并将其用于其 方法 ,这里是 public void draw(Graphics g)
。这种程序设计模式称为Command Pattern。例如:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class MyShapes extends JPanel {
private static final int PREF_W = 400;
private static final int PREF_H = PREF_W;
private JMenuBar menuBar = new JMenuBar();
private Color color = null;
public DrawShape drawShape = null;
public MyShapes() {
// create and fill colorMenu
JMenu colorMenu = new JMenu("Color");
colorMenu.add(new JMenuItem(new ColorAction("Black", Color.BLACK)));
colorMenu.add(new JMenuItem(new ColorAction("White", Color.WHITE)));
colorMenu.add(new JMenuItem(new ColorAction("Red", Color.RED)));
colorMenu.add(new JMenuItem(new ColorAction("Blue", Color.BLUE)));
colorMenu.add(new JMenuItem(new ColorAction("Green", Color.GREEN)));
// create and fill shapeMenu
JMenu shapeMenu = new JMenu("Shape");
shapeMenu.add(new JMenuItem(new DrawShapeAction("Square", new DrawShape() {
@Override
public void draw(Graphics g) {
int x = getWidth() / 4;
int y = getHeight() / 4;
int width = getWidth() / 2;
int height = getHeight() / 2;
g.fillRect(x, y, width, height);
}
})));
shapeMenu.add(new JMenuItem(new DrawShapeAction("Circle", new DrawShape() {
@Override
public void draw(Graphics g) {
int x = getWidth() / 4;
int y = getHeight() / 4;
int width = getWidth() / 2;
int height = getHeight() / 2;
g.fillOval(x, y, width, height);
}
})));
shapeMenu.add(new JMenuItem(new DrawShapeAction("Triangle", new DrawShape() {
@Override
public void draw(Graphics g) {
int[] x = new int[3];
int[] y = new int[3];
x[0] = getWidth() / 4;
x[1] = getWidth() / 2;
x[2] = 3 * getWidth() / 4;
y[0] = 3 * getHeight() / 4;
y[1] = getHeight() / 4;
y[2] = y[0];
Polygon polygon = new Polygon(x, y, 3);
g.fillPolygon(polygon);
}
})));
// add both JMenus to the JMenuBar
menuBar.add(colorMenu);
menuBar.add(shapeMenu);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// if either color or drawShape are not set, exit this method and draw nothing
if (color == null || drawShape == null) {
return;
}
// to smooth out the edges
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// set color and call drawShape's draw method
g.setColor(color);
drawShape.draw(g);
}
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}
public JMenuBar getMenuBar() {
return menuBar;
}
private class ColorAction extends AbstractAction {
private Color actionColor;
public ColorAction(String name, Color color) {
super(name);
this.actionColor = color;
}
@Override
public void actionPerformed(ActionEvent e) {
MyShapes.this.color = actionColor;
repaint();
}
}
private class DrawShapeAction extends AbstractAction {
private DrawShape actionDrawShape;
public DrawShapeAction(String name, DrawShape drawShape) {
super(name);
this.actionDrawShape = drawShape;
}
@Override
public void actionPerformed(ActionEvent e) {
MyShapes.this.drawShape = actionDrawShape;
repaint();
}
}
private interface DrawShape {
void draw(Graphics g);
}
private static void createAndShowGui() {
MyShapes mainPanel = new MyShapes();
JFrame frame = new JFrame("MyShapes");
frame.setJMenuBar(mainPanel.getMenuBar());
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}