Создать фрейм с областью для рисования «пером» - Java
Формулировка задачи:
Здравствуйте. Задача эта конечно не новая, но всё-таки попрошу помочь разобраться. Вопрос полностью звучит так: "Создать фрейм с областью для рисования «пером». Создать меню для выбора цвета и толщины линии".
Я в качестве основы воспользовался материалом из двух статей:
1) http://eax.me/java-swing/ - здесь я взял основу формы для рисования.
2) - здесь основы реализации алгоритма.
Получился следующий код:
Только к сожалению не могу понять, почему перо не рисует, хотя как мне кажется код должен работать. В одной из предыдущих версий этой программки, созданной при помощи редактора форм IDEA 14 рисовать получалось, но структура программы была другой.
В методе main создаётся экземпляр класса и запускается метод: MySimplePaint msp = new MySimplePaint(); msp.createGUI().
Подскажите, почему не работает addMouseListener(new MouseCoordinateReader()); addMouseMotionListener(new PaintClass()); и насколько корректна реализация brushFormWidth = setBrushWidthValueFild.getValue() при нажатии на кнопку. Заранее спасибо.
Листинг программы
- 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());
- }
- }
- }
Решение задачи: «Создать фрейм с областью для рисования «пером»»
textual
Листинг программы
- Graphics2D g = (Graphics2D)paintPanel.getGraphics();
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д