Создать фрейм с областью для рисования «пером» - Java

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Задача эта конечно не новая, но всё-таки попрошу помочь разобраться. Вопрос полностью звучит так: "Создать фрейм с областью для рисования «пером». Создать меню для выбора цвета и толщины линии". Я в качестве основы воспользовался материалом из двух статей: 1) http://eax.me/java-swing/ - здесь я взял основу формы для рисования. 2) - здесь основы реализации алгоритма. Получился следующий код:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.text.NumberFormat;
 
public class MySimplePaint extends JFrame {
 
    private int previousX, previousY;
    private  Object brushFormWidth = (int)6;
    private Color brushColor = Color.BLACK;
    private JPanel topPanel = new JPanel();
 
    public MySimplePaint (){
 
        addMouseListener(new MouseCoordinateReader());
        addMouseMotionListener(new PaintClass());
    }
 
    Image img = new ImageIcon("1.png").getImage();
 
    public void createGUI() {
 
        Toolkit kit = Toolkit.getDefaultToolkit();
        Dimension screenSize = kit.getScreenSize();
        int screenW = screenSize.width;
        int screenH = screenSize.height;
 
        topPanel.setLayout(new BorderLayout());
        topPanel.setBackground(Color.WHITE);
 
        JButton selectColor = new JButton("Select Brush Color");
        JButton selectBrushWidth = new JButton("Select Brush Width");
 
        NumberFormat integerNumber;
        integerNumber = NumberFormat.getIntegerInstance();
        integerNumber.setMaximumIntegerDigits(2);
        integerNumber.setMinimumIntegerDigits(1);
 
        JFormattedTextField setBrushWidthValueFild = new JFormattedTextField(integerNumber);
 
        selectColor.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
 
                brushColor = JColorChooser.showDialog(((Component) e.getSource()).getParent(), "The color selection panel", brushColor);
            }
        });
 
        selectBrushWidth.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
 
                brushFormWidth = setBrushWidthValueFild.getValue();
 
            }
        });
 
        JPanel txtPannel = new JPanel();
        txtPannel.setLayout(new BorderLayout());
        txtPannel.add(Box.createHorizontalStrut(5));
        txtPannel.add(setBrushWidthValueFild);
 
        JPanel btnPannel = new JPanel();
        btnPannel.setLayout(new BoxLayout(btnPannel, BoxLayout.LINE_AXIS));
        btnPannel.add(selectColor);
        btnPannel.add(Box.createHorizontalStrut(5));
        btnPannel.add(selectBrushWidth);
 
        JPanel bottomPanel = new JPanel();
        bottomPanel.add(btnPannel);
 
        JPanel paintPanel = new JPanel();
        paintPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
        paintPanel.setLayout(new BorderLayout());
        paintPanel.add(topPanel, BorderLayout.CENTER);
        paintPanel.add(txtPannel, BorderLayout.NORTH);
        paintPanel.add(bottomPanel, BorderLayout.SOUTH);
 
        JFrame mainFrame = new JFrame("My Simple Paint");
        mainFrame.setMinimumSize(new Dimension(screenW / 2, screenH / 2));
        mainFrame.setLocationByPlatform(true);
        mainFrame.setIconImage(img);
        mainFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        mainFrame.add(paintPanel);
        mainFrame.pack();
        mainFrame.setVisible(true);
 
        addMouseListener(new MouseCoordinateReader());
        addMouseMotionListener(new PaintClass());
 
    }
 
    private int getBrushWidthValue (Object aObject) {
 
        return (int) aObject;
    }
 
    public class MouseCoordinateReader extends MouseAdapter {
 
        public void setPreviousCoordinates(int _PrevX, int _PrevY) {
 
            previousX = _PrevX;
            previousY = _PrevY;
 
        }
 
        public void mousePressed(MouseEvent ev) {
 
            setPreviousCoordinates(ev.getX(), ev.getY());
 
        }
 
    }
    public class PaintClass extends MouseMotionAdapter {
 
        public void mouseDragged(MouseEvent ev) {
 
            MouseCoordinateReader mcr = new MouseCoordinateReader();
 
            Graphics2D  g = (Graphics2D )topPanel.getGraphics();
            BasicStroke brushForm = new BasicStroke(getBrushWidthValue(brushFormWidth), BasicStroke.CAP_SQUARE, BasicStroke.JOIN_BEVEL);
 
            g.setStroke(brushForm);
            g.setColor(brushColor);
            g.drawLine(previousX, previousY, ev.getX(), ev.getY());
            mcr.setPreviousCoordinates(ev.getX(), ev.getY());
 
        }
    }
 
}
Только к сожалению не могу понять, почему перо не рисует, хотя как мне кажется код должен работать. В одной из предыдущих версий этой программки, созданной при помощи редактора форм IDEA 14 рисовать получалось, но структура программы была другой. В методе main создаётся экземпляр класса и запускается метод: MySimplePaint msp = new MySimplePaint(); msp.createGUI(). Подскажите, почему не работает addMouseListener(new MouseCoordinateReader()); addMouseMotionListener(new PaintClass()); и насколько корректна реализация brushFormWidth = setBrushWidthValueFild.getValue() при нажатии на кнопку. Заранее спасибо.

Решение задачи: «Создать фрейм с областью для рисования «пером»»

textual
Листинг программы
Graphics2D g = (Graphics2D)paintPanel.getGraphics();

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.846 из 5
Похожие ответы