Interface JButton etc. wird in JFrame mit paint() nicht angezeigt

S4nd

Mitglied
Wie schon oben beschrieben versuche ich ein GUI bestehend aus JButton, JNumberField, JLabel etc. zu basteln. Ich möchte aber ich Hintergrund einen kleinen Grundriss mit Linien zeichnen lassen um es besser zu veranschaulichen.

Meine Vorgehensweise:
-JFrame
-Buttons etc. in Skyline() erstellen
-Linien in paint(Graphics g) zeichnen
-Buttons grafisch in paint(Graphics g) hinzufügen

Was Passiert?
Meine Grafik wird wie gewünscht gezeichnet, doch werden die Buttons und Textfelder erst nach einem Klich an dessen Position sichtbar, JLabel garnicht.

Was ist der Fehler?

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.JFrame;

public class Skyline extends JFrame {
  // Anfang Attribute
  private JNumberField jNumberField1 = new JNumberField();
  private JNumberField jNumberField2 = new JNumberField();
  private JNumberField jNumberField3 = new JNumberField();
  private JNumberField jNumberField4 = new JNumberField();
  private JNumberField jNumberField5 = new JNumberField();
  private JNumberField jNumberField6 = new JNumberField();
  private JNumberField jNumberField7 = new JNumberField();
  private JNumberField jNumberField8 = new JNumberField();
  private JButton jButton1 = new JButton();
  private JLabel jLabel1 = new JLabel();
  private JLabel jLabel2 = new JLabel();
  private JLabel jLabel3 = new JLabel();
  private JLabel jLabel4 = new JLabel();
  private JLabel jLabel5 = new JLabel();
  private JLabel jLabel6 = new JLabel();
  private JLabel jLabel7 = new JLabel();
  private JLabel jLabel8 = new JLabel();
  private JLabel jLabel9 = new JLabel();
  private JLabel jLabel10 = new JLabel();
  private JLabel jLabel11 = new JLabel();
  // Ende Attribute
  
  public Skyline() { 
    // Frame-Initialisierung
    setResizable(false);
    this.setTitle("Skyline");
    this.setLocation(100, 100);
    this.setResizable(false);
    this.setLayout(null);
    this.setSize(510,290);
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    //Panel cp = new Panel(null);
    //add(cp);   
    // Anfang Komponenten
    
    jNumberField1.setBounds(40, 32, 33, 25);
    jNumberField1.setText("");
    jNumberField2.setBounds(72, 32, 33, 25);
    jNumberField2.setText("");
    jNumberField3.setBounds(232, 32, 33, 25);
    jNumberField3.setText("");
    jNumberField4.setBounds(264, 32, 33, 25);
    jNumberField4.setText("");
    jNumberField5.setBounds(40, 168, 33, 25);
    jNumberField5.setText("");
    jNumberField6.setBounds(72, 168, 33, 25);
    jNumberField6.setText("");
    jNumberField7.setBounds(232, 168, 33, 25);
    jNumberField7.setText("");
    jNumberField8.setBounds(264, 168, 33, 25);
    jNumberField8.setText("");
    jButton1.setBounds(112, 216, 113, 33);
    jButton1.setText("Berechnen");
    jButton1.setMargin(new Insets(2, 2, 2, 2));
    jButton1.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        jButton1_ActionPerformed(evt);
      }
    });
    jLabel1.setBounds(48, 16, 54, 20);
    jLabel1.setText("Koord 1:");
    jLabel2.setBounds(240, 16, 54, 20);
    jLabel2.setText("Koord 2:");
    jLabel3.setBounds(48, 152, 54, 20);
    jLabel3.setText("Koord 3:");
    jLabel4.setBounds(240, 152, 54, 20);
    jLabel4.setText("Koord 4:");
    jLabel5.setBounds(48, 56, 43, 19);
    jLabel5.setText("x         y");
    jLabel6.setBounds(240, 56, 43, 19);
    jLabel6.setText("x         y");
    jLabel7.setBounds(48, 192, 43, 19);
    jLabel7.setText("x         y");
    jLabel8.setBounds(240, 192, 43, 19);
    jLabel8.setText("x         y");
    jLabel9.setBounds(352, 48, 123, 25);
    jLabel9.setText("Erlaubte Bauhöhe:");
    jLabel10.setBounds(352, 80, 54, 20);
    jLabel10.setText(" ");
    jLabel10.setBackground(Color.GREEN);
    jLabel10.setOpaque(true);
    jLabel11.setBounds(408, 80, 54, 20);
    jLabel11.setText("Meter");
    jLabel11.setOpaque(false);
    // Ende Komponenten
    
    repaint(); 
  } // end of public Skyline
  
  public void paint(Graphics g){ 
    //Grafik zeichnen
    g.setColor(Color.BLACK);
    g.drawLine(112,80,230,80);
    g.drawLine(112,80,112,193);
    g.drawLine(112,193,230,193);
    g.drawLine(230,80,230,193);
    g.fillOval(107,75,10,10);
    g.fillOval(224,75,10,10);
    g.fillOval(107,188,10,10);
    g.fillOval(225,188,10,10);
    
    //GUI hinzufügen
    getContentPane().add(jNumberField1);
    getContentPane().add(jNumberField2);
    getContentPane().add(jNumberField3);
    getContentPane().add(jNumberField4);
    getContentPane().add(jNumberField5);
    getContentPane().add(jNumberField6);
    getContentPane().add(jNumberField7);
    getContentPane().add(jNumberField8);
    getContentPane().add(jButton1);
    getContentPane().add(jLabel1);
    getContentPane().add(jLabel2);
    getContentPane().add(jLabel3);
    getContentPane().add(jLabel4);
    getContentPane().add(jLabel5);
    getContentPane().add(jLabel6);
    getContentPane().add(jLabel7);
    getContentPane().add(jLabel8);
    getContentPane().add(jLabel9);
    getContentPane().add(jLabel10);
    getContentPane().add(jLabel11);
  } 
  
  public void jButton1_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
  } // end of jButton1_ActionPerformed
  
  // Ende Methoden
  
  public static void main(String[] args) {
    new Skyline();    
  } // end of main
  
} // end of class Skyline



Ich hoffe ihr könnt mir helfen! 😳
Danke! 😉
 

Anhänge

  • JFrame Problem.JPG
    JFrame Problem.JPG
    29,1 KB · Aufrufe: 33
Java:
setVisible(true);

Das ruft man immer am Ende auf. Wenn alles fertig plaziert ist, dann kann es angezeigt werden.
 
Ich sehe gerade:
Java:
//GUI hinzufügen
    getContentPane().add(jNumberField1);
    getContentPane().add(jNumberField2);
    getContentPane().add(jNumberField3);
    getContentPane().add(jNumberField4);
    getContentPane().add(jNumberField5);
    getContentPane().add(jNumberField6);
    getContentPane().add(jNumberField7);
    getContentPane().add(jNumberField8);
    getContentPane().add(jButton1);
    getContentPane().add(jLabel1);
    getContentPane().add(jLabel2);
    getContentPane().add(jLabel3);
    getContentPane().add(jLabel4);
    getContentPane().add(jLabel5);
    getContentPane().add(jLabel6);
    getContentPane().add(jLabel7);
    getContentPane().add(jLabel8);
    getContentPane().add(jLabel9);
    getContentPane().add(jLabel10);
    getContentPane().add(jLabel11);

Das steht in der paint(). Das solltest du auf gar keinen Fall machen! paint zeichnet, das ist alles was paint machen soll.
Sowas gehört in den Konstruktor. Raus mit dem Code aus der Paint.
 
Guten Abend zusammen,

ich habe hier einfach mal eine kleine Demo für dich geschrieben. Schau sie dir einfach mal an. Dort wird gezeigt, wie du einfach ein JLabel anzeigen lassen kannst.

Komponenten, die du der ContentPane hinzufügst, bitte nicht in die paint() Methode schreiben.

Java:
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Skyline extends JFrame {

	private static final long serialVersionUID = 1L;
	private JLabel lblText;

	public Skyline() {

		// --- Allgemeine Einstellungen
		this.setTitle("Skyline");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setSize(300, 100);
		
		// --- Methoden zum initialisieren der Komponenten
		initComponents();
		addComponents();

		// --- Frame Einstellungen ---
		this.setVisible(true);
		this.setLocationRelativeTo(null);
	}

	// --- Komponenten werden erstellt ---
	private void initComponents() {
		lblText = new JLabel("Hier steht ein Text");
		lblText.setBounds(10, 10, 150, 30);
	}

	// --- Komponenten werden der ContentPane hinzugefügt 
	private void addComponents() {
		Container con = this.getContentPane();
		con.setLayout(null);
		con.add(lblText);
	}

	// --- Main-Methode
	public static void main(String[] args) {
		new Skyline();
	}
}

Falls du noch Fragen haben solltest, schreib sie hier einfach rein. Werde sie mir dann morgen anschauen.

Gute Nacht.
 
Zwei kleine Tipps kann ich dir noch geben:

1.) Kommentier deine paint() - Methode einmal aus und schaue, was passiert.
2.) Zum Zeichnen Implementierst du am besten eine Klasse, die von JLabel bzw. JPanel erbt und dort überschreibst du dann die paintComponent() - Methode. In diese Methode kannst du dann, wie bei dir in deinem Beispiel, gezeichnet werden. Ein Graphics Objekt hast du dort ebenfalls zur Verfügung. Und eine Instanz dieser Klasse fügst du dann einfach deinem Frame hinzu. Fertig. Falls du Fragen hast, poste es hier einfach. Aber probiere es vorher erst einmal selbst. 😉

Gute Nacht.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben