Создать фрейм с областью для рисования «пером» - 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();