Permalänk

Java, fel med JPanel..

Hej!

Ett program som jag har gjort har någon konstig bugg, har ingen aning om varför/hur denna bugg uppkommer.

Problemet: Öppnar man programmet första gången så dyker inte panelen upp i ramen, öppnar man andra gången så dyker den upp. Alltid när jag skickar mitt program till folk så fungerar inte programmet första gången man öppnar, varför?

Visa signatur

Datorn: i7 3770k, Gigabyte GA-Z77-DS3H, Corsair Vengeance 16gb, Gtx 680, Samsung 830 SSD 256gb, Seagate 1Tb, Fractal design R4, Corsair HX750 750W, DELL U2711.

Studerar: Civilingenjör IT på KTH, började HT 2009 och blir klar sommaren 2014.

Permalänk
Medlem

Använd SwingUtilities.invokeLater(...) för det grafiska rotelementet när din applikation bygger sitt GUI.

Visa signatur

Kom-pa-TI-bilitet

Permalänk

Aldrig hört talas om.
Kan posta koden så kan du/ni undersöka om några uppenbara fel finnes?

package grafik; public class Main { public static void main (String[] args) { new NyRam ("Grafiska objekt"); } }

package grafik; import javax.swing.*; import java.awt.*; import java.awt.geom.*; public class NyPanel extends JPanel { private Point2D.Double p1 = new Point2D.Double (700, 200); private Point2D.Double p2 = new Point2D.Double (0, 500); private Point2D.Double p3 = new Point2D.Double (100, 300); 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); 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); g.draw (kurvan); g.draw (linjen); } }

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 ("700"); textFalt2.setBackground (Color.BLACK); textFalt2.setForeground (Color.WHITE); textFalt2.setText ("200"); textFalt3.setBackground (Color.BLACK); textFalt3.setForeground (Color.WHITE); textFalt3.setText ("0"); textFalt4.setBackground (Color.BLACK); textFalt4.setForeground (Color.WHITE); textFalt4.setText ("500"); textFalt5.setBackground (Color.BLACK); textFalt5.setForeground (Color.WHITE); textFalt5.setText ("100"); textFalt6.setBackground (Color.BLACK); textFalt6.setForeground (Color.WHITE); textFalt6.setText ("300"); 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, BorderLayout.SOUTH); this.add (nyPan, BorderLayout.CENTER); } 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); this.getContentPane().remove(nyPan); nyPan = new NyPanel (punktP1, punktP2, punktP3); this.add (nyPan, BorderLayout.CENTER); this.getContentPane().validate(); nyPan.repaint (); } catch (Exception g) { JOptionPane.showMessageDialog (null, "Du måste ange heltal eller flyttal i alla fälten! Flyttalet anges med en punkt och inte ett kommatecken.\n" + "För varje punkt så skall x samt y anges, (x, y).\n\n Felmeddelandet: " + g, "Meddelande", JOptionPane.ERROR_MESSAGE ); } } }

Visa signatur

Datorn: i7 3770k, Gigabyte GA-Z77-DS3H, Corsair Vengeance 16gb, Gtx 680, Samsung 830 SSD 256gb, Seagate 1Tb, Fractal design R4, Corsair HX750 750W, DELL U2711.

Studerar: Civilingenjör IT på KTH, började HT 2009 och blir klar sommaren 2014.

Permalänk
Medlem

I konstruktorn för NyRam, så anropar du this.setVisible(true); alldeles förtidigt, den ska du anropa sist i konstruktorn.

Det känns lite klumpigt att du tar bort och sen lägger till nyPan i din action. Kan du inte göra så att du helt enkelt uppdaterar den befintliga istället?

Permalänk
Medlem

kolla vad getContentPane() gör för en JFrame...