Swing Warum öffnen sich beim Zeichnen mit Swing plötzlich zwei Fenster?

Michael_FeM

Mitglied
Hallo Liebe Community,

ich arbeite momentan an einem Projekt für die UNI und beiße mir seit Tagen an folgendem Code die Zähne aus. Ich steige im Moment von C++ auf Java um und bin noch recht neu hier. Trotzdem hoffe ich auf Hilfe in diesem Forum. Über eine Antwort würde ich mich sehr freuen.

Was sich möchte:
Ein Fenster mit Menü Bar in das ich zeichnen kann.

Mein Problem:
Nach dem Komilieren geht ein Fenster mit Menüleiste auf + ein Fenster in dem sich die zu zeichnende Zeichenkette ausgegeben wird.

Frage:
Was mache ich bloß falsch?

Mein Code:
Java:
package graphicalfunction;
import java.awt.*;
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RoundRectangle2D;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;


@SuppressWarnings({ "unused", "serial" })
public class Drawing extends JFrame implements ActionListener
{
	public Drawing ( )
	{
		//Framelayout
		JFrame frame = new JFrame ("Graphical Control");
		frame.setSize(1280,720);
		frame.setLayout (new FlowLayout());
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
		frame.getContentPane().setBackground(Color.gray);
		
		//Menu
		JMenuBar menubar = new JMenuBar();
		JMenu filemenu = new JMenu("File");
		filemenu.add(new JSeparator());
		filemenu.add(new JSeparator());
		JMenu editmenu = new JMenu("Mode");
		editmenu.add(new JSeparator());
		JMenuItem fileItem1 = new JMenuItem("Quit");
		JMenuItem editItem3 = new JMenuItem("Pulse");
		JMenuItem editItem4 = new JMenuItem("Continous");
		filemenu.add(fileItem1);
		editmenu.add(editItem3);
		editmenu.add(editItem4);
		menubar.add(filemenu);
		menubar.add(editmenu);
		frame.setJMenuBar(menubar);
		
		//Menu Colors
		menubar.setBackground(Color.white);  
		filemenu.setForeground(Color.black);  
		editmenu.setForeground(Color.black);
		//ActionListener
		fileItem1.addActionListener(this);
		fileItem1.addActionListener(new ActionListener()	
         {
             public void actionPerformed(ActionEvent e)
             {
                 System.exit(0);
             }
         });
}
	
	public void paint (Graphics g) 
	{
		g.drawString("Test Zeichenkette",50,100);
		
	}
	
	
	public static void main(String[] args) 
	{
		Drawing fb = new Drawing ();
		fb.setVisible(true);
		
		
	}



	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		
	}	
}



Freundliche Grüße,
Michael
 
Du erstellst zwei JFrames und zeigst beide an.
Das eine ist deine Klasse Drawing selbst, da sie von JFrame erbt.
Das zweite JFrame erstellst du innerhalb des Konstruktors von Drawing und zeigst dieses ebenfalls an.
(siehe setVisible(true) einmal an Zeile 35 und einmal bei Zeile 80)
 
Hey,

erstmal "Danke" für die schnelle Antwort. Ich habe das "setVisible(true)" in Zeile 80 gelöscht. Allerdings geht dann
nur noch ein Fenster mit Menü Leiste auf.

Wie schaffe ich es den "String" auch in diesem Fenster auszugeben?

Gruß,
Michael
 
Hallo,

so würde es gehen:
Java:
public Drawing()
	{
		// Framelayout
		// JFrame frame = new JFrame("Graphical Control");
		this.setSize(1280, 720);
		this.setLayout(new FlowLayout());
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
		this.getContentPane().setBackground(Color.gray);
		
		//[...]
}

und
Java:
@Override
	public void paint(Graphics g)
	{
		// Rahmen, Menüs usw. zeichnen
		super.paint(g);
		g.drawString("Test Zeichenkette", 50, 100);
	}

ich würde mir aber ein "Zeichenpanel" programmmieren:
Java:
public class DrawPanel extends JPanel {

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.drawString("Test Zeichenkette", 50, 100);

		// noch besser mit Graphics2D arbeiten
		Graphics2D draw = (Graphics2D) g;
	}
}

und dieses dann dem JFrame hinzufügen:

Java:
  this.add(new DrawPanel());

Grüße
 
Erstmal: wenn du dich bei jemandem bedanken willst, benutz doch den "Danke" Button.
2. Du überschreibst die paint Methode. Das ist hier doppelt falsch: Erstens weil man nicht die paint, sondern die paintComponent Methode überschreiben sollte wenn man selber was zeichnen will auf der Komponente. Zweitens weil du ja auch noch ein Menü etc darstellen willst und das klappt nur, wenn man das Menu in der paint dann auch zeichnet.

Du solltest dir sowieso einen geeigneteren Namen für deine Klasse suche. Drawing bzw. Zeichnen ist kein Name für ein Objekt (ist nämlich ein Verb 🙂 ). Besser wäre z.B ein DrawingPanel. Das lässt du von JPanel erben, überschreibst darin die paintComponent Methode und schmeisst dein Panel in einen Frame.
 

Zurück
Oben