June 27th, 2010 11:30 AM
#1
Java, graphics..
Hey!
I have an application that almost works, but I can't draw 2D graphics on the panel when I push the button "RITA". Why ?
Code:
package grafik;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.geom.*;
public class NyRam extends JFrame implements ActionListener
{
private JPanel panel1 = new JPanel ();
private JPanel panel2 = new JPanel ();
private JPanel panel3 = new JPanel ();
private JPanel panelen = new JPanel ();
private JLabel etikett1 = new JLabel ("Punkt 1");
private JLabel etikett2 = new JLabel ("Punkt 2");
private JLabel etikett3 = new JLabel ("Punkt 3");
private JTextField textFalt1 = new JTextField (5);
private JTextField textFalt2 = new JTextField (5);
private JTextField textFalt3 = new JTextField (5);
private JTextField textFalt4 = new JTextField (5);
private JTextField textFalt5 = new JTextField (5);
private JTextField textFalt6 = new JTextField (5);
private JButton knapp = new JButton ("RITA");
private Point2D.Double punktP1;
private Point2D.Double punktP2;
private Point2D.Double punktP3;
private NyPanel nyPan = new NyPanel ();
public NyRam (String titel)
{
super (titel);
this.setResizable (false);
this.setLocationRelativeTo (null);
this.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
this.setSize (800, 600);
this.setVisible (true);
etikett1.setForeground (Color.WHITE);
etikett2.setForeground (Color.WHITE);
etikett3.setForeground (Color.WHITE);
textFalt1.setBackground (Color.BLACK);
textFalt1.setForeground (Color.WHITE);
textFalt1.setText ("5.0");
textFalt2.setBackground (Color.BLACK);
textFalt2.setForeground (Color.WHITE);
textFalt2.setText ("15.0");
textFalt3.setBackground (Color.BLACK);
textFalt3.setForeground (Color.WHITE);
textFalt3.setText ("50.0");
textFalt4.setBackground (Color.BLACK);
textFalt4.setForeground (Color.WHITE);
textFalt4.setText ("100.0");
textFalt5.setBackground (Color.BLACK);
textFalt5.setForeground (Color.WHITE);
textFalt5.setText ("150.0");
textFalt6.setBackground (Color.BLACK);
textFalt6.setForeground (Color.WHITE);
textFalt6.setText ("200.0");
panel1.setLayout (new FlowLayout(FlowLayout.CENTER, 6, 2));
panel1.add (etikett1);
panel1.add (textFalt1);
panel1.add (textFalt2);
panel1.setBackground (Color.BLACK);
panel2.setLayout (new FlowLayout (FlowLayout.CENTER, 6, 2));
panel2.add (etikett2);
panel2.add (textFalt3);
panel2.add (textFalt4);
panel2.setBackground (Color.BLACK);
panel3.setLayout (new FlowLayout (FlowLayout.CENTER, 6, 2));
panel3.add (etikett3);
panel3.add (textFalt5);
panel3.add (textFalt6);
panel3.setBackground (Color.BLACK);
knapp.addActionListener (this);
knapp.setBackground (Color.BLACK);
knapp.setForeground (Color.WHITE);
panelen.setLayout (new GridLayout (1, 1));
panelen.add (panel1);
panelen.add (panel2);
panelen.add (panel3);
panelen.add (knapp);
this.setLayout (new BorderLayout ());
this.add (panelen, "South");
this.add (nyPan, "North");
}
public void actionPerformed (ActionEvent e)
{
try
{
String p1x = textFalt1.getText ();
double punkt1x = Double.parseDouble (p1x);
String p1y = textFalt2.getText ();
double punkt1y = Double.parseDouble (p1y);
String p2x = textFalt3.getText ();
double punkt2x = Double.parseDouble (p2x);
String p2y = textFalt4.getText ();
double punkt2y = Double.parseDouble (p2y);
String p3x = textFalt5.getText ();
double punkt3x = Double.parseDouble (p3x);
String p3y = textFalt6.getText ();
double punkt3y = Double.parseDouble (p3y);
punktP1 = new Point2D.Double (punkt1x, punkt1y);
punktP2 = new Point2D.Double (punkt2x, punkt2y);
punktP3 = new Point2D.Double (punkt3x, punkt3y);
nyPan = new NyPanel (punktP1, punktP2, punktP3);
this.add (nyPan, "North");
nyPan.repaint ();
} catch (Exception g)
{
JOptionPane.showMessageDialog (null, "Du måste ange heltal eller flyttal i alla fälten!\n" +
"För varje punkt så skall x samt y anges, (x, y).\n\n Felmeddelandet: " + g, "Meddelande", JOptionPane.ERROR_MESSAGE );
}
}
}
Code:
package grafik;
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
public class NyPanel extends JPanel
{
private Point2D.Double p1 = new Point2D.Double ();
private Point2D.Double p2 = new Point2D.Double ();
private Point2D.Double p3 = new Point2D.Double ();
public NyPanel (Point2D.Double p1, Point2D.Double p2, Point2D.Double p3)
{
this.p1 = p1;
this.p2 = p2;
this.p3 = p3;
}
public NyPanel ()
{
}
@Override
public void paintComponent (Graphics gr)
{
super.paintComponent (gr);
this.setBackground(Color.BLACK);
this.setSize(800, 546);
Graphics2D g = (Graphics2D) gr;
g.setColor (Color.WHITE);
QuadCurve2D kurvan = new QuadCurve2D.Double (this.p1.x, this.p1.y, this.p2.x, this.p2.y, this.p3.x, this.p3.y);
Line2D.Double linjen = new Line2D.Double (this.p1, this.p3);
Rectangle2D rektangeln = new Rectangle2D.Double (this.p1.x, this.p1.y, this.p3.x, p3.y);
g.draw (kurvan);
g.draw (linjen);
g.draw (rektangeln);
}
}
June 28th, 2010 04:30 AM
#2
Re: Java, graphics..
Rather than adding a new panel to the frame every time you press the button why not just reuse the existing panel.
For example change the 3 parameter constructor in NyPanel to a method ie setValues(..) and then just call this method from the action listener.
The problem with dynamically changing the components on a displayed screen is you have to force the container and layout manager to re-validate themselves. Sometimes this is the approach you have to take but in your case there is no reason I can see why you can't reuse the NyPanel you have already added.
June 28th, 2010 08:17 PM
#3
Re: Java, graphics..
I solved this problem now. On this way:
[CODE]this.getContentPane().remove(nyPan);
nyPan = new NyPanel (punktP1, punktP2, punktP3);
this.add (nyPan, BorderLayout.CENTER);
this.getContentPane().validate();
nyPan.repaint ();[CODE]
Posting Permissions
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
Forum Rules
Click Here to Expand Forum to Full Width
Bookmarks