Gitter in Sudoko-Anzeige

timbeau

Gesperrter Benutzer
Hallo,

ich habe mich um die GUI von Java besser kennen zu lernen an eine "einfache" Aufgabe gewagt. Ich gebe Zahlen in ein Sudokufeld ein und dann soll mir das gelöste Sudoku ausgegeben werden. Ich dachte, ich hätte den Code für die Ausgabe angepasst aber ich mache etwas falsch. Auf dem Bild sieht man links die Eingabe und rechts die Ausgabe




Und bitte, meinen Quellcode wollte ich eigentlich nie jemandem zeigen, daher ist die Namensgebung sehr inkonsequent.


Eingabe:
Java:
package sudokuExtern;
import java.awt.AlphaComposite;
import java.awt.Composite;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

import sudokuIntern.SudokuEinzelfeld;
import sudokuIntern.SudokuSpielfeld;
 
public class SudokuEingabeGUI extends JPanel {
 
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	ImageIcon a = new ImageIcon(this.getClass().getResource("sudoku.jpg"));
	static SudokuEingabeGUI pan = new SudokuEingabeGUI();
	private static SudokuEinzelfeld [][] loesung;
 
	public SudokuEingabeGUI() {
	}
 
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
 
		Graphics2D g2d = (Graphics2D) g;
 
		Composite oldComp = g2d.getComposite();
 
		Composite alphaComp = AlphaComposite.getInstance(
				AlphaComposite.SRC_OVER, 0.3f);
 
		g2d.setComposite(alphaComp);
 
		g2d.drawImage(a.getImage(), 0, -3, this.getWidth(), this.getHeight(),
				this);
 
		g2d.setComposite(oldComp);
	}
 
	public static void main(String[] args) {
		JFrame f = new JFrame();
		f.setTitle("Sudoku Solver");
		pan = new SudokuEingabeGUI();
 
		pan.add(new Buttonpanel());
 
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(300, 340);
		f.setResizable(false);
		f.add(pan);
		f.pack();
		
		f.setVisible(true);
		// f.setIgnoreRepaint(true);
	}
 
	public void setLoesung(SudokuEinzelfeld [][] loesung) {
		SudokuEingabeGUI.loesung = loesung;
		SudokuAusgabeGui ausgabe = new SudokuAusgabeGui(loesung);
		//ausgabe.zeichne();
	}

	static SudokuEinzelfeld [][] getLoesung() {
		return loesung;
	}

	static class Buttonpanel extends JPanel {
		
		JTextField[] alle81Felder = new JTextField[81];
		JPanel jPanel1 = new JPanel();
		
		ActionListener goButtonListener = new ActionListener(){
			

			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println(alle81Felder[1].getText());
				int[][]array = new int[9][9];
				
				int zeilenCounter=0;
				int spalten = 0;
				int i = 0;
				
					
				
				while(zeilenCounter<9 && i < alle81Felder.length ) {
					if(spalten == 9 && zeilenCounter<8){
						zeilenCounter++;
						spalten=0;
					}
					else if(spalten == 9 && zeilenCounter>=8){
						spalten=0;
					}
					if(alle81Felder[i].getText().isEmpty()){
						array[zeilenCounter][spalten] = 0;
					}
					else {
						try{
							array[zeilenCounter][spalten] = Integer.parseInt(alle81Felder[i].getText());
							
						}
						catch (NumberFormatException e1) {
							JFrame warning = new JFrame("FEHLER");
							warning.setSize(100,50);
							JPanel warningPanel = new JPanel();
							JLabel warningLabel = new JLabel("FALSCHE EINGABE");
							warning.add(warningLabel);
							warning.pack();
							warning.show();
							e1.printStackTrace();
							break;
						}
					}
					spalten++;
					i++;
					
				}
				
				SudokuSpielfeld ssf = new SudokuSpielfeld(array, pan);
				ssf.backTrack(ssf);
			}
		};
		
		
		
		
		public Buttonpanel() {
			jPanel1.setLayout(new GridBagLayout());
			jPanel1.setSize(300, 340);
			// Buttons initialisieren
			for (int i = 0; i < alle81Felder.length; i++) {
				alle81Felder[i] = new JTextField(1);
				alle81Felder[i].setText("");
			}
			int counterZeile = 0;
			int counterSpalte = 0;
			for (int i = 0; i < alle81Felder.length; i++) {
				if (counterSpalte == 9) {
					counterZeile++;
					counterSpalte = 0;
				}

							jPanel1.add(alle81Felder[i], new GridBagConstraints(
									counterSpalte,counterZeile,1,1,0,0,
									GridBagConstraints.CENTER,
									GridBagConstraints.HORIZONTAL, new Insets(4, 4, 4, 4),
									0, 0));
				counterSpalte++;
			}
			JButton start = new JButton("GO");
			start.addActionListener(goButtonListener);
			jPanel1.add(start, new GridBagConstraints(0, counterZeile + 1,
					GridBagConstraints.REMAINDER, 1, 0, 0,
					GridBagConstraints.CENTER, GridBagConstraints.REMAINDER,
					new Insets(4, 4, 4, 4), 0, 0));
			
			jPanel1.setOpaque(false);
			add(jPanel1);
			
			this.setOpaque(false);
		}
	}
	
	
	
	
	
	
}

Ausgabe:
Java:
package sudokuExtern;

import java.awt.AlphaComposite;
import java.awt.Composite;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

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

import sudokuIntern.SudokuEinzelfeld;

public class SudokuAusgabeGui extends JPanel {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	ImageIcon a = new ImageIcon(this.getClass().getResource("sudoku.jpg"));
	private static SudokuEinzelfeld[][] loesung;
	

	public void paintComponent(Graphics g) {
		super.paintComponent(g);

		Graphics2D g2d = (Graphics2D) g;

		Composite oldComp = g2d.getComposite();

		Composite alphaComp = AlphaComposite.getInstance(
				AlphaComposite.SRC_OVER, 0.3f);

		g2d.setComposite(alphaComp);

		g2d.drawImage(a.getImage(), 0, -3, this.getWidth(), this.getHeight(),
				this);

		g2d.setComposite(oldComp);
	}

	//Konstruktor
	public SudokuAusgabeGui(SudokuEinzelfeld[][] loesung) {
		ImageIcon a = new ImageIcon(this.getClass().getResource("sudoku.jpg"));
		this.loesung = loesung;
		repaint();
		zeichne();
	}

	void zeichne() {
		
		JFrame f = new JFrame();
		f.setTitle("Sudoku Solved!");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(300, 340);
		f.setResizable(false);
		f.add(new Loesungspanel());
		f.pack();

		f.setVisible(true);
	}

	static class Loesungspanel extends JPanel {

		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;

		public Loesungspanel() {
			
			//Zahlen uebertragen
			JTextField[] alle81Felder = new JTextField[81];
			JPanel jPanel1 = new JPanel();
			jPanel1.setLayout(new GridBagLayout());
			jPanel1.setSize(300, 340);
			int spalten = 0;
			for (int zeile = 0; zeile < alle81Felder.length; zeile++) {
				if(zeile % 9 == 0 && zeile > 0){
					spalten++;
				}
				String zahl = Integer.toString(loesung[zeile%9][spalten].getAktuelleZahl());
				alle81Felder[zeile] = new JTextField(1);
				alle81Felder[zeile].setText(zahl);
			}
			int counterZeile = 0;
			int counterSpalte = 0;
			for (int i = 0; i < alle81Felder.length; i++) {
				if (counterSpalte == 9) {
					counterZeile++;
					counterSpalte = 0;
				}

				jPanel1.add(alle81Felder[i], new GridBagConstraints(
						counterSpalte, counterZeile, 1, 1, 0, 0,
						GridBagConstraints.CENTER,
						GridBagConstraints.HORIZONTAL, new Insets(4, 4, 4, 4),
						0, 0));
				counterSpalte++;
			}

			jPanel1.setOpaque(false);
			add(jPanel1);

			this.setOpaque(false);

		}

	}

}

Ich nehme an, es liegt an der fehlenden Ausführung von paintComponents. Aber alle Versuche mit repaint() meinerseits zeigten keine Wirkung. Ich weiß, wie nervig fremder Code sein kann, wenn es zuviel ist, einfach nicht antworten ich versuch mich weiter dran.

MfG, Tim
 
Zuletzt bearbeitet von einem Moderator:
Ziemlich unaufgeräumt. Für so ein Graues Gitter braucht man eigentlich auch kein Image. Das kann man ja per Hand malen. Im Zweifelsfall ein paar "Border"s um einzelne Unterpanel machen. Aber ganz nebenbei: Ich sehe im Moment nicht, wo dieses ImageIcon 'a' überhaupt verwendet wird... ?!
 
Hi MArco, ja tut mir leid mit der Ordnung 😳

Das Image wird in der paintComponent-Methode verwendet.

Das würde ich auch gerne erstmal beibehalten, da blick ich nämlich gerade durch. Jetzt wieder Zeichen erfordert weitere Studien ;-)

Die kommen noch aber es scheint ja bei der Eingabe auch zu gehen.
 
Oh ja, ich hatte nur nach "a " und " a" gesucht - ist halt scheiße mit solchen Variablennamen 😉 Ein KSKB würde das ganze erheblich beschleunigen...
 
Hi, ein kurzes SKB geht leider nicht 😀

Oder andersrum gesagt, ich kann mich heute mal dran setzen. Aber letzendlich muss die Eingabe der Ausgabe ein int[9][9] übergeben.
 
Kommt drauf an, wie ... ach naja.

Im SudokuAusgabeGui ist paintComponent überschrieben. Dieses Panel (SudokuAusgabeGui) wird aber nirgendwo angezeigt. Es wird nur ein neuer Frame erstellt, in dem dann das Loesungspanel angezeigt wird. DORT müßte paintCompnent überschrieben sein. Aber das ist nur Symptombekämpfung - orderntlicher wird es dadurch nicht.
 
Aller Anfang ist schwer. Danke dir, ich werde es testen.

Yeah, das "Symptom" ist weg, ich danke dir Marco. 🙂
 
Zuletzt bearbeitet:

Zurück
Oben