Reputation: 1
I've written a code in java that solves sudokus and I used Java Applet for designing it. Now, I'm trying to use Java Swing to make it look better and to add some features like "saving" a sudoku board etc. Unfortunately, I'm not too familiar with Java Swing and I'm having some trouble using Graphics(to draw the board 9x9). I also don't understand why I can't extend JFrame and JPanel at the same class.
import java.applet.*;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
import java.net.URL;
import java.util.Scanner;
class Sudoku2 extends JPanel implements ActionListener, MouseListener,
ItemListener {
public JPanel createContentPane() {
JPanel GUI = new JPanel();
GUI.setLayout(null);
JPanel titlePanel = new JPanel();
titlePanel.setLayout(null);
titlePanel.setLocation(10, 0);
titlePanel.setSize(250, 30);
GUI.add(titlePanel);
JPanel scorePanel = new JPanel();
scorePanel.setLayout(null);
scorePanel.setLocation(10, 40);
scorePanel.setSize(250, 30);
GUI.add(scorePanel);
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(null);
buttonPanel.setLocation(0, 0);
buttonPanel.setSize(300, 200);
GUI.add(buttonPanel);
JButton solve = new JButton("Solve");
solve.setLocation(20, 100);
solve.setSize(100, 30);
buttonPanel.add(solve);
JButton clear_digit = new JButton("Clear Digit");
clear_digit.setLocation(20, 140);
clear_digit.setSize(100, 30);
buttonPanel.add(clear_digit);
GUI.setOpaque(true);
return GUI;
}
public JMenuBar createMenuBar() {
JMenuBar menuBar = new JMenuBar();
JMenu Menu = new JMenu("File");
menuBar.add(Menu);
JMenuItem new1 = new JMenuItem("New");
new1.addActionListener(this);
JMenuItem load = new JMenuItem("Load");
load.addActionListener(this);
JMenuItem save1 = new JMenuItem("Save");
save1.addActionListener(this);
JMenuItem save2 = new JMenuItem("Save As...");
save2.addActionListener(this);
Menu.add(new1);
Menu.add(load);
Menu.add(save1);
Menu.add(save2);
return menuBar;
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("Sudoku Solver");
Sudoku2 demo = new Sudoku2();
frame.setJMenuBar(demo.createMenuBar());
frame.setContentPane(demo.createContentPane());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 500);
frame.setVisible(true);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawLine(50, 50, 100, 100);
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
public void actionPerformed(ActionEvent e) {
}
public void itemStateChanged(ItemEvent e) {
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
`
Upvotes: 0
Views: 394
Reputation:
You can't extend JFrame and JPanel in one class because Java does not allow multiple inheritance.
If you are unfamiliar with Swing Graphic, you should save yourself the trouble from graphic painting.
You could do something like this to make your life easier.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SudokuBoard extends JPanel implements
ActionListener, MouseListener, ItemListener {
private JPanel board;
JTextField[] numberFields;
public SudokuBoard() {
super();
numberFields = new JTextField[81];
board = createContentPane();
}
public JPanel getBoard() {
return board;
}
private JPanel createContentPane() {
JPanel board = new JPanel();
board.setLayout(new GridLayout(9, 9, 1, 1));
for (int i = 0; i < numberFields.length; i++) {
numberFields[i] = new JTextField();
numberFields[i].setHorizontalAlignment(JTextField.CENTER);
numberFields[i].setFont(new Font("Ariel", Font.BOLD, 25));
numberFields[i].setText((i % 9)+1+"");
//set border
if ((i+1) % 3 == 0) {
numberFields[i].setBorder(BorderFactory.createMatteBorder(1, 1, 1, 5, Color.black));
}
if (i > 17 && i < 27) {
numberFields[i].setBorder(BorderFactory.createMatteBorder(1, 1, 5, 1, Color.black));
}
if (i > 44 && i < 54) {
numberFields[i].setBorder(BorderFactory.createMatteBorder(1, 1, 5, 1, Color.black));
}
board.add(numberFields[i]);
}
numberFields[20].setBorder(BorderFactory.createMatteBorder(1, 1, 5, 5, Color.black));
numberFields[23].setBorder(BorderFactory.createMatteBorder(1, 1, 5, 5, Color.black));
numberFields[26].setBorder(BorderFactory.createMatteBorder(1, 1, 5, 5, Color.black));
numberFields[47].setBorder(BorderFactory.createMatteBorder(1, 1, 5, 5, Color.black));
numberFields[50].setBorder(BorderFactory.createMatteBorder(1, 1, 5, 5, Color.black));
numberFields[53].setBorder(BorderFactory.createMatteBorder(1, 1, 5, 5, Color.black));
return board;
}
public JMenuBar createMenuBar() {
JMenuBar menuBar = new JMenuBar();
JMenu Menu = new JMenu("File");
menuBar.add(Menu);
JMenuItem new1 = new JMenuItem("New");
new1.addActionListener(this);
JMenuItem load = new JMenuItem("Load");
load.addActionListener(this);
JMenuItem save1 = new JMenuItem("Save");
save1.addActionListener(this);
JMenuItem save2 = new JMenuItem("Save As...");
save2.addActionListener(this);
Menu.add(new1);
Menu.add(load);
Menu.add(save1);
Menu.add(save2);
return menuBar;
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("Sudoku Solver (Try Save)");
SudokuBoard demo = new SudokuBoard();
frame.setJMenuBar(demo.createMenuBar());
frame.setContentPane(demo.getBoard());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 500);
frame.setVisible(true);
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("Save")) {
int[][] numbers = new int[9][9];
int c = 0;
for(int i = 0; i < numbers.length; i++) {
for (int j = 0; j < numbers[i].length; j++) {
//check for non-int
numbers[i][j] = Integer.parseInt(numberFields[c].getText());
c++; //awesome!
}
}
for(int i = 0; i < numbers.length; i++) {
System.out.print("[");
for (int j = 0; j < numbers[i].length; j++) {
System.out.print(numbers[i][j]+" ");
}
System.out.println("]");
}
//save this 2-d array
System.out.println("Saving...");
}
}
public void itemStateChanged(ItemEvent e) {
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
Upvotes: 1
Reputation: 1
I'm Pretty sure you don't need to extend both - and also you don't need to extend JPanel if you have JPanel GUI = new JPanel(); so if you get rid of extends JPanel you can extend JFrame.
Upvotes: 0