Linie Zeichnen

Also der Strich ist jetzt zwar dicker aber die Anzeige der TextFelder ist jetzt völlig chaotisch und falsch... :confused:

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.JPanel;
import javax.swing.JTextField;

import com.sun.org.apache.bcel.internal.generic.NEW;

import sun.reflect.ReflectionFactory.GetReflectionFactoryAction;

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);
		
		Graphics ga = panel.getGraphics();
		paint(ga);
		
		setVisible(true);
	}
	
	public void paint(Graphics g) {
		super.paint(g);
    	g.fillRect(10,135,315,2);
    
    }
}

MfG
Saban
 
Zuletzt bearbeitet von einem Moderator:
Bei mir schaut es genau so aus.

Was ist daran falsch?

Achja und wozu dient dein boolean in der anzeigen-Methode? ;)
 

Anhänge

  • sudo.jpg
    sudo.jpg
    19,7 KB · Aufrufe: 71
Also das anzeigen war mal ne Methode zum ein und ausbleden des Frames dann hab ich einfach mal alles da rein geschmissen zum Testen ;)

Und bei mir kommt mal keine Fehlermeldung dann wird aber auch kein Strich gezeichnet und dann kommt doch mal eine und zwar
Java:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at javax.swing.BufferStrategyPaintManager.flushAccumulatedRegion(Unknown Source)
	at javax.swing.BufferStrategyPaintManager.endPaint(Unknown Source)
	at javax.swing.RepaintManager.endPaint(Unknown Source)
	at javax.swing.JComponent.paint(Unknown Source)
	at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
	at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
	at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
	at java.awt.Container.paint(Unknown Source)
	at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
	at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
	at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source)
	at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

wenn ich aber hinter des zweite setVisible(bool) nochmal eins setze wird nie ein Strich gezeichnet aber der Fehler kommt nicht mehr.
Deine Anzeige will ich ja eigentlich erreichen... :confused:

MfG
Saban
 
Zuletzt bearbeitet von einem Moderator:
Hi,
verwende für Linien die dicker sein sollen, oder ein Muster (z.B. gepunktet) aufweisen sollen, lieber Strokes.

Takidoso
 
Es geht immer noch nicht des gibts doch garnicht :suspekt::suspekt::suspekt:

Mein Code:
Java:
	public void anzeigen(boolean bool){
		setVisible(bool);
		
		Graphics ga = panel.getGraphics();
		zeichnen(ga);
		
		setVisible(bool);
	}
	
	public void zeichnen(Graphics g) {
		super.paint(g);
		Graphics2D g2 = (Graphics2D) g;
		g2.setStroke( new BasicStroke( 19));
	}

hier nochmal mein Problem als Bild
sudoku.th.png


MfG
Saban
 
Zuletzt bearbeitet von einem Moderator:
Also jetzt klappts so wie es soll :)

Das einzige Problem ist wenn das Frame den Focus verliert dann verschwinden die Striche... :confused:

Edit:\\ Wenn ich ein anderes Fenster anklicke und dieses mein Sudoku Frame überlappt verschwinden die Striche erst nicht wenn ich auf dem Desktop irgendwo anders hin klicke... :confused:

Könnt ihr mir da vllt helfen? :( :( :(

Java:
	public void anzeigen(boolean bool){
		setVisible(true);
	}
	
	public void paint( Graphics graphics ) {
		super.paint(graphics);
		
		graphics.drawLine( 10, 132, 320, 132);
		graphics.drawLine( 10, 237, 320, 237);
		graphics.drawLine(112,  30, 112, 340);
		graphics.drawLine(217,  30, 217, 340);
	}

MfG
Saban
 
Zuletzt bearbeitet von einem Moderator:
Hi
Ich denke es ist besser, wenn Du vielleicht doch die paintComponent-Routine überschreibst, da sie aus einem höhreren Level arbeitet. Ich glaube mich zu erinnern, dass das Überschreiben der paint-Routine vor Java 1.3 notwendig war, aber danach bzw. Mit Java 1.3 wurde dafür eine übergeordnete Routine geschaffen, paintComponent, die Ihrerseits, wenn mich nicht alles täuscht die paint-Routine aufruft.
 
Zuletzt bearbeitet:
ooops offenbar ist meine Antwort von vor ein paar Tagen verschütt gegangen :-/
also Du selbst rufst die paint-Routine bei Dir auf, das ist mir schon suspekt.
die paint bzw paintComponent-Routine, die ich Dir immernoch anstelle der paint-Routine empfehle, wird von Swing aufgerufen. Ist also eigetnlich nicht dazu da von Dir aufgerufen, sondern nur überschrieben zu werden.
dat ginge dann ungefähr so:
Java:
public class myPanel implements JPanel
public void paintComponent(Graphics g)
{
   super.paintComponent(g)
   // Male nach Herzenzlust
.....
}

Solllte eigetnlich klappen, auch wenn Du noch irgendwelche anderen Komponenten in dem Fenster hast.

viel Glück

Takidoso
 
könnte es sein, dass Dein Panel nach verlust des Focus die anderen Komponenten malt und dabei deine Linie übermalt?
versuche dochmal ohne die weiteren CheckBoxen oder was Du da noch eingebaut hast das lafuen zu lassen um zu sehen ob die Linie wieder bei Verlust des Focus verloren geht.
 
Zurück