为什么这个油漆组件不起作用?

时间:2014-03-12 16:50:10

标签: java swing paint paintcomponent mouselistener

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;


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

JButton br = new JButton("Red");
JButton bb = new JButton("Blue");
JButton bg = new JButton("Green");
JButton wipe = new JButton("Wipe");

JLabel brushwidth = new JLabel("Width = ",JLabel.CENTER);

public JSlider s = new JSlider();

JButton image = new JButton("Image");

Point start = null;
Point current = null;
boolean entered = false;
Color c = Color.red;
public double bwidth = 3;

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

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

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

    add(wipe);
    wipe.setSize(70,30);
    wipe.setLocation(10, 410);
    wipe.setBackground(Color.gray);
    wipe.setForeground(Color.orange);
    wipe.setVisible(true);

    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) {
            c = Color.red;
        }
    });
    br.setVisible(true);

    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) {
            c = Color.blue;
        }
    });
    bb.setVisible(true);


    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 e){
            c = Color.green;
        }
    });
    bg.setVisible(true);

    add(image);
    image.setSize(70,30);
    image.setLocation(230, 10);
    image.setBackground(Color.gray);
    image.setForeground(Color.orange);
    wipe.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent e){ 

        }

    });
    image.setVisible(true);
    canvas(this,canvas);

}
public void canvas(JFrame f, JPanel p){
    p.setSize(425,350);
    p.setBorder(BorderFactory.createLineBorder(Color.black, 3));
    p.setLocation(10, 50);
    p.addMouseListener(new MouseListener(){
        @Override
        public void mouseClicked(MouseEvent arg0) {}
        @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) {}
    });
    p.addMouseMotionListener(new MouseAdapter(){
        public void mouseDragged(MouseEvent e){
            mloc = e.getLocationOnScreen();
            if(entered = true){
                paintComponent(getGraphics());
            }
        }
    });


    f.add(p);
}
public void paintComponent(Graphics g){
    g.drawOval(mloc.x, mloc.y, (int)bwidth, (int)bwidth);
}
}

我试图让这个应用程序在JPanel中绘制,但我似乎无法让它工作, 每当我移动鼠标时,我希望它画一条线。它只是公共无效的油漆位,我无法解决似乎没有任何工作。 感谢

2 个答案:

答案 0 :(得分:1)

JFrame没有paintComponent()方法。

通过覆盖JPanel(或JComponent)的paintComponent()方法完成自定义绘制,然后将面板添加到JFrame。

阅读Custom Painting上Swing教程中的部分,了解更多信息和示例。您还需要覆盖getPreferredSize()方法。

另外,不要使用null布局。 Swing旨在与布局管理器一起使用。

答案 1 :(得分:1)

  1. if(entered = true){是分配运算符而非条件运算符。相反,您需要if(entered == true){

  2. paintComponent意味着被覆盖而不是显式调用。当您打算做的是致电paintComponent

  3. 时,请勿明确致电repaint()
  4. JFrame 没有paintComponent方法,因此您实际上并未覆盖任何绘制功能。对于JFrame,您应该覆盖paint,但我建议不要使用JPanelJComponent

  5. paintComponentpaint方法中,您还应分别调用super.paintComponentsuper.paint,以免破坏绘制链。