Hallo zusammen,
ich habe ein Problem mit den MaskFormattern von JFormattedTextfield'ern. Bzw vielleicht liegt es gar nicht daran.
Folgendes Prinzip: Wie ihr schon im Thread Thema lesen könnt sind wir dabei eine Sudoku GUI zu programmieren. Der Algorithmus werkelt einwandfrei, es geht nur noch um die GUI.
Wir haben uns dazu entschlossen, jedes einzelne Sudoku-Feld in ein JFormattedTextfield zu schreiben. Diese 81 JFormattedTextfielder werden in ein Array geschrieben, der Name dieses Arrays ist textfields[][], es ist zweidimensional. Bei der ersten Erstellung wird die Methode createTable() aufgerufen, die Textfelder mit createTextfields erstellt. Hierbei wird gleich die Maske zugewiesen, die dann auch einwandfrei funktioniert. Jetzt aber das Problem: möchte ich ein neues Sudoku-Feld erzeugen, sprich die Funktion shuffle() wird aufgerufen, welche ausschließlich die Inhalte der Textfelder ändert, ist die Maske "futsch". Ich erstelle keine neuen Textfelder, was wahrscheinlich euer erster Gedanke ist. Komischerweise wenn ich einmal etwas in dieses Textfeld geschrieben habe (etwas unerlaubtes laut Maske), es dann verlasse und auch richtigerweise vom Textfeld auch nicht angenommen wird, funktioniert die Maske dann aber beim zweiten Editierungsversuch, wie zu Anfang, als ich das Feld neu erstellt habe. Das heißt also, die Maske ist irgendwie noch da, halt nur nicht beim ersten Editierungsversuch eines jeden Feldes. Wir wissen nicht weiter, vielleicht ihr ja.
Vielen Dank an euch jetzt schon einmal.
Ach, den Code bin ich euch ja noch schuldig:
Liebe Grüße aus Bremen
ich habe ein Problem mit den MaskFormattern von JFormattedTextfield'ern. Bzw vielleicht liegt es gar nicht daran.
Folgendes Prinzip: Wie ihr schon im Thread Thema lesen könnt sind wir dabei eine Sudoku GUI zu programmieren. Der Algorithmus werkelt einwandfrei, es geht nur noch um die GUI.
Wir haben uns dazu entschlossen, jedes einzelne Sudoku-Feld in ein JFormattedTextfield zu schreiben. Diese 81 JFormattedTextfielder werden in ein Array geschrieben, der Name dieses Arrays ist textfields[][], es ist zweidimensional. Bei der ersten Erstellung wird die Methode createTable() aufgerufen, die Textfelder mit createTextfields erstellt. Hierbei wird gleich die Maske zugewiesen, die dann auch einwandfrei funktioniert. Jetzt aber das Problem: möchte ich ein neues Sudoku-Feld erzeugen, sprich die Funktion shuffle() wird aufgerufen, welche ausschließlich die Inhalte der Textfelder ändert, ist die Maske "futsch". Ich erstelle keine neuen Textfelder, was wahrscheinlich euer erster Gedanke ist. Komischerweise wenn ich einmal etwas in dieses Textfeld geschrieben habe (etwas unerlaubtes laut Maske), es dann verlasse und auch richtigerweise vom Textfeld auch nicht angenommen wird, funktioniert die Maske dann aber beim zweiten Editierungsversuch, wie zu Anfang, als ich das Feld neu erstellt habe. Das heißt also, die Maske ist irgendwie noch da, halt nur nicht beim ersten Editierungsversuch eines jeden Feldes. Wir wissen nicht weiter, vielleicht ihr ja.
Vielen Dank an euch jetzt schon einmal.
Ach, den Code bin ich euch ja noch schuldig:
Java:
package de.szut.dqi;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.text.DecimalFormat;
import java.text.Format;
import java.text.NumberFormat;
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import javax.swing.JComponent;
import javax.swing.JFormattedTextField;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.LayoutStyle;
import javax.swing.WindowConstants;
import javax.swing.SwingUtilities;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.MaskFormatter;
import javax.swing.text.NumberFormatter;
/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit [url=http://www.cloudgarden.com]Cloud Garden (Java Resources)[/url] for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
public class GUImitPanel extends javax.swing.JFrame {
private JMenuBar jMenuBar1;
private AbstractAction newAction;
private JPanel jPanel1;
private JMenuItem New;
private JMenu jMenu1;
private JMenu jMenu2;
private Sudoku sudoku = new Sudoku();
private JFormattedTextField[][] textfields = new JFormattedTextField[9][9];
private Integer[][] gameBoard = new Integer[9][9];
/**
* Auto-generated main method to display this JFrame
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
GUImitPanel inst = new GUImitPanel();
inst.setLocationRelativeTo(null);
inst.setVisible(true);
}
});
}
public GUImitPanel() {
super();
initGUI();
}
private void initGUI() {
try {
GroupLayout thisLayout = new GroupLayout((JComponent)getContentPane());
getContentPane().setLayout(thisLayout);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
{
jPanel1 = new JPanel();
GridLayout jPanel1Layout = new GridLayout(3, 3);
jPanel1Layout.setColumns(1);
jPanel1Layout.setHgap(4);
jPanel1Layout.setVgap(4);
jPanel1.setLayout(jPanel1Layout);
//jPanel1.setBackground(Color.BLUE);
setMinimumSize(new Dimension (400, 400));
setMaximumSize(new Dimension (600, 600));
createTable();
}
thisLayout.setVerticalGroup(thisLayout.createSequentialGroup()
.addComponent(jPanel1, 0, 248, Short.MAX_VALUE));
thisLayout.setHorizontalGroup(thisLayout.createSequentialGroup()
.addComponent(jPanel1, 0, 392, Short.MAX_VALUE));
{
jMenuBar1 = new JMenuBar();
setJMenuBar(jMenuBar1);
{
jMenu1 = new JMenu();
jMenu2 = new JMenu();
jMenuBar1.add(jMenu1);
jMenuBar1.add(jMenu2);
jMenu1.setText("Game");
{
New = new JMenuItem();
jMenu1.add(New);
New.setText("New");
New.setAction(getNewAction());
}
jMenu2.setText("Help");
}
}
pack();
setSize(400, 300);
} catch (Exception e) {
e.printStackTrace();
}
}
private JPanel[][] createPanels() {
JPanel[][] panels = new JPanel[3][3];
for (int x = 0; x < 3; x++) {
for (int y= 0; y < 3; y++) {
panels[x][y] = new JPanel();
GridLayout jPanel1Layout = new GridLayout(3, 3);
panels[x][y].setLayout(jPanel1Layout);
panels[x][y].setBorder(BorderFactory.createLineBorder(Color.BLACK));
}
}
return panels;
}
private void createTextfields() {
try {
MaskFormatter mask = new MaskFormatter("#");
mask.setValidCharacters("123456789");
for (int x = 0; x < 9; x++) {
for (int y = 0; y < 9; y++) {
textfields[x][y] = new JFormattedTextField(mask);
textfields[x][y].setHorizontalAlignment(JTextField.CENTER);
textfields[x][y].setFont(new java.awt.Font("Dialog", 0, 28));
}
}
} catch (Exception e) {
System.out.println(e);
}
}
private void createTable() {
sudoku.shuffle();
gameBoard = sudoku.getGameBoard();
JPanel[][] panels = createPanels();
createTextfields();
try {
for (int x = 0; x < 9; x++) {
for (int y = 0; y < 9; y++) {
if (gameBoard[x][y] != null) {
textfields[x][y].setText(gameBoard[x][y].toString());
textfields[x][y].setEditable(false);
textfields[x][y].setBackground(Color.LIGHT_GRAY);
} else {
textfields[x][y].setEditable(true);
}
}
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
jPanel1.add(panels[i][j]);
for (int x = 0; x < 3; x++) {
for (int y = 0; y < 3; y++) {
panels[i][j].add(textfields[x+i*3][y+j*3]);
}
}
}
}
} catch (Exception e) {
System.out.println(e);
}
}
private void shuffle() {
System.out.println("hallo");
sudoku.shuffle();
gameBoard = sudoku.getGameBoard();
//createTextfields();
System.out.println(textfields[0][0].getText().toString());
for (int x = 0; x < 9; x++) {
for (int y = 0; y < 9; y++) {
if (gameBoard[x][y] != null) {
System.out.println("if");
textfields[x][y].setText(gameBoard[x][y].toString());
textfields[x][y].setEditable(false);
textfields[x][y].setBackground(Color.LIGHT_GRAY);
} else {
System.out.println("else");
textfields[x][y].setText("leer");
textfields[x][y].setEditable(true);
textfields[x][y].setBackground(Color.WHITE);
}
textfields[x][y].setHorizontalAlignment(JTextField.CENTER);
textfields[x][y].setFont(new java.awt.Font("Dialog", 0, 28));
}
}
}
private AbstractAction getNewAction() {
if(newAction == null) {
newAction = new AbstractAction("New", null) {
public void actionPerformed(ActionEvent evt) {
shuffle();
}
};
}
return newAction;
}
}
Liebe Grüße aus Bremen