如何在JPanel中绘制图像?

时间:2014-03-14 10:07:03

标签: java image swing background-image

我尝试了这种方法和其他一些方法,但似乎没有工作它说"错误:无法找到或加载主类Main"出于某种奇怪的原因。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;


public class Main {
public static void main(String[]args){
    Gui g = new Gui();
    g.setVisible(true);
}
}
@SuppressWarnings("serial")
class Gui extends JFrame{
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
double width = screen.getWidth();
double height = screen.getHeight();

JFrame frame = this;



Color c = Color.red;
boolean clear = false;

Gui(){
    super("PaintPot");
    setSize((int)width/4,(int)height/2);
    setVisible(true);
    setResizable(false);
    setLayout(null);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    canvas c = new canvas(this,clear);
    c.setVisible(true);

}



}
@SuppressWarnings("serial")
class canvas extends JPanel{
Image back = Toolkit.getDefaultToolkit().createImage("cat.png");

int bwidth = 1;
JButton image = new JButton("Image");
JButton br = new JButton("Red");
JButton bb = new JButton("Blue");
JButton bg = new JButton("Green");
public JSlider s = new JSlider();
JLabel brushwidth = new JLabel("Width = ",JLabel.CENTER);
Color colour = Color.red;

boolean entered = false;
Point p = null;
boolean clear = false;
JButton wipe = new JButton("Wipe");
canvas(JFrame f,boolean g){
    bwidth = s.getValue();
    setSize(425,350);
    setLocation(10,50);
    setVisible(true);
    setBorder(BorderFactory.createLineBorder(Color.black,4));


    f.add(bb);
    bb.setSize(60,30);
    bb.setLocation(80, 10);
    bb.setBackground(Color.blue);
    bb.setForeground(Color.white);
    bb.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent e) {
            colour = Color.blue;
        }
    });
    bb.setVisible(true);

    f.add(image);
    image.setSize(70,30);
    image.setLocation(230, 10);
    image.setBackground(Color.gray);
    image.setForeground(Color.orange);  
    image.setVisible(true);

    f.add(brushwidth);
    brushwidth.setSize(70,30);
    brushwidth.setLocation(90,410);
    brushwidth.setBackground(Color.gray);
    brushwidth.setForeground(Color.orange);
    brushwidth.setOpaque(true);
    brushwidth.setVisible(true);

    f.add(s);
    s.setSize(getWidth()-20, 20);
    s.setLocation(10, 450);
    s.setBackground(Color.gray);
    s.setForeground(Color.orange);
    s.setMajorTickSpacing(50);
    s.setMinorTickSpacing(1);
    s.setValue((int)bwidth);
    s.addChangeListener(new ChangeListener(){
        @Override
        public void stateChanged(ChangeEvent e) {
            bwidth = s.getValue();
            brushwidth.setText("Width = "+s.getValue());
        }
    });
    brushwidth.setText("Width = "+s.getValue());

    f.add(wipe);
    wipe.setSize(70,30);
    wipe.setLocation(10, 410);
    wipe.setBackground(Color.gray);
    wipe.setForeground(Color.orange);
    wipe.setVisible(true);
    wipe.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent e){
            repaint();
        }});

    f.add(br);
    br.setSize(60,30);
    br.setLocation(10, 10);
    br.setBackground(Color.red);
    br.setForeground(Color.white);
    br.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent arg0) {
            colour = Color.red;
        }
    });
    br.setVisible(true);

    f.add(bg);
    bg.setSize(70,30);
    bg.setLocation(150, 10);
    bg.setBackground(Color.green);
    bg.setForeground(Color.white);
    bg.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent arg0) {
            colour = Color.green;
        }
    });
    br.setVisible(true);

    addMouseListener(new MouseListener(){
        @Override
        public void mouseClicked(MouseEvent arg0) {
            if(entered == true){
                p = arg0.getPoint();
                circ(getGraphics(),p,bwidth,colour);
            }
        }
        @Override
        public void mouseEntered(MouseEvent arg0) {entered = true;}
        @Override
        public void mouseExited(MouseEvent arg0) {entered = false;}
        @Override
        public void mousePressed(MouseEvent arg0) {}
        @Override
        public void mouseReleased(MouseEvent arg0) {}
    });
    addMouseMotionListener(new MouseAdapter(){
        public void mouseDragged(MouseEvent e){
            if(entered == true){
                p = e.getPoint();
                paint(getGraphics(),p,bwidth,colour);
            }
        }
    });
    f.add(this);
    repaint();
    back(getGraphics(),this,back);
}
public void paint(Graphics g,Point p,int w,Color colour){
    g.setColor(colour);
    g.drawOval(p.x-(w/2), p.y-(w/2), w, w);
    g.fillOval(p.x-(w/2), p.y-(w/2), w, w);
}
public void circ(Graphics g,Point p,int w,Color colour){
    g.setColor(colour);
    g.drawOval(p.x-(w/2), p.y-(w/2), w, w);
    g.fillOval(p.x-(w/2), p.y-(w/2), w, w);
}
public void back(Graphics g,JPanel p,Image i){
    super.paint(g);
    g.drawImage(i, 0, 0, p);
}
}

我想这样,当我点击图像按钮时,图像会在循环中发生变化

由于

2 个答案:

答案 0 :(得分:0)

我运行了你的代码,我可以看到如下输出。没有得到任何错误。

尝试在eclipse中重新加载工作区或新工作区。

enter image description here

答案 1 :(得分:0)

此示例程序允许您使用鼠标绘制线条。您可以通过按住鼠标左键来绘制线条。

此示例说明了使用JPanel作为绘图板的正确方法,以及创建JFrame的正确方法。

通常,所有这些类都在不同的.java文件中。我把它们放在一起,这样就可以更容易地将代码粘贴到这个答案中。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.event.MouseInputAdapter;

public class DrawingTest implements Runnable {

    private JFrame frame;

    private MyDrawPanel drawPanel;

    private List<Point> points;

    public DrawingTest() {
        points = new ArrayList<Point>();
    }

    @Override
    public void run() {
        frame = new JFrame("Bouncing Vertices");

        drawPanel = new MyDrawPanel(this);
        MyListener alpha = new MyListener(this);
        drawPanel.addMouseMotionListener(alpha);
        drawPanel.addMouseListener(alpha);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(drawPanel);
        frame.setSize(800, 600);
        frame.setVisible(true);
    }

    public JPanel getDrawingPanel() {
        return drawPanel;
    }

    public List<Point> getPoints() {
        return points;
    }

    public void setPoint(int x, int y) {
        points.add(new Point(x, y));
    }

    public void resetPoints() {
        points.clear();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new DrawingTest());
    }

    private class MyListener extends MouseInputAdapter {

        private DrawingTest drawingTest;

        public MyListener(DrawingTest drawingTest) {
            this.drawingTest = drawingTest;
        }

        @Override
        public void mouseDragged(MouseEvent event) {
            drawingTest.setPoint(event.getX(), event.getY());
            drawingTest.getDrawingPanel().repaint();
        }

        @Override
        public void mouseReleased(MouseEvent event) {
            drawingTest.resetPoints();
        }

    }

    private class MyDrawPanel extends JPanel {

        private static final long serialVersionUID = 1L;
        private DrawingTest drawingTest;

        public MyDrawPanel(DrawingTest drawingTest) {
            this.drawingTest = drawingTest;
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.BLUE);
            for (int i = 1; i < drawingTest.getPoints().size(); i++) {
                Point p1 = drawingTest.getPoints().get(i - 1);
                Point p2 = drawingTest.getPoints().get(i);
                g.drawLine(p1.x, p1.y, p2.x, p2.y);
            }
        }
    }

}