Linie Zeichnen

Saban

Erfahrenes Mitglied
Hallo!

ich will auf meinem Frame eine Linie ziehen. Das klappt eigentlich auch das problem ist nur das die Linie kurz gezeichnet wird und dann irgendwie verschwindet... :confused:

hier mein Code:
Java:
package UnserSudoku;

import java.awt.Container;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class SudoFrame extends JFrame{
	
	public int feldlänge 		= 9;
	public int[][] array 		= new int[feldlänge][feldlänge];
	public JTextField tf[][]	= new JTextField[feldlänge][feldlänge];
	public JButton bt_start 	= new JButton("Start");
	public Font font 			= new Font("SansSerif", Font.BOLD, 14);
	
	public SudoFrame(){
		Container GUI = getContentPane();
		GUI.setLayout(null);
		
		for(int zeilen = 0; zeilen < feldlänge; zeilen++){
			for(int spalten = 0; spalten < feldlänge; spalten++){
				tf[zeilen][spalten] = new JTextField();
				tf[zeilen][spalten].setDocument(new Sudo_TextFeld_Begrenzung(1));
				tf[zeilen][spalten].setHorizontalAlignment(JTextField.CENTER);
				add(tf[zeilen][spalten]);
			}
		}
		
		int pos_x = 10;
		int pos_y = 10; 
		int hoehe = 25;
		int breite = 25;
		int zähler = 0;
		
		
		for(int zeilen = 0; zeilen < feldlänge; zeilen++){
			for(int spalten = 0; spalten < feldlänge; spalten++){
				tf[zeilen][spalten].setBounds(pos_x, pos_y, hoehe, breite);
				pos_x = pos_x + 35;
				zähler++;
				
				if(zähler == 9){
					pos_x = 10;
					pos_y = pos_y + 35;
					zähler = 0;
				}
			}
		}
	}    
	
	public int[][] getGet2DimArray(){		
		for(int zeilen = 0; zeilen < feldlänge; zeilen++){
			for(int spalten = 0; spalten < feldlänge; spalten++){
				array[zeilen][spalten] = Integer.parseInt(tf[zeilen][spalten].getText());
			}
		}
		
		return array;
	}
	
	public void anzeigen(boolean bool){
		setResizable(false);
		setTitle("Sudoku Löser");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(330, 350);
		setVisible(bool);
		
		Graphics ga = getRootPane().getGraphics();
		drawLine(ga);
		setVisible(bool);
	}
	
	public void drawLine(Graphics g){
		Graphics2D g2D = (Graphics2D)g;
		g2D.draw(new Line2D.Double(10, 10, 100, 2));
	}
}

Hab ihr mir vllt nen Tip?

MfG
Saban
 
Zuletzt bearbeitet von einem Moderator:
Die Linie wird gezeichnet aber dann verschwindet sie plötzlich... Also beim Aufbau des Frames sieht man den Strich doch der ist dann sofort wieder weg (wird nicht mal ne Sekunde lang angezeigt!)

MfG
Saban
 
Ich glaube (bin mir nicht ganz sicher), dass es daran liegt dass du die Linie in einer eigenen Methode zeichnest und diese dann bei einem repaint() nicht aufgerufen wird. Deswegen solltest du die paint()-Methode deines Panels überschreiben.


Java:
...
this.setContentPane(new JPanel() {
         public void paint(Graphics g) {

        super.paint(g);
        
        Graphics2D g2D = (Graphics2D)g;
        g2D.draw(new Line2D.Double(10, 10, 100, 2));

        }

});
...

Allerdings ungetestet.
 
Hi Hammet!

danke für deinen Tip! Ich habs ausprobiert das zeichnen klappt jetzt nur jetzt werden die TextFelder nicht mehr angezeigt nur noch der Strich :confused:

MfG
Saban
 
Was genau hast du denn geändert?
Hast du meinen Code einfach nur am Ende deines Codes eingefügt?

Du musst darauf achten, dass du dein ContentPane nicht überschreibst. Ein bisschen Code wäre nicht schlecht. :)
 
Sorry! Bitte:

Java:
package UnserSudoku;

import java.awt.Container;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Sudo_Frame extends JFrame{
	
	public int feldlänge 		= 9;
	public int[][] array 		= new int[feldlänge][feldlänge];
	public JTextField tf[][]	= new JTextField[feldlänge][feldlänge];
	public JButton bt_start 	= new JButton("Start");
	public Font font 			= new Font("SansSerif", Font.BOLD, 14);
	public JPanel panel			= new JPanel();
	
	public Sudo_Frame(){
		panel.setLayout(null);
		
		for(int zeilen = 0; zeilen < feldlänge; zeilen++){
			for(int spalten = 0; spalten < feldlänge; spalten++){
				tf[zeilen][spalten] = new JTextField();
				tf[zeilen][spalten].setDocument(new Sudo_TextFeld_Begrenzung(1));
				tf[zeilen][spalten].setHorizontalAlignment(JTextField.CENTER);
				panel.add(tf[zeilen][spalten]);
			}
		}
		
		add(panel);
		
		int pos_x = 10;
		int pos_y = 10; 
		int hoehe = 25;
		int breite = 25;
		int zähler = 0;
		
		
		for(int zeilen = 0; zeilen < feldlänge; zeilen++){
			for(int spalten = 0; spalten < feldlänge; spalten++){
				tf[zeilen][spalten].setBounds(pos_x, pos_y, hoehe, breite);
				pos_x = pos_x + 35;
				zähler++;
				
				if(zähler == 9){
					pos_x = 10;
					pos_y = pos_y + 35;
					zähler = 0;
				}
			}
		}
	}    
	
	public int[][] getGet2DimArray(){		
		for(int zeilen = 0; zeilen < feldlänge; zeilen++){
			for(int spalten = 0; spalten < feldlänge; spalten++){
				array[zeilen][spalten] = Integer.parseInt(tf[zeilen][spalten].getText());
			}
		}
		
		return array;
	}
	
	public void anzeigen(boolean bool){
		setResizable(false);
		setTitle("Sudoku Löser");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(330, 350);
		setVisible(bool);
		
		this.setContentPane(new JPanel() {
			public void paint(Graphics g) {
				super.paint(g);
	        	Graphics2D g2D = (Graphics2D)g;
	        	g2D.draw(new Line2D.Double(10, 10, 100, 2));
	        
	        }
		});
		
		setVisible(true);
	}
}

MfG
Saban
 
Zuletzt bearbeitet von einem Moderator:
Wie vermutet, du addest in deinem Konstruktor deine Texfelder auf dein ContentPane und dann überschreibst du dieses mit einem neuen JPanel in deiner anzeigen-Methode.
Du musst die paint_methode überschreiben, bevor du Komponenten auf das Panel legst.

Zudem, solltest du den Code aus der Paint-Methode (bis auf das super) in eine eigenen Methode packen und diese in der Paint-methode aufrufen, allein der Übersichtlichkeit und Wartbarkeit halber.
 
Hi,
überschreibe doch einfach mal die paintComponent-Methode, also einfach nur den Namen austauschen und alles wird gut :p
 
Hi!

Danke jetzt geht alles! Kann man den Strich auch irgendwie dicker zeichnen lassen?

MfG
Saban
 
Benutz doch einfach fillRect(), damit solltest du beliebig dicke "Linien" zeichnen können :)


Und denk dran, wenn das Problem gelöst ist, den Thread als erledigt markieren und gegebenenfalls die Hilfe bewerten ;)
 

Neue Beiträge

Zurück