Создать фрейм с областью для рисования «пером» - 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();
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д