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.
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?
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.
Använd SwingUtilities.invokeLater(...) för det grafiska rotelementet när din applikation bygger sitt GUI.
Kom-pa-TI-bilitet
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 );
}
}
}
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.
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?
kolla vad getContentPane() gör för en JFrame...
Copyright © 1999–2024 Geeks AB. Allt innehåll tillhör Geeks AB.
Citering är tillåten om källan anges.