摆动组件加倍

时间:2014-04-22 16:41:36

标签: java swing

所以我试图创建一个简单的绘图程序,我遇到了问题。程序有一个窗口,窗口左边是一个带笔大小控件的栏,窗口的其余部分是绘图窗格。但是,每当我在窗格上绘图时,侧边栏基本上都会复制到窗格上,但可以将其绘制出来。

这是我的CHPaint课程(主要):

package paint;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class CHPaint{
JFrame frame;
JLabel penSizeLabel;
PaintPanel panel;
JButton upButton;
JButton downButton;
JPanel left;
JPanel main;


int penSize = 1;

public static void main(String[] args){
    CHPaint gui = new CHPaint();
    System.out.println("gui built");
    gui.go();
}

public void go() {
    frame = new JFrame("Caleb's Paint");
    panel = new PaintPanel();
    upButton = new JButton("Up");
    downButton = new JButton("Down");
    penSizeLabel = new JLabel("Size: " + penSize);
    left = new JPanel();
    main = new JPanel();


    panel.addMouseListener(new Painting());
    panel.addMouseMotionListener(new Painting());
    upButton.addActionListener(new UpButton());
    downButton.addActionListener(new DownButton());

    left.setLayout(new BoxLayout(left, BoxLayout.Y_AXIS));
    main.setLayout(new BorderLayout());

    left.add(upButton);
    left.add(penSizeLabel);
    left.add(downButton);

    left.setBackground(Color.gray);
    penSizeLabel.setBackground(Color.gray);

    frame.getContentPane().add(BorderLayout.CENTER, main);
    main.add(BorderLayout.WEST, left);
    main.add(BorderLayout.CENTER, panel);
    frame.setSize(600, 600);
    frame.setVisible(true);

}


class UpButton implements ActionListener{
    public void actionPerformed(ActionEvent e){
        panel.changePenSize(1);
        penSize++;
        penSizeLabel.setText("Size: " + penSize);
    }
}
class DownButton implements ActionListener{
    public void actionPerformed(ActionEvent e){
        panel.changePenSize(-1);
        if (penSize > 1){
            penSize--;
        }
        penSizeLabel.setText("Size: " + penSize);
    }
 }
class Painting implements MouseListener, MouseMotionListener{
    public void mousePressed(MouseEvent e) {
        panel.draw(e.getX(), e.getY());

    }
    public void mouseDragged(MouseEvent e) {
        panel.draw(e.getX(), e.getY());
    }               
    public void mouseReleased(MouseEvent e) {
        panel.mouseUp();
    }

    public void mouseEntered(MouseEvent e) {}    
    public void mouseExited(MouseEvent e) {}    
    public void mouseClicked(MouseEvent e) {}      
    public void mouseMoved(MouseEvent e) {} 
}

}

以下是绘图面板的类:

package paint;
import java.awt.*;
import javax.swing.*;

public class PaintPanel extends JPanel {
    int drawX = -10;
    int drawY = -10;
    int oldX = -10;
    int oldY = -10;
    int penSize = 1;


    public void draw(int x, int y){
            oldX = drawX;
            oldY = drawY;
            drawX = x;
            drawY = y;
            this.repaint();
    }
    public void mouseUp(){
            oldX = -10;
            oldY = -10;
            drawX= -10;
            drawY= -10;
    }
    public void changePenSize(int p){
            if (penSize > 0){
                    penSize = penSize+p;
            }
    }
    public void paintComponent(Graphics g){
            Graphics2D g2 = (Graphics2D) g;
            if (oldX != -10 && (oldY) != -10){                      // If you didn't just start or lift the pen
                    g2.setStroke(new BasicStroke(penSize, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
                    g.setColor(Color.red);
                    g.drawLine(oldX, oldY, drawX, drawY);
            } else {
                    g.setColor(Color.red);
                    g.fillOval(drawX-(penSize/2), drawY-(penSize/2), penSize, penSize);
            }
    }
}

编辑: 对不起,我不知道这里发布的规则,请原谅我D:。另外,我还不知道代码的哪一部分搞砸了,所以我不知道应该删除什么。谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

这不会解决您的问题,但不再使用以下内容:

main.add(BorderLayout.CENTER, panel); // read the API for more info

您应该使用:

main.add(panel, BorderLayout.CENTER);

答案 1 :(得分:1)

您需要在super.paintComponent()方法中致电paintComponent()。除此之外,这将为您清除JPanel。