java - Swing 部件加倍

标签 java swing

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

这是我的 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:。另外,我不知道代码的哪一部分弄乱了它,所以我不知道应该删除什么。感谢您的帮助。

最佳答案

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

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

您应该使用:

main.add(panel, BorderLayout.CENTER);

关于java - Swing 部件加倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23225450/

相关文章:

java - 更改调整 JTable 标题光标的大小

java - 在 Java 中使用 jQuery - 未知错误 : $ is not defined

java - 向 JFrame 添加元素与向 Container 添加元素有什么区别?

java - 如何在 JDialog 中添加完整图像该对话框是由 JOptionPane 创建的

java - 如何随机显示画线的距离?

java - GlazedLists 清除在排序的 JTable 上抛出错误

Java Generics - 可比较的接口(interface)

JavaFX 关闭应用程序模式对话框

java - 如何将集合转换为列表?该集合用作 Hashmap 中的键

java - 在不失去焦点的情况下运行 jar