I am writing a 2D drawing application using javax.swing
package. The idea is to create a DrawingApplicationFrame
(extends Jframe
class), in which several JButtton
, JCheckBox
, JTextFields
are instantiated to change the state of the paint, in addition to a DrawingPanel
instance drawpanel
embedded in this DrawingApplicationFrame
class. I use JTextField
instances LineWidthText
and DashLengthText
to change the Width
and Length
attributes of instance drawpanel
. However, the textfields seems not accepting the values in them and change drawpanel.Width
and drawpanel.Length
values. How can I fix the error to let the textfields pass value?
Here's the creation of listeners for textfields LineWidthText
and DashLengthText
:
JTextField LineWidthText=new JTextField(2);
JTextField DashLengthText=new JTextField(2);
LineWidthText.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e)
{
drawpanel.Width=Float.parseFloat(LineWidthText.getText());
drawpanel.dashed=new BasicStroke(drawpanel.Width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[]{drawpanel.Length}, 10);
drawpanel.concrete=new BasicStroke(drawpanel.Width);
}
});
DashLengthText.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e)
{
drawpanel.Length=Float.parseFloat(DashLengthText.getText());
drawpanel.dashed=new BasicStroke(drawpanel.Width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[]{drawpanel.Length}, 10);
}
});
Here's code for DrawPanel class:
public class DrawPanel extends JPanel
{
Color ColorOne=Color.BLACK;
Color ColorTwo=Color.BLACK;
Boolean FilledOrNot=false, UseGradientOrNot=false, DashedOrNot=false, isDragged=false;
float Width=10;
float Length=10;
String ShapeChoice="Line";
ArrayList<MyShapes> ShapeObjects=new ArrayList<MyShapes>();
Paint gradient=new GradientPaint(100, 100, ColorOne, 100+Width*2, 100+Width*2, ColorTwo, true);
Paint mono=new GradientPaint(100, 100, ColorOne, 100+Width*2, 100+Width*2, ColorOne, true);
Stroke dashed=new BasicStroke(Width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[]{Length}, 10);
Stroke concrete=new BasicStroke(Width);
Point start=new Point();
Point stop=new Point();
Point drag=new Point();
JLabel label=new JLabel("(,)");
public DrawPanel(String caption)
{
this.setBackground(Color.WHITE);
this.setLayout(new BorderLayout());
this.add(label, BorderLayout.SOUTH);
this.label.setVisible(true);
}
@Override
@SuppressWarnings("empty-statement")
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
//loop through and draw each shape in the shapes arraylist
addMouseListener(new MouseHandler());
for(int i=0; i<ShapeObjects.size(); i++){
ShapeObjects.get(i).draw(g2d);
}
}
void removeLastElement(){
ShapeObjects.remove(ShapeObjects.size()-1);
repaint();
}
void clearAllElements(){
ShapeObjects.clear();
repaint();
}
public void addShape(MyShapes shape){
ShapeObjects.add(shape);
}
public class MouseHandler extends MouseAdapter implements MouseMotionListener
{
public void mousePressed(MouseEvent event)
{
DrawPanel dp=(DrawPanel) event.getSource();
dp.start=(new Point(event.getX(), event.getY()));
}
public void mouseReleased(MouseEvent event)
{
DrawPanel dp=(DrawPanel) event.getSource();
dp.stop=(new Point(event.getX(), event.getY()));
switch(ShapeChoice){
case "Line":
if(UseGradientOrNot&&DashedOrNot)
dp.addShape(new MyLine(dp.start, dp.stop, dp.gradient, dp.dashed));
else if((UseGradientOrNot==false)&&DashedOrNot)
dp.addShape(new MyLine(dp.start, dp.stop, dp.mono, dp.dashed));
else if(UseGradientOrNot&&(DashedOrNot==false))
dp.addShape(new MyLine(dp.start, dp.stop, dp.gradient, dp.concrete));
else if((UseGradientOrNot==false)&&(DashedOrNot)==false)
dp.addShape(new MyLine(dp.start, dp.stop, dp.mono, dp.concrete));
break;
case "Oval":
if(UseGradientOrNot&&DashedOrNot)
dp.addShape(new MyOval(dp.start, dp.stop, dp.gradient, dp.dashed, dp.FilledOrNot));
else if((UseGradientOrNot==false)&&DashedOrNot)
dp.addShape(new MyOval(dp.start, dp.stop, dp.mono, dp.dashed, dp.FilledOrNot));
else if(UseGradientOrNot&&(DashedOrNot==false))
dp.addShape(new MyOval(dp.start, dp.stop, dp.gradient, dp.concrete, dp.FilledOrNot));
else if((UseGradientOrNot==false)&&(DashedOrNot)==false)
dp.addShape(new MyOval(dp.start, dp.stop, dp.mono, dp.concrete, dp.FilledOrNot));
break;
case "Rectangle":
if(UseGradientOrNot&&DashedOrNot)
dp.addShape(new MyRectangle(dp.start, dp.stop, dp.gradient, dp.dashed, dp.FilledOrNot));
else if((UseGradientOrNot==false)&&DashedOrNot)
dp.addShape(new MyRectangle(dp.start, dp.stop, dp.mono, dp.dashed, dp.FilledOrNot));
else if(UseGradientOrNot&&(DashedOrNot==false))
dp.addShape(new MyRectangle(dp.start, dp.stop, dp.gradient, dp.concrete, dp.FilledOrNot));
else if((UseGradientOrNot==false)&&(DashedOrNot)==false)
dp.addShape(new MyRectangle(dp.start, dp.stop, dp.mono, dp.concrete, dp.FilledOrNot));
break;
}
repaint();
}
}
}
It is solved by myself. There're two methods: one is to assign the value-retrieving task from the textfields on a button. The another is simply press "Enter" key! It turns out that the code works just fine. It does not work only when the value simply is typed into the textfields without any further actions!