Swing Sudoku

Status
Nicht offen für weitere Antworten.

scaary

Bekanntes Mitglied
Hi.

Ich soll ne GUI fuer nen Sudokuaehnliches Programm erstellen.

Das Klappt soweit auch ganz gut (fuer mein erstes Swing Projekt).
Jetzt bin ich allerdings noch etwas an meine Grenzen gestossen und habe folgende Frage:

Fuer die Felder, die das Sudoku darstellen, hab ich folgenden Code erstellt:

Java:
	private static void addGameField(JFrame frame, int size) {
		JPanel gameField = new JPanel(new GridLayout(size, size));
		for (int i = 0; i < size; ++i) {
			for (int j = 0; j < size; ++j) {

				JLabel label = new JLabel((i + ", " + j), Label.LEFT);
				label.setBorder(BorderFactory.createEtchedBorder());
				gameField.add(label);
			}
		}
		gameField.setVisible(true);
		frame.add(gameField, BorderLayout.CENTER);
		frame.repaint();
	}


So, meine Frage ist jetzt:
Wie kann ich mit nem Rechtsklick nen JPopupMenu aufrufen, in dem die Zahlen von 1 bis (bsp) 6 erscheinen.
Davon kann ich dann eine Auswaehlen, die in mein label eingefuegt und anschliessend angezeigt wird.

Wie genau realisier ich, dass der Rechtsklick auf ein Panel registriert wird, und dass dann nur das Panel mit der entsprechenden Zahl belegt wird?

Vielen Dank ^^
 

Ebenius

Top Contributor
Wie wäre sowas:
Java:
    private static void addGameField(JFrame frame, int size) {
        final JPopupMenu menu = new JPopupMenu();
        final String[] values = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "---" };
        for (String s : values) {
          menu.add(new JMenuItem(new AbstractAction(s) {
            public void actionPerformed(ActionEvent e) {
              final Component c = (Component) e.getSource();
              final JPopupMenu menu = (JPopupMenu) SwingUtilities.getAncestorOfClass(JPopupMenu.class, c);
              final JLabel label = (JLabel) menu.getInvoker();
              label.setText((String) getValue(NAME));
            }
          }));
        }
        JPanel gameField = new JPanel(new GridLayout(size, size));
        for (int i = 0; i < size; ++i) {
            for (int j = 0; j < size; ++j) {
 
                JLabel label = new JLabel((i + ", " + j), Label.LEFT);
                label.setBorder(BorderFactory.createEtchedBorder());
                gameField.add(label);
                label.setComponentPopupMenu(menu);
            }
        }
        gameField.setVisible(true);
        frame.add(gameField, BorderLayout.CENTER);
        frame.repaint();
    }
BTW: Tausch mal in Zeile 6 bei Dir [c]Label.LEFT[/c] durch [c]SwingConstants.LEFT[/c] aus. Nicht die AWT-Komponenten benutzen; nicht mal dafür. :)

Ebenius
 

scaary

Bekanntes Mitglied
Hi, ahhhh, okay, habs verstanden, vielen lieben Dank ^^

Damit ich das Board nciht so zumuellen, schreib ich meine naechste Frage direkt hier rein:



Und zwar hab ich das Spielfeld jetzt eingelesen (ist einfach nen zweidimensionales array), allerdings hab ich das noch nicht in der GUI.

Wie genau setzt ich jetzt die Werte eines einzelnen Feldes / JLabels meinen Wuenschen entsprechend (also nicht Rechtsklickmaessig, sondern mein Programm soll das machen).

Ich hatte jetzt an sowas in der Art gedacht:

[Java]
for (int row = 0; row < board.length; ++row) {
for (int col = 0; col < board.length; ++col) {

Label[row][col] = board[row][col];
}
}
[/Java]

Ist jetzt natuerlich nur beispielhaft (da ich ja nicht weiss, wies richtig ist)

Vielen Dank
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben