user3500777
user3500777

Reputation: 1

Java Swing Graphics

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

Answers (2)

user1941489
user1941489

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

Sam
Sam

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

Related Questions