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

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

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

Здравствуйте. Задача эта конечно не новая, но всё-таки попрошу помочь разобраться. Вопрос полностью звучит так: "Создать фрейм с областью для рисования «пером». Создать меню для выбора цвета и толщины линии". Я в качестве основы воспользовался материалом из двух статей: 1) http://eax.me/java-swing/ - здесь я взял основу формы для рисования. 2) - здесь основы реализации алгоритма. Получился следующий код:
Листинг программы
  1. import javax.swing.*;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. import java.text.NumberFormat;
  5. public class MySimplePaint extends JFrame {
  6. private int previousX, previousY;
  7. private Object brushFormWidth = (int)6;
  8. private Color brushColor = Color.BLACK;
  9. private JPanel topPanel = new JPanel();
  10. public MySimplePaint (){
  11. addMouseListener(new MouseCoordinateReader());
  12. addMouseMotionListener(new PaintClass());
  13. }
  14. Image img = new ImageIcon("1.png").getImage();
  15. public void createGUI() {
  16. Toolkit kit = Toolkit.getDefaultToolkit();
  17. Dimension screenSize = kit.getScreenSize();
  18. int screenW = screenSize.width;
  19. int screenH = screenSize.height;
  20. topPanel.setLayout(new BorderLayout());
  21. topPanel.setBackground(Color.WHITE);
  22. JButton selectColor = new JButton("Select Brush Color");
  23. JButton selectBrushWidth = new JButton("Select Brush Width");
  24. NumberFormat integerNumber;
  25. integerNumber = NumberFormat.getIntegerInstance();
  26. integerNumber.setMaximumIntegerDigits(2);
  27. integerNumber.setMinimumIntegerDigits(1);
  28. JFormattedTextField setBrushWidthValueFild = new JFormattedTextField(integerNumber);
  29. selectColor.addActionListener(new ActionListener() {
  30. @Override
  31. public void actionPerformed(ActionEvent e) {
  32. brushColor = JColorChooser.showDialog(((Component) e.getSource()).getParent(), "The color selection panel", brushColor);
  33. }
  34. });
  35. selectBrushWidth.addActionListener(new ActionListener() {
  36. @Override
  37. public void actionPerformed(ActionEvent e) {
  38. brushFormWidth = setBrushWidthValueFild.getValue();
  39. }
  40. });
  41. JPanel txtPannel = new JPanel();
  42. txtPannel.setLayout(new BorderLayout());
  43. txtPannel.add(Box.createHorizontalStrut(5));
  44. txtPannel.add(setBrushWidthValueFild);
  45. JPanel btnPannel = new JPanel();
  46. btnPannel.setLayout(new BoxLayout(btnPannel, BoxLayout.LINE_AXIS));
  47. btnPannel.add(selectColor);
  48. btnPannel.add(Box.createHorizontalStrut(5));
  49. btnPannel.add(selectBrushWidth);
  50. JPanel bottomPanel = new JPanel();
  51. bottomPanel.add(btnPannel);
  52. JPanel paintPanel = new JPanel();
  53. paintPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
  54. paintPanel.setLayout(new BorderLayout());
  55. paintPanel.add(topPanel, BorderLayout.CENTER);
  56. paintPanel.add(txtPannel, BorderLayout.NORTH);
  57. paintPanel.add(bottomPanel, BorderLayout.SOUTH);
  58. JFrame mainFrame = new JFrame("My Simple Paint");
  59. mainFrame.setMinimumSize(new Dimension(screenW / 2, screenH / 2));
  60. mainFrame.setLocationByPlatform(true);
  61. mainFrame.setIconImage(img);
  62. mainFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  63. mainFrame.add(paintPanel);
  64. mainFrame.pack();
  65. mainFrame.setVisible(true);
  66. addMouseListener(new MouseCoordinateReader());
  67. addMouseMotionListener(new PaintClass());
  68. }
  69. private int getBrushWidthValue (Object aObject) {
  70. return (int) aObject;
  71. }
  72. public class MouseCoordinateReader extends MouseAdapter {
  73. public void setPreviousCoordinates(int _PrevX, int _PrevY) {
  74. previousX = _PrevX;
  75. previousY = _PrevY;
  76. }
  77. public void mousePressed(MouseEvent ev) {
  78. setPreviousCoordinates(ev.getX(), ev.getY());
  79. }
  80. }
  81. public class PaintClass extends MouseMotionAdapter {
  82. public void mouseDragged(MouseEvent ev) {
  83. MouseCoordinateReader mcr = new MouseCoordinateReader();
  84. Graphics2D g = (Graphics2D )topPanel.getGraphics();
  85. BasicStroke brushForm = new BasicStroke(getBrushWidthValue(brushFormWidth), BasicStroke.CAP_SQUARE, BasicStroke.JOIN_BEVEL);
  86. g.setStroke(brushForm);
  87. g.setColor(brushColor);
  88. g.drawLine(previousX, previousY, ev.getX(), ev.getY());
  89. mcr.setPreviousCoordinates(ev.getX(), ev.getY());
  90. }
  91. }
  92. }
Только к сожалению не могу понять, почему перо не рисует, хотя как мне кажется код должен работать. В одной из предыдущих версий этой программки, созданной при помощи редактора форм IDEA 14 рисовать получалось, но структура программы была другой. В методе main создаётся экземпляр класса и запускается метод: MySimplePaint msp = new MySimplePaint(); msp.createGUI(). Подскажите, почему не работает addMouseListener(new MouseCoordinateReader()); addMouseMotionListener(new PaintClass()); и насколько корректна реализация brushFormWidth = setBrushWidthValueFild.getValue() при нажатии на кнопку. Заранее спасибо.

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

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

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


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

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

13   голосов , оценка 3.846 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы