嘿,我在试图让我的工具栏上的按钮更改我绘制的线条的颜色时遇到了很多麻烦。这是我的代码:
public class PaintingGUI {
private static final int FRAME_WIDTH = 960;
private static final int FRAME_HEIGHT = 640;
private final static String NEWLINE = System.lineSeparator();
private JTextArea textArea = new JTextArea();
class MyButtonListener extends JPanel implements MouseListener,
MouseMotionListener, ActionListener {
private int mouseX1 = -1; // the mouse Coordinates when pressed
private int mouseY1 = -1;
private int mouseX2 = -1; // mouse coordinates when released
private int mouseY2 = -1;
Color c;
JButton red, green, blue, yellow, orange, black, pink, purple, dot, line, square, circle, ellipse, text;
public MyButtonListener() {
setOpaque(false);
}
public MyButtonListener(JButton red, JButton green, JButton blue, JButton yellow, JButton orange, JButton black, JButton pink, JButton purple,
JButton dot, JButton line, JButton square, JButton circle, JButton ellipse, JButton text){
// Need to communicate references to the buttons in this class
this.red = red;
this.green = green;
this.blue = blue;
this.yellow = yellow;
this.orange = orange;
this.black = black;
this.pink = pink;
this.purple = purple;
this.dot = dot;
this.line = line;
this.square = square;
this.circle = circle;
this.ellipse = ellipse;
this.text = text;
}
public void actionPerformed(ActionEvent e) {
JButton source = (JButton) e.getSource();
if(source == red) {
c = Color.RED;
System.out.println(c);
repaint();
}
if(source == green) {
c = Color.GREEN;
System.out.println("Colour is green");
repaint();
}
if(source == blue) {
c = Color.BLUE;
System.out.println("Colour is blue");
repaint();
}
if(source == yellow) {
c = Color.YELLOW;
System.out.println("Colour is yellow");
repaint();repaint();
}
if(source == orange) {
c = (new Color(255, 137, 0));
System.out.println("Colour is orange");
}
if(source == black) {
c = Color.BLACK;
System.out.println("Colour is black");
}
if(source == pink) {
c = Color.PINK;
System.out.println("Colour is pink");
}
if(source == purple) {
c = (new Color(153, 51, 255));
System.out.println("Colour is purple");
}
if(source == dot) {
}
if(source == line) {
}
if(source == square) {
}
if(source == circle) {
}
if(source == ellipse) {
}
if(source == text) {
}
}
@Override
public void mouseClicked(MouseEvent event)
{
int x = event.getX();
int y = event.getY();
}
@Override
public void mousePressed(MouseEvent event)
{
mouseX1 = event.getX();
mouseY1 = event.getY();
}
@Override
public void mouseReleased(MouseEvent event)
{
mouseX2 = event.getX();
mouseY2 = event.getY();
// trigger a call to paintComponent
repaint();
}
@Override
public void mouseDragged(MouseEvent event)
{
int x = event.getX();
int y = event.getY();
}
@Override
public void mouseEntered(MouseEvent event)
{
System.out.println("Enter");
}
@Override
public void mouseExited(MouseEvent event)
{
System.out.println("Exit");
}
@Override
public void mouseMoved(MouseEvent event)
{
int x = event.getX();
int y = event.getY();
}
@Override
public void paintComponent(Graphics g)
{
if (mouseX1 < 0 || mouseY1 < 0)
return;
Graphics2D g2 = (Graphics2D) g;
System.out.println("Drawing a line");
g2.setColor(c);
g2.drawLine(mouseX1, mouseY1, mouseX2, mouseY2);
}
}
public PaintingGUI createToolBar() {
JFrame frame = new JFrame("Drawing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DrawingMenu meMenu = new DrawingMenu();
frame.setJMenuBar(meMenu.createMenuBar());
MyButtonListener panel = new MyButtonListener();
panel.addMouseListener(panel);
panel.addMouseMotionListener(panel);
frame.setContentPane(panel);
panel.setLayout(new BorderLayout());
JToolBar toolBar = new JToolBar("Drag me!");
panel.add(toolBar, BorderLayout.PAGE_END);
// Make some buttons. Here we will paste an image icon on each
JButton red = new JButton("red");
red.setBackground(Color.RED);
red.setContentAreaFilled(false);
red.setOpaque(true);
JButton green = new JButton("gre");
green.setBackground(Color.GREEN);
green.setContentAreaFilled(false);
green.setOpaque(true);
JButton blue = new JButton("blu");
blue.setBackground(Color.BLUE);
blue.setContentAreaFilled(false);
blue.setOpaque(true);
JButton yellow = new JButton("yel");
yellow.setBackground(Color.YELLOW);
yellow.setContentAreaFilled(false);
yellow.setOpaque(true);
JButton orange = new JButton("ora");
orange.setBackground(new Color(255, 137, 0));
orange.setContentAreaFilled(false);
orange.setOpaque(true);
JButton black = new JButton("bla");
black.setBackground(Color.BLACK);
black.setContentAreaFilled(false);
black.setOpaque(true);
JButton pink = new JButton("pin");
pink.setBackground(Color.PINK);
pink.setContentAreaFilled(false);
pink.setOpaque(true);
JButton purple = new JButton("pur");
purple.setBackground(new Color(153, 51, 255));
purple.setContentAreaFilled(false);
purple.setOpaque(true);
ImageIcon temp = new ImageIcon("C:\\Java Programs\\drawing\\dot.JPG");
Image img = temp.getImage();
Image newimg = img.getScaledInstance(17,16, java.awt.Image.SCALE_SMOOTH);
ImageIcon dotpic = new ImageIcon(newimg);
JButton dot = new JButton(dotpic);
temp = new ImageIcon("C:\\Java Programs\\drawing\\line.JPG");
img = temp.getImage();
newimg = img.getScaledInstance(17,16, java.awt.Image.SCALE_SMOOTH);
ImageIcon linepic = new ImageIcon(newimg);
JButton line = new JButton(linepic);
temp = new ImageIcon("C:\\Java Programs\\drawing\\square.JPG");
img = temp.getImage();
newimg = img.getScaledInstance(17,16, java.awt.Image.SCALE_SMOOTH);
ImageIcon squarepic = new ImageIcon(newimg);
JButton square = new JButton(squarepic);
temp = new ImageIcon("C:\\Java Programs\\drawing\\circle.PNG");
img = temp.getImage();
newimg = img.getScaledInstance(17,16, java.awt.Image.SCALE_SMOOTH);
ImageIcon circlepic = new ImageIcon(newimg);
JButton circle = new JButton(circlepic);
temp = new ImageIcon("C:\\Java Programs\\drawing\\ellipse.JPG");
img = temp.getImage();
newimg = img.getScaledInstance(17,16, java.awt.Image.SCALE_SMOOTH);
ImageIcon ellipsepic = new ImageIcon(newimg);
JButton ellipse = new JButton(ellipsepic);
temp = new ImageIcon("C:\\Java Programs\\drawing\\text.PNG");
img = temp.getImage();
newimg = img.getScaledInstance(17,16, java.awt.Image.SCALE_SMOOTH);
ImageIcon textpic = new ImageIcon(newimg);
JButton text = new JButton(textpic);
// Add buttons to toolbar
toolBar.add(red);
toolBar.add(green);
toolBar.add(blue);
toolBar.add(yellow);
toolBar.add(orange);
toolBar.add(black);
toolBar.add(pink);
toolBar.add(purple);
toolBar.add(dot);
toolBar.add(line);
toolBar.add(square);
toolBar.add(circle);
toolBar.add(ellipse);
toolBar.add(text);
// Set a tooltip text for each button
red.setToolTipText("Colour is red");
green.setToolTipText("Colour is green");
blue.setToolTipText("Colour is blue");
yellow.setToolTipText("Colour is yellow");
orange.setToolTipText("Colour is orange");
black.setToolTipText("Colour is black");
pink.setToolTipText("Colour is pink");
purple.setToolTipText("Colour is purple");
dot.setToolTipText("Freehand line");
line.setToolTipText("Draw a straight line");
square.setToolTipText("Draw a Square");
circle.setToolTipText("draw a circle");
ellipse.setToolTipText("Draw an ellipse");
text.setToolTipText("Write something");
// Create an instance of the demo class
PaintingGUI demo = new PaintingGUI();
// Now we need to create an instance of our Button Listener class
MyButtonListener listener =
demo.new MyButtonListener(red, green, blue, yellow, orange, black, pink, purple, dot, line, square, circle, ellipse, text);
// Register action listener defined in the listener class
red.addActionListener(listener);
green.addActionListener(listener);
blue.addActionListener(listener);
yellow.addActionListener(listener);
orange.addActionListener(listener);
black.addActionListener(listener);
pink.addActionListener(listener);
purple.addActionListener(listener);
dot.addActionListener(listener);
line.addActionListener(listener);
square.addActionListener(listener);
circle.addActionListener(listener);
ellipse.addActionListener(listener);
text.addActionListener(listener);
frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
frame.setVisible(true);
return demo;
}
}
我尝试了很多不同的方法,并在各处搜索解决方案,我对java很新,所以任何帮助都会受到赞赏。
答案 0 :(得分:5)
您已创建两个不同的MyButtonListener实例。一个用作JPanel和鼠标监听器,另一个用作添加到按钮的动作监听器。
当按下按钮时,第二个实例会对其进行处理并正确设置其颜色,但是执行绘制的MyButtonListener的第一个实例仍然具有Color of null。
尝试使用MyButtonListener的相同实例。您将需要使用第二个构造函数,但稍微更改它,以便它使setOpaque(true)调用像no arg构造函数。