Why does this GUI shift after it updates? - java

I am working on a simple TicTacToe game with java swing and everything works properly, but whenever the GUI updates the layout changes. This happens with the buttons getting bigger when they are pressed and change to display an 'x' or an 'o' or when the entire game stops and displays a new label saying who won. I'm pretty much a beginner when it comes to programs like this, and the code itself is a huge hodgepodge of copy-pastes from programs that I have made with each separate components, so I figure that could be a reason for this issue.
Code below:
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.Timer;
import java.text.DecimalFormat;
public class test extends JFrame {
private JButton [] buttons = new JButton[9];
private char player = 'x';
private JLabel turnLabel = new JLabel("Player turn: ");
private JLabel turn = new JLabel(Character.toString(player).toUpperCase());
private JLabel winnerLabel = new JLabel("");
private JLabel timeLabel = new JLabel("");
private byte centiseconds = 0;
private byte seconds = 0;
private short minutes = 0;
private DecimalFormat timeFormatter;
private Timer timer;
/* Constructor initializes the Frame,
creates GUI components, and adds them
using a GridBagLayout. */
test() {
GridBagConstraints layoutConst; // Used to specify GUI component layout
// Set frame's title
setTitle("TicTacToe");
// Use a GridBagLayout
setLayout(new GridBagLayout());
// Create GridBagConstraints
layoutConst = new GridBagConstraints();
createObjects(layoutConst);
timer.start();
}
public void createObjects(GridBagConstraints layoutConst) {
int i = 0;
for(int r = 0; r <= 2; r++) {
for(int c = 0; c <= 2; c++) {
buttons[i] = new JButton();
buttons[i].setText(" ");
layoutConst.gridx = r;
layoutConst.gridy = c;
layoutConst.ipadx = 70;
layoutConst.ipady = 70;
add(buttons[i], layoutConst);
buttons[i].addActionListener(e -> {
layoutConst.insets = new Insets(0, 0, 0, 0);
JButton clickedBtn = (JButton) e.getSource();
clickedBtn.setText(String.valueOf(player));
clickedBtn.setEnabled(false);
if (player == 'x')
player = 'o';
else
player = 'x';
turn.setText(Character.toString(player).toUpperCase());
findWinner();
});
i++;
}
createLabels(layoutConst);
}
}
public void createLabels(GridBagConstraints layoutConst) {
layoutConst.gridx = 5;
layoutConst.gridy = 1;
layoutConst.ipady = 0;
layoutConst.ipadx = 0;
layoutConst.insets = new Insets(10, 10, 10, 10);
add(turnLabel, layoutConst);
layoutConst.gridx = 6;
layoutConst.gridy = 1;
layoutConst.gridwidth = 1;
layoutConst.insets = new Insets(0, 0, 0, 0);
add(turn, layoutConst);
layoutConst.gridx = 6;
layoutConst.gridy = 2;
layoutConst.gridwidth = 1;
layoutConst.insets = new Insets(0, 0, 0, 0);
add(winnerLabel, layoutConst);
layoutConst.gridx = 7;
layoutConst.gridy = 0;
layoutConst.insets = new Insets(0, 0, 0, 0);
add(timeLabel, layoutConst);
timeFormatter = new DecimalFormat("00");
timer = new Timer(10, new ActionListener() {
#Override
public void actionPerformed(ActionEvent e) {
if (centiseconds >= 0 && centiseconds != 100) {
centiseconds++;
}
else if(centiseconds == 100) {
seconds++;
centiseconds = 0;
}
else if(seconds == 60 && centiseconds == 100) {
minutes++;
seconds = 0;
centiseconds = 0;
}
timeLabel.setText(timeFormatter.format(minutes) + ":"
+ timeFormatter.format(seconds) + "."
+ timeFormatter.format(centiseconds));
}
});
timeLabel.setText(timeFormatter.format(minutes) + ":"
+ timeFormatter.format(seconds) + "."
+ timeFormatter.format(centiseconds));
}
public void findWinner() {
if (checkForWinner()) {
if (player == 'x') {
player = 'o';
}
else {
player = 'x';
}
winnerLabel.setText("Player " + Character.toString(player) + " wins!");
timer.stop();
}
else if (checkIfMatchDraw()) {
winnerLabel.setText("It's a draw!");
timer.stop();
}
}
public boolean checkIfMatchDraw() {
boolean gridsFull = true;
for (int i = 0; i < 9; i++) {
if (buttons[i].getText().equals(" ")) {
gridsFull = false;
}
}
return gridsFull;
}
public boolean checkForWinner() {
return checkAllRows() || checkAllColumns() || checkTheDiagonals();
}
public boolean checkAllRows() {
int i = 0;
for (int j = 0; j < 3; j++) {
if (buttons[i].getText().equals(buttons[i + 1].getText()) && buttons[i].getText().equals(buttons[i + 2].getText())
&& !buttons[i].getText().equals(" ")) {
return true;
}
i = i + 3;
}
return false;
}
public boolean checkAllColumns() {
int i = 0;
for (int j = 0; j < 3; j++) {
if (buttons[i].getText().equals(buttons[i + 3].getText()) && buttons[i].getText().equals(buttons[i + 6].getText())
&& !buttons[i].getText().equals(" ")) {
return true;
}
i++;
}
return false;
}
public boolean checkTheDiagonals() {
if (buttons[0].getText().equals(buttons[4].getText()) && buttons[0].getText().equals(buttons[8].getText())
&& !buttons[0].getText().equals(" "))
return true;
else
return buttons[2].getText().equals(buttons[4].getText()) && buttons[2].getText().equals(buttons[6].getText())
&& !buttons[2].getText().equals(" ");
}
/* Creates a Frameand makes it visible */
public static void main(String[] args) {
// Creates Frame and its components
test myFrame = new test();
// Terminate program when window closes
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Resize window to fit components
myFrame.pack();
// Display window
myFrame.setVisible(true);
}
}

Related

How can I get all the combinations of six dice that equal 7?

This is a homework assignment where I'm supposed to roll 6 dice, then pick out ANY combination of dice that make 7 and discard them all.
EX. 1,1,1,1,1,2. My score would be 0 because I have to discard all six dice.
At first I believed it was any combination of 2 dice but have now been told otherwise. My code right now reflects the 2 dice and I have no idea how to wrap my head around doing all six without just using brute force with it and writing in every single possible combination and checking for that.
private void calculateScore(){
//checks for 7's, calculates score if none, updates values
discardDieMessage = "Discard Dice. Combinations of die equals 7";
boolean noSevens = true;
//diceRoll is an array with 6 values
for(int i = 0; i<diceRoll.length;i++){
int temp = diceRoll[i];
for(int j = 0; j<diceRoll.length;j++){
if(temp + diceRoll[j] == 7){noSevens = false;}
}
}
if(noSevens){
playerScore[playerNumber] = 0;
for (int i = 0; i < diceRoll.length;i++) {
playerScore[playerNumber] += diceRoll[i];
}
playerScoreString = new String ("Your score is: " +
+ playerScore[playerNumber] +
"\nYou rolled: " + currentPlayerRolls + " time(s)");
update();
outputTextArea.setText(playerScoreString);
calculateButton.setDisable(true);
messageLabel.setText("");
}
else {
messageLabel.setText(discardDieMessage);
messageLabel.setTextFill(Paint.valueOf("red"));
}
}
UPDATE_1: This is the complete code I have so far. It's a 7's Game where a player rolls 6 dice, they must discard dice that equal 7 EX.{3,2,1,1} while the other two die are {6,6} so the remaining dice no longer are equal to 7.
//all-gui imports
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
//GUI specific controls
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.control.TextArea;
import javafx.scene.paint.Color;
//GUI specific containers
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.BorderPane;
import javafx.geometry.Pos;
import javafx.geometry.HPos;
//EventHandler Interface
import javafx.event.EventHandler;
import javafx.event.ActionEvent;
import java.util.Random;
import javafx.scene.paint.*;
import java.util.Arrays;
import java.util.stream.*;
import java.io.*;
/***************************************************************************/
public class SevensGameGUI extends Application {
//declare the scene and main stage
private Stage primaryStage;
private Scene scene;
//declare the handler
private SevensGameHandler handler;
//declare panes going to be used
private BorderPane mainPane;
private GridPane topPane;
private GridPane centerPane;
private GridPane outputPane;
private HBox bottomPane;
//declare up labels, boxes, buttons, and textAreas
private Button rollButton;
private Button calculateButton;
private Button endButton;
private Button[] discardButton;
private Label playerNumberLabel;
private Label totalPlayersLabel;
private Label rollNumberLabel;
private Label maxRollLabel;
private TextField[] diceTextField;//Dice TextFields
private TextField playerNumberTextField; //What player is currently playing
private TextField totalPlayersTextField;
private TextField rollNumberTextField; //What roll the player is on
private TextField maxRollTextField; //The total rolls a player has availiable
private Label messageLabel; //Display error
private TextArea outputTextArea;
//setting up program-specfic variables
private int MAX_THROWS = 3;
private int[] playerScore;
private int[] diceRoll;
private int[] discardDie;
private int DICE_COUNT;
private int playerNumber;
private int firstPlayerRolls;
private int currentPlayerRolls;
private int winningPlayer;
Random generator = new Random();
private String cannotRollMessage = "";
private String playerScoreString = "";
private String discardDieMessage = "";
/***************************************************************************/
public void start(Stage primaryStage) {
startUP();
sculptGUI();
prepareGame();
}
/***************************************************************************/
private class SevensGameHandler implements EventHandler<ActionEvent>{
public void handle(ActionEvent ae){
if(ae.getSource() == rollButton){
rollDice();
}else if(ae.getSource() == calculateButton){
calculateScore();
}else if(ae.getSource() == endButton){
nextPlayer();
}
for (int i = 0; i < discardButton.length; i++){
if(ae.getSource() == discardButton[i]){
diceRoll[i] = 0;
update();
discardButton[i].setDisable(true);
}
}
}
}//end of SevensGameHandler
/***************************************************************************/
private void rollDice(){
calculateButton.setDisable(false);
//rolls dice, shows updated values
for (int i = 0; i < diceRoll.length; i++) {
//this rolls the dice 6 times and checks if the button is disabled
if(!discardButton[i].isDisable()){diceRoll[i] = (generator.nextInt(6)+ 1);}
}
//increments how many times the first player rolls
if (playerNumber == 0) {
firstPlayerRolls++;
}
currentPlayerRolls++;
//checking updated values and sends error message if so
if (currentPlayerRolls == MAX_THROWS) {
cannotRollMessage = ("Error: Player " +
(playerNumber + 1) + " cannot roll anymore!");
messageLabel.setText(cannotRollMessage);
messageLabel.setTextFill(Paint.valueOf("red"));
rollButton.setDisable(true);
}
update();
}
/***************************************************************************/
private void calculateScore(){
//checks for 7's, calculates score if none, updates values
discardDieMessage = "Discard Dice. Combinations of die equals 7";
boolean noSevens = true;
//diceRoll is an array with 6 values
for(int i = 0; i<diceRoll.length;i++){
int temp = diceRoll[i];
for(int j = 0; j<diceRoll.length;j++){
if(temp + diceRoll[j] == 7){noSevens = false;}
}
}
if(noSevens){
playerScore[playerNumber] = 0;
for (int i = 0; i < diceRoll.length;i++) {
playerScore[playerNumber] += diceRoll[i];
}
playerScoreString = new String ("Your score is: " +
+ playerScore[playerNumber] +
"\nYou rolled: " + currentPlayerRolls + " time(s)");
update();
outputTextArea.setText(playerScoreString);
calculateButton.setDisable(true);
messageLabel.setText("");
}
else {
messageLabel.setText(discardDieMessage);
messageLabel.setTextFill(Paint.valueOf("red"));
}
}
/***************************************************************************/
private void nextPlayer(){
//increments player, resets rolls and such, updates values
if (playerNumber == 0) {
MAX_THROWS = firstPlayerRolls;
}
playerNumber++;
clearBoard();
update();
calculateButton.setDisable(false);
rollButton.setDisable(false);
for (int i = 0; i < DICE_COUNT; i++){
discardButton[i].setDisable(false);
}
outputTextArea.clear();
for(int i = 0;i<playerScore.length;i++){
if(playerScore[i] > playerScore[winningPlayer]){
winningPlayer = i;
}
}
outputTextArea.appendText("\n\tPlayer " + Integer.toString(winningPlayer+1)+
" is Winning with " + Integer.toString(playerScore[winningPlayer])+" Points");
if ( playerNumber == playerScore.length){
endGame();
}
}//end of nextPlayer()
/***************************************************************************/
private void endGame(){
//sets up a seperate pane to display the winning player along with player scores
TextArea scoreArea = new TextArea();
Button closeButton = new Button("Close");
GridPane endPane = new GridPane();
scoreArea.setPrefSize(300,350);
endPane.setHgap(15);
endPane.setVgap(5);
endPane.setAlignment(Pos.CENTER);
endPane.add(scoreArea,0,0);
endPane.add(closeButton,0,1);
endPane.setHalignment(closeButton ,HPos.CENTER);
endPane.setHalignment(scoreArea ,HPos.CENTER);
Scene endScene = new Scene(endPane,500,500);
primaryStage.setScene(endScene);
primaryStage.show();
closeButton.setOnAction(e -> {
System.exit(0);
});
//output scores and player info
scoreArea.appendText("Player \t Score\n\n");
for(int i = 0;i<playerScore.length;i++){
scoreArea.appendText("Player " + Integer.toString(i+1) +"\t " +
Integer.toString(playerScore[i]) + "\n");
}
scoreArea.appendText("\n\tCongratulations Player " +
Integer.toString(winningPlayer+1) + "\n\tYOU WIN!");
}
/***************************************************************************/
private void prepareGame(){
//Prepares the game for the player to use by initializing variables
//and handlers
playerScore = new int[] {0,0,0,0,0};
diceRoll = new int[] {0,0,0,0,0,0};
discardDie = new int[] {0,0,0,0,0,0};
DICE_COUNT = 6;
playerNumber = 0;
firstPlayerRolls = 0;
currentPlayerRolls = 0;
winningPlayer =0;
update();
handler = new SevensGameHandler();
rollButton.setOnAction(handler);
calculateButton.setOnAction(handler);
endButton.setOnAction(handler);
for(int i = 0;i < discardButton.length; i++) {
discardButton[i].setOnAction(handler);
}
}
/***************************************************************************/
private void clearBoard(){
//Method used to reset and update the GUI
for (int i = 0; i < diceRoll.length; i++) {
diceRoll[i] = 0;
discardDie[i] = 0;
}
currentPlayerRolls = 0;
rollButton.setDisable(false);
messageLabel.setText("");
outputTextArea.setText("");
playerNumberTextField.setText(Integer.toString(playerNumber + 1));
totalPlayersTextField.setText(Integer.toString(playerScore.length));
rollNumberTextField.setText(Integer.toString(currentPlayerRolls));
maxRollTextField.setText(Integer.toString(MAX_THROWS));
}
/***************************************************************************/
private void update() {
//Method used to update the GUI
for (int i = 0; i < diceTextField.length; i++) {
diceTextField[i].setText(Integer.toString(diceRoll[i]));
}
outputTextArea.setText("");
calculateButton.setDisable(false);
playerNumberTextField.setText(Integer.toString(playerNumber + 1));
totalPlayersTextField.setText(Integer.toString(playerScore.length));
rollNumberTextField.setText(Integer.toString(currentPlayerRolls));
maxRollTextField.setText(Integer.toString(MAX_THROWS - currentPlayerRolls));
}
/***************************************************************************/
private void startUP() {
//Buttons
rollButton = new Button ("ROLL");
calculateButton = new Button ("CALCULATE");
endButton= new Button ("END TURN");
discardButton = new Button[6];
for (int i = 0; i < discardButton.length; i++){
discardButton[i] = new Button("Discard " + (i+1));
}
//Labels
playerNumberLabel = new Label("Player #");
totalPlayersLabel = new Label("Total Players");
rollNumberLabel = new Label("Roll #");
maxRollLabel = new Label("Remaining Rolls");
//TextFields
diceTextField = new TextField[6];
for (int k = 0; k < diceTextField.length; k++){
diceTextField[k] = new TextField("");
}
for (int j = 0; j < diceTextField.length; j++) {
diceTextField[j].setDisable(true);
}
playerNumberTextField = new TextField ();
playerNumberTextField.setDisable(true);
totalPlayersTextField = new TextField ();
totalPlayersTextField.setDisable(true);
rollNumberTextField = new TextField ();
rollNumberTextField.setDisable(true);
maxRollTextField = new TextField ();
maxRollTextField.setDisable(true);
messageLabel = new Label ();
outputTextArea = new TextArea();
topPane = new GridPane();
centerPane = new GridPane();
outputPane = new GridPane();
bottomPane = new HBox();
mainPane = new BorderPane();
}
/***************************************************************************/
private void sculptGUI() {
//setting textFields parameters
playerNumberLabel.setPrefWidth(85);
totalPlayersLabel.setPrefWidth(85);
rollNumberLabel.setPrefWidth(85);
maxRollLabel.setPrefWidth(85);
for (int i = 0; i < diceTextField.length; i++) {
diceTextField[i].setPrefWidth(50);
}
playerNumberTextField.setPrefWidth(85);
totalPlayersTextField.setPrefWidth(85);
maxRollTextField.setPrefWidth(85);
rollNumberTextField.setPrefWidth(85);
outputTextArea.setPrefSize(300,350);
//sculpting topPane with GUI elements
topPane.setHgap(15);
topPane.setVgap(5);
topPane.setPrefHeight(100);
topPane.setAlignment(Pos.CENTER);
//placement of top pane
topPane.add(playerNumberLabel, 0, 0);
topPane.add(playerNumberTextField, 0, 1);
topPane.add(totalPlayersLabel, 1, 0);
topPane.add(totalPlayersTextField, 1, 1);
topPane.add(maxRollLabel, 2, 0);
topPane.add(maxRollTextField, 2, 1);
topPane.add(rollNumberLabel, 3, 0);
topPane.add(rollNumberTextField, 3, 1);
//sculpting centerPane with GUI elements
centerPane.setHgap(20);
centerPane.setVgap(5);
centerPane.setAlignment(Pos.CENTER);
centerPane.setHalignment(messageLabel ,HPos.CENTER);
//placements in top line
centerPane.add(diceTextField[0], 0, 0);
centerPane.add(discardButton[0], 0, 1);
centerPane.add(diceTextField[1], 0, 2);
centerPane.add(discardButton[1], 0, 3);
//placement in 2nd line
centerPane.add(diceTextField[2], 1, 0);
centerPane.add(discardButton[2], 1, 1);
centerPane.add(diceTextField[3], 1, 2);
centerPane.add(discardButton[3], 1, 3);
//placement in 3rd line
centerPane.add(diceTextField[4], 2, 0);
centerPane.add(discardButton[4], 2, 1);
centerPane.add(diceTextField[5], 2, 2);
centerPane.add(discardButton[5], 2, 3);
centerPane.add(messageLabel, 0, 4, 3, 1);
//added seperate pane to house the output in one cell,
//and the dice controls in another (for proper centering)
outputPane.add(centerPane,0,0);
outputPane.add(outputTextArea, 0, 1);
outputPane.setHgap(20);
outputPane.setVgap(5);
outputPane.setAlignment(Pos.CENTER);
//sculpting bottomPane with GUI elements
bottomPane.setSpacing(25);
bottomPane.getChildren().addAll(rollButton, calculateButton, endButton);
bottomPane.setAlignment(Pos.CENTER);
bottomPane.setPrefHeight(100);
//setting the main display with seperate panes
mainPane.setTop(topPane);
mainPane.setCenter(outputPane);
mainPane.setBottom(bottomPane);
//setting up the scene and stage
scene = new Scene(mainPane, 500, 500);
primaryStage = new Stage();
primaryStage.setTitle ("Sevens Game (Craps) GUI");
primaryStage.setScene(scene);
primaryStage.show();
}//end of sculptGUI
/***************************************************************************/
}//end of SevensGameGUI

How can I organize my Java code?

The title is not my entire question. I know HOW to organize code, theoretically, but i would like some specific, USEFUL, pointers. Please read on before griping.
I'm a beginner to java and OOP (object oriented programming) and I would really like to learn how to better organize my code! Over the course of a month or two, I made a calculator program with little functions I thought of here and there with a few small jokes built into it. After looking at it a second time I realized that it is extremely poorly formatted and almost incomprehensible.If I may, I would like to ask some more experienced programmers to point me in the right direction on what I should do to fix it (for example, what things can I turn into objects, Where can I compartmentalize, etc).
Please note that this is my FIRST time posting on a forum like this so if i need to clarify something for you to help me, I've done something wrong, I'm asking for too much, please tell me so i can resolve it and i can get help. Please dont just mark this as invalid and file it away to oblivion (as often happens in stackoverflow). Also, before anyone asks, NO this is NOT homework, it is the product of my own crack at teaching myself java (probably why its not working too well).
Here is the source code:
// This is the original Calculator code without objects in a single class. not really efficient...
package randomClasses;
import java.awt.*;
import java.awt.event.*;
import java.text.DecimalFormat;
import javax.swing.*;
#SuppressWarnings("serial")
public class CalcClass
extends JFrame
implements ActionListener {
JPanel[] row = new JPanel[6];
JButton[] button = new JButton[21];
String[] buttonString = {"7", "8", "9", "+", "4", "5", "6", "-", "1", "2", "3", "*", ".", "/", "C", "v", "+/-", "=", "0", "Parabola", "x^y"};
int[] dimW = {300, 45, 100, 90, 180};
int[] dimH = {35, 40};
Dimension displayDimension = new Dimension(dimW[0], dimH[0]);
Dimension regularDimension = new Dimension(dimW[1], dimH[1]);
Dimension rColumnDimension = new Dimension(dimW[2], dimH[1]);
Dimension zeroButDimension = new Dimension(dimW[3], dimH[1]);
Dimension parabolaDimension = new Dimension(dimW[4], dimH[0]);
//formatting variables
int var = 0;
double x = 0;
String stor = "";
boolean initial = true;
//variables for Parabola function
int countEquals_parab = 0;
double Angle = 0;
double Vi = 0;
double Vx = 0;
double Vy = 0;
double T_max = 0;
double Y_displ = 0;
double X_displ = 0;
double h = 0;
double k = 0;
double a_parab = 0;
boolean parabComplete = true;
boolean parabola = false;
DecimalFormat df = new DecimalFormat("#######.#####");
//variables for addressing illegal typing issues
boolean typeNum = true;
boolean typeDot = true;
JFrame frame; //for parabolaInstructions
//original calculator variables
boolean[] function = new boolean[5];
double[] temporary = {0, 0}; //store on screen values
double result = 0; //store result
public JTextArea display = new JTextArea(1, 20);
Font font = new Font("Times new Roman", Font.BOLD, 14);
CalcClass() {
super("CalcClass");
setDesign();
setSize(380, 300);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
GridLayout grid = new GridLayout(6, 5);
setLayout(grid);
for(int i = 0; i < 5; i++) {
function[i] = false;
}
FlowLayout f1 = new FlowLayout(FlowLayout.CENTER);
FlowLayout f2 = new FlowLayout(FlowLayout.CENTER, 1, 1);
for(int i = 0; i < 6; i++) {
row[i] = new JPanel();
}
row[0].setLayout(f1);
for(int i = 1; i < 6; i++) {
row[i].setLayout(f2);
}
for(int i = 0; i < 21; i++) {
button[i] = new JButton();
button[i].setText(buttonString[i]);
button[i].setFont(font);
button[i].addActionListener(this);
}
display.setFont(font);
display.setEditable(false);
display.setPreferredSize(displayDimension);
for(int i = 0; i < 14; i++) {
button[i].setPreferredSize(regularDimension);
}
for(int i = 14; i < 18; i++) {
button[i].setPreferredSize(rColumnDimension);
}
button[18].setPreferredSize(zeroButDimension);
button[19].setPreferredSize(parabolaDimension);
button[20].setPreferredSize(rColumnDimension);
row[0].add(display);
add(row[0]);
for(int i = 0; i < 4; i++) {
row[1].add(button[i]);
}
row[1].add(button[14]);
add(row[1]);
for(int i = 4; i < 8; i++) {
row[2].add(button[i]);
}
row[2].add(button[15]);
add(row[2]);
for(int i = 8; i < 12; i++) {
row[3].add(button[i]);
}
row[3].add(button[16]);
add(row[3]);
row[4].add(button[18]);
for(int i = 12; i < 14; i++) {
row[4].add(button[i]);
}
row[4].add(button[17]);
add(row[4]);
row[5].add(button[19]);
row[5].add(button[20]);
add(row[5]);
setVisible(true);
}
public void getSqrt() {
stor = "";
initial = true;
try {
double value = Double.parseDouble(display.getText());
if(value == -100) {
format("John's Girlfriend");
} else {
value = Math.sqrt(Double.parseDouble(display.getText())); //create a value for variable, and use Maths square root to find the value
format(Double.toString(value)); //Sets display to new value
}
} catch(NumberFormatException e) {
}
typeDot = false;
typeNum = false;
}
public void getPosNeg() {
stor = "";
initial = true;
try {
double value = Double.parseDouble(display.getText()); //again creating a variable for current value
if(value != 0) { //if value is not equal to zero
value = (-1) * value; //multiplied by -1 to change the sign
format(Double.toString(value)); //Sets display to new value
} else {
}
} catch(NumberFormatException e) {
}
}
public void getResult() {
temporary[1] = Double.parseDouble(display.getText());
String temp0 = Double.toString(temporary[0]);
String temp1 = Double.toString(temporary[1]);
try {
if(temp0.contains("-")) {
String[] temp00 = temp0.split("-", 2);
temporary[0] = (Double.parseDouble(temp00[1]) * -1);
}
if(temp1.contains("-")) {
String[] temp11 = temp1.split("-", 2);
temporary[1] = (Double.parseDouble(temp11[1]) * -1);
}
} catch(ArrayIndexOutOfBoundsException e) {
}
try {
functions();
clear();
format(Double.toString(result));//display has a result
for(int i = 0; i < 5; i++) {
function[i] = false; //set all functions to false
}
} catch(NumberFormatException e) {
}
typeNum = false;
}
public void functions() {
if(function[2] == true) { //multiplication
result = temporary[0] * temporary[1];
} else if(function[3] == true) { //division
result = temporary[0] / temporary[1];
} else if(function[0] == true) { //addition
result = temporary[0] + temporary[1];
} else if(function[1] == true) { //subtraction;
result = temporary[0] - temporary[1];
} else if(function[4] == true) {
result = Math.pow(temporary[0], temporary[1]);
} else {
result = temporary[1];
}
}
double a_quadratic = 0;
double b = 0;
double c = 0;
double x1 = 0;
double x2 = 0;
double discr = 0;
int countEquals_quadratic = 0;
public void quadraticFormula() {
if(countEquals_parab == 0) {
a_quadratic = Double.parseDouble(display.getText());
clear();
display.setText("b = ");
}
if(countEquals_parab == 1) {
b = Double.parseDouble(display.getText());
display.setText("c = ");
}
if(countEquals_parab == 2) {
c = Double.parseDouble(display.getText());
discr = (Math.pow(b, 2) - 4 * a_quadratic * c); //stores the value of the discriminant
if(discr >= 0) {
x1 = (-b + Math.sqrt(b * b - 4 * a_quadratic * c)) / (2 * a_quadratic);
x2 = (-b - Math.sqrt(b * b - 4 * a_quadratic * c)) / (2 * a_quadratic);
}
}
}
public void parabolaButton() {
double G = 9.81;
if(countEquals_parab == 0) {
Vi = Double.parseDouble(display.getText());
clear();
display.setText("Angle of release: ");
}
if(countEquals_parab == 1) {
Angle = Double.parseDouble(display.getText());
if((Angle > 90.0) || (Angle < 0.0)) {
display.setText("Sorry, not a valid angle");
countEquals_parab = 3;
} else {
Angle = (Math.PI / 180.0) * Angle; //converting degrees into radians
Vx = Vi * Math.cos(Angle); //Calculating x component
Vy = Vi * Math.sin(Angle); //Calculating y component
//Finding time
T_max = Vy / G; //time to max height
//Calculating vertex coordinates
Y_displ = (Vy * Vy / (2 * G));
X_displ = Vx * T_max;
//finding a
a_parab = (-Y_displ) / (X_displ * X_displ);
display.setText("The equation of the parabola is \ny = " + df.format(a_parab) + "(x - " + df
.format(h) + ")^2 + " + df.format(k));
}
}
if(countEquals_parab == 2) {
display.setText("Time to get to max height = " + df.format(T_max));
}
if(countEquals_parab == 3) {
clearFunction();
countEquals_parab = -1;
parabola = false;
parabComplete = true;
}
countEquals_parab++;
}
public void var() {
var++;
if(var > 8) {
var = 1;
}
if(var == 1) {
format("x");
}
}
public final void setDesign() {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch(Exception e) {
}
}
public void format(String get) {
//get stores the incoming values temporarily
//get is transferred to a new value for permanent storage
//print the permanent storage value
//new number is added, stored temporarily in get
//get is added to permanent storage
//print permanent storage value
double spaceFix = 0;
if(initial == true) {
stor = get;
initial = false;
} else if(initial == false) {
stor = stor + get;
}
spaceFix = stor.length() / 4;
int numberOfSpaces = 56 - stor.length() + (int) spaceFix;
String format = String.format("%" + numberOfSpaces + "s", stor);
display.setText(format);
}
#Override
public void actionPerformed(ActionEvent ae) {
if(ae.getSource() == button[0]) {
numberButtons("7");
}
if(ae.getSource() == button[1]) {
numberButtons("8");
}
if(ae.getSource() == button[2]) {
numberButtons("9");
}
if(ae.getSource() == button[3]) {
operatorButtons(0); //add function[0]
}
if(ae.getSource() == button[4]) {
numberButtons("4");
}
if(ae.getSource() == button[5]) {
numberButtons("5");
}
if(ae.getSource() == button[6]) {
numberButtons("6");
}
if(ae.getSource() == button[7]) {
operatorButtons(1); //subtract function[1]
}
if(ae.getSource() == button[8]) {
numberButtons("1");
}
if(ae.getSource() == button[9]) {
numberButtons("2");
}
if(ae.getSource() == button[10]) {
numberButtons("3");
}
if(ae.getSource() == button[11]) {
operatorButtons(2); //multiplication function[2]
}
if(ae.getSource() == button[12]) {
if(typeDot == false) {
} else {
numberButtons(".");
typeDot = false;
}
}
if(ae.getSource() == button[13]) {
operatorButtons(3); //divide function[3]
}
if(ae.getSource() == button[14]) {
clearFunction();
parabola = false;
parabComplete = true;
}
if(ae.getSource() == button[15]) {
getSqrt();
}
if(ae.getSource() == button[16]) {
getPosNeg();
}
if((ae.getSource() == button[17]) && display.getText().equals("")) {
} else if((ae.getSource() == button[17]) && (parabola == false)) {
getResult();
} else if((ae.getSource() == button[17]) && (parabola == true)) {
parabolaButton();
}
if(ae.getSource() == button[18]) {
numberButtons("0");
}
if(ae.getSource() == button[19]) {
clearFunction();
parabolaInstructions();
parabola = true;
parabComplete = false;
display.setText("Initial velocity: ");
}
if(ae.getSource() == button[20]) {
operatorButtons(4);//powerFunction();
}
}
public void parabolaInstructions() {
//Create the dialog.
final JDialog dialog = new JDialog(frame, "How to use the Parabola function");
//Add contents to it. It must have a close button,
//since some L&Fs (notably Java/Metal) don't provide one
//in the window decorations for dialogs.
JLabel label = new JLabel("<html><p align=center>" + "Step 1: Type in the initial velocity and press the \"=\" button<br>" + "Step 2: Type in the angle of Release (make sure that it is between 0 and 90)<br>" + "Step 3: Press the \"=\" button to scroll through the results<br>" + "Step 4: Profit");
label.setHorizontalAlignment(JLabel.CENTER);
Font font = label.getFont();
label.setFont(label.getFont().deriveFont(font.PLAIN, 14.0f));
JButton closeButton = new JButton("Ok");
closeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dialog.setVisible(false);
dialog.dispose();
}
});
JPanel closePanel = new JPanel();
closePanel.setLayout(new BoxLayout(closePanel, BoxLayout.LINE_AXIS));
closePanel.add(Box.createHorizontalGlue());
closePanel.add(closeButton);
closePanel.setBorder(BorderFactory.
createEmptyBorder(0, 0, 5, 5));
JPanel contentPane = new JPanel(new BorderLayout());
contentPane.add(label, BorderLayout.CENTER);
contentPane.add(closePanel, BorderLayout.PAGE_END);
contentPane.setOpaque(true);
dialog.setContentPane(contentPane);
//Show it.
dialog.setSize(new Dimension(400, 200));
dialog.setLocationRelativeTo(frame);
dialog.setVisible(true);
}
public void numberButtons(String i) {
if(typeNum == false) {
display.setText("");
format(i);
} else {
format(i);
}
typeNum = true;
}
public void operatorButtons(int funct) {
if(display.getText().equals("")) {
} else {
temporary[0] = Double.parseDouble(display.getText());
function[funct] = true;
clear();
}
}
public void clearFunction() {
clear();
try {
for(int i = 0; i < 5; i++) {
function[i] = false;
}
for(int i = 0; i < 2; i++) {
temporary[i] = 0;
}
} catch(NullPointerException e) {
}
//For parabola()
Vi = 0;
Vx = 0;
Vy = 0;
T_max = 0;
Y_displ = 0;
X_displ = 0;
h = 0;
k = 0;
a_parab = 0;
}
public void clear() {
display.setText("");
stor = "";
typeDot = true;
initial = true;
}
public static void main(String[] arguments) {
CalcClass c = new CalcClass();
}
}
Ok so now you've seen my mess... I sort-of know what I should do and YES I did some research but I feel it would be much easier to learn organization through example or a nice push than it would be from reading articles that tell you ultra-hypothetical or loosely-analogous examples of what objects are. Note: I tried using methods to organize and my class looks much better than what it did (I also made the whole thing an object to be called upon at the bottom which is pretty much useless).
If you use eclipse, try:
Window > Prefferences > Java > Editor > Save Actions
Check "perform the selected actions on save", "Additional Actions" and click "Configure".
Using eclipse's Save Actions can be really useful in real life coding, but you will probably learn some neat java tricks going through the Save Actions wizard.
Java is an Object Oriented language. You need to take advantage of that fact.
Use classes to separate your code into different logical / structural components. Learn how to use OOP. Follow SOLID design and use design patterns.
Another important thing is to know your language. Start by reading basic classes javadocs and relevant sections of the java spec. I would begin with deeply understanding the different types of java (class, interface, enum and inner / nested / anonymous types) and the different modifiers (private, public, protected, static, abstract, final, default).
Some other eclipse's short cuts:
CTRL-A, CTRL-I ("indentation") will fix your code indentation.
CTRL-SHIFT-O ("organize imports") will omit redundant imports.
You might consider taking a look at Code Complete, which deals with the issues that you're concerned with here, and otherwise is just a classic in our field that every serious developer should read.
In general, when you're organizing code you should do so with a few things in mind: readability and atomicity. These two factors apply to code on every level of an application, from variable naming, routines, methods, classes, packages, and so on.
Readability is a simple idea: can a human being read this code and understand it? To gauge the readability of the code all you have to do is read it! Do variable names help the reader understand what something is? Are routines and classes properly formatted and not needlessly complex? Have you removed all code that isn't being used? Is your code written in a logical progression?
Atomicity is the idea that everything should have one purpose. A function or method should (usually) do one thing and one thing only. A class should usually be a logical grouping of related methods and fields serving some type of unique purpose, and NOT a mish-mash of unrelated stuff. A package should also contain a set of related files. Same with a project, and so on.
The main benefit of atomicity is that once you get into more involved applications it's actually much easier to debug and isolate issues in your code because you know where stuff is. For instance: I have a database access error! Good thing I have a package that's specifically defined for my database access objects.
I know when I was just getting started in the field this was something that threw me off too. It might not be until you do a lot of coding within more significant apps that you really start to understand best practices and why people build stuff a certain way.
Thanks to everyone who contributed to my problem, I completely scrapped this garbage and made it 1000 times better. I knew from the beginning it was poorly made and I wanted to fix it, I just didn't know where to start. After reading all the advice that was given, watching a few tutorials and brushing up on some simple java concepts (modifiers, jswing, etc), I ended up making a new one that is in MVC format (Yay, order and efficiency). Now all my new variables are actually meaningful (Thanks #maaartinus for helping me realize that many of my variables were poorly named and made my whole program unnecessarily complicated). Also, I tried to work on SRP (Not 100% sure if I completely did it but with the program organized it will be easy to change things) and I plan on adding units later for good practice (Thank you, #Robert Snyder). This new GUI is ugly but that can always be changed later and since It is now in MVC format the job will be easier.
Here is what I did (not finished and far from perfect but a step in the right direction):
CalcGui.java
package com.Calculator;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class CalcGui extends JFrame {
private static final long serialVersionUID = 1L;
private String[] operatorsList = { "+", "-", "*", "/", "^" };
// Row 1
private JTextField firstNumber = new JTextField(10);
private JComboBox<String> operator = new JComboBox<>(operatorsList);
private JTextField secondNumber = new JTextField(10);
private JButton calculateButton = new JButton("Calculate");
private JTextField calcSolution = new JTextField(20);
// Row 2
private JLabel sqrtSymbol = new JLabel("√");
private JTextField sqrtNumber = new JTextField(10);
private JButton sqrtCalcButton = new JButton("Calculate");
private JTextField sqrtCalcSolution = new JTextField(20);
// Row 3
private JLabel quadraticLabel1 = new JLabel("A = ");
private JTextField quadraticFirstNumber = new JTextField(5);
private JLabel quadraticLabel2 = new JLabel("B = ");
private JTextField quadraticSecondNumber = new JTextField(5);
private JLabel quadraticLabel3 = new JLabel("C = ");
private JTextField quadraticThirdNumber = new JTextField(5);
private JButton quadraticCalcButton = new JButton("Calculate");
private JLabel quadraticTextBefore = new JLabel("x =");
private JTextField firstQuadraticCalcSolution = new JTextField(3);
private JLabel quadraticTextMiddle = new JLabel("and x =");
private JTextField secondQuadraticCalcSolution = new JTextField(3);
CalcGui() {
JPanel calcPanel = new JPanel(new BorderLayout());
FlowLayout Default = new FlowLayout(FlowLayout.LEFT);
JPanel row1 = new JPanel(Default);
JPanel row2 = new JPanel(Default);
JPanel row3 = new JPanel(Default);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(650, 150);
row1.add(firstNumber);
row1.add(operator);
row1.add(secondNumber);
row1.add(calculateButton);
row1.add(calcSolution);
row2.add(sqrtSymbol);
row2.add(sqrtNumber);
row2.add(sqrtCalcButton);
row2.add(sqrtCalcSolution);
row3.add(quadraticLabel1);
row3.add(quadraticFirstNumber);
row3.add(quadraticLabel2);
row3.add(quadraticSecondNumber);
row3.add(quadraticLabel3);
row3.add(quadraticThirdNumber);
row3.add(quadraticCalcButton);
row3.add(quadraticTextBefore);
row3.add(firstQuadraticCalcSolution);
row3.add(quadraticTextMiddle);
row3.add(secondQuadraticCalcSolution);
calcPanel.add(row1, BorderLayout.NORTH);
calcPanel.add(row2, BorderLayout.CENTER);
calcPanel.add(row3, BorderLayout.SOUTH);
this.add(calcPanel);
}
// basic calculations methods
public double getFirstNumber() {
return Double.parseDouble(firstNumber.getText());
}
public String getOperator() {
return (String) operator.getSelectedItem();
}
public double getSecondNumber() {
return Double.parseDouble(secondNumber.getText());
}
public void setCalcSolution(double solution) {
calcSolution.setText(Double.toString(solution));
}
void addCalculateListener(ActionListener listenForCalcButton) {
calculateButton.addActionListener(listenForCalcButton);
}
void displayErrorMessage(String errorMessage) {
JOptionPane.showMessageDialog(this, errorMessage);
}
// Square root function methods
public double getSqrtNumber() {
return Double.parseDouble(sqrtNumber.getText());
}
public void setSqrtCalcSolution(double solution) {
sqrtCalcSolution.setText(Double.toString(solution));
}
void addSqrtCalcListener(ActionListener listenForSqrtCalcButton) {
sqrtCalcButton.addActionListener(listenForSqrtCalcButton);
}
// Quadratic formula Methods
public double getQuadraticFirstNumber() {
return Double.parseDouble(quadraticFirstNumber.getText());
}
public double getQuadraticSecondNumber() {
return Double.parseDouble(quadraticSecondNumber.getText());
}
public double getQuadraticThirdNumber() {
return Double.parseDouble(quadraticThirdNumber.getText());
}
public void setFirstQuadraticCalcSolution(double solution) {
firstQuadraticCalcSolution.setText(Double.toString(solution));
}
public void setSecondQuadraticCalcSolution(double solution) {
secondQuadraticCalcSolution.setText(Double.toString(solution));
}
void addQuadraticCalcListener(ActionListener listenForQuadraticCalcButton) {
quadraticCalcButton.addActionListener(listenForQuadraticCalcButton);
}
}
CalcModel.java
package com.Calculator;
public class CalcModel {
private double calcValue;
public void calculate(double firstNumber, double secondNumber,
String operator) {
if (operator.equals("+")) {
calcValue = firstNumber + secondNumber;
}
if (operator.equals("-")) {
calcValue = firstNumber - secondNumber;
}
if (operator.equals("*")) {
calcValue = firstNumber * secondNumber;
}
if (operator.equals("/")) {
calcValue = firstNumber / secondNumber;
}
if (operator.equals("^")) {
calcValue = Math.pow(firstNumber, secondNumber);
}
}
public double getCalcValue() {
return calcValue;
}
}
SqrtCalcModel.java
package com.Calculator;
public class SqrtCalcModel {
private double sqrtCalcValue;
public void sqrt(double number) {
sqrtCalcValue = Math.sqrt(number);
}
public double getSqrtCalcValue() {
return sqrtCalcValue;
}
}
QuadraticCalcModel.java
package com.Calculator;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class QuadraticCalcModel {
private double firstQuadraticCalcValue;
private double secondQuadraticCalcValue;
public void quadraticFormula(double a, double b, double c) {
double discriminant = (b * b) - (4 * a * c);
if (discriminant >= 0) {
firstQuadraticCalcValue = (Math.sqrt((b * b) - (4 * a * c)) + (-b))
/ (2 * a);
secondQuadraticCalcValue = (Math.sqrt((b * b) - (4 * a * c)) - (-b))
/ (2 * a);
}
else {
JFrame parent = new JFrame();
JOptionPane.showMessageDialog(parent,
"This function has no real roots.");
}
}
public double getFirstQuadraticValue() {
return firstQuadraticCalcValue;
}
public double getSecondQuadraticValue() {
return secondQuadraticCalcValue;
}
}
CalculatorControler.java
package com.Calculator;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class CalculatorController {
private CalcGui theGui;
private CalcModel theCalcModel;
private SqrtCalcModel theSqrtCalcModel;
private QuadraticCalcModel theQuadraticCalcModel;
public CalculatorController(CalcGui theGui, CalcModel theCalcModel,
SqrtCalcModel theSqrtCalcModel,
QuadraticCalcModel theQuadraticCalcModel) {
this.theGui = theGui;
this.theCalcModel = theCalcModel;
this.theSqrtCalcModel = theSqrtCalcModel;
this.theQuadraticCalcModel = theQuadraticCalcModel;
this.theGui.addCalculateListener(new CalcListener());
this.theGui.addSqrtCalcListener(new SqrtCalcListener());
this.theGui.addQuadraticCalcListener(new QuadraticCalcListener());
}
class CalcListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
double firstNumber, secondNumber = 0;
String operator;
try {
firstNumber = theGui.getFirstNumber();
operator = theGui.getOperator();
secondNumber = theGui.getSecondNumber();
theCalcModel.calculate(firstNumber, secondNumber, operator);
theGui.setCalcSolution(theCalcModel.getCalcValue());
}
catch (NumberFormatException ex) {
System.out.println(ex);
theGui.displayErrorMessage("You Need to Enter 2 Numbers");
}
}
}
class SqrtCalcListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
double number = 0;
try {
number = theGui.getSqrtNumber();
theSqrtCalcModel.sqrt(number);
theGui.setSqrtCalcSolution(theSqrtCalcModel.getSqrtCalcValue());
}
catch (NumberFormatException ex) {
System.out.println(ex);
theGui.displayErrorMessage("You Need to enter a Number");
}
}
}
class QuadraticCalcListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
double a, b, c = 0;
try {
a = theGui.getQuadraticFirstNumber();
b = theGui.getQuadraticSecondNumber();
c = theGui.getQuadraticThirdNumber();
theQuadraticCalcModel.quadraticFormula(a, b, c);
theGui.setFirstQuadraticCalcSolution(theQuadraticCalcModel
.getFirstQuadraticValue());
theGui.setSecondQuadraticCalcSolution(theQuadraticCalcModel
.getSecondQuadraticValue());
}
catch (NumberFormatException ex) {
System.out.println(ex);
theGui.displayErrorMessage("You need to enter 3 numbers.");
}
}
}
}
MVCCalculator.java
package com.Calculator;
public class MVCCalculator {
public static void main(String[] args) {
CalcGui theGui = new CalcGui();
CalcModel theCalcModel = new CalcModel();
SqrtCalcModel theSqrtCalcModel = new SqrtCalcModel();
QuadraticCalcModel theQuadraticCalcModel = new QuadraticCalcModel();
new CalculatorController(theGui, theCalcModel, theSqrtCalcModel,
theQuadraticCalcModel);
theGui.setVisible(true);
}
}

Hide a JLabel tooltip text

I am adding JLabel objects to a JPanel. Each label has a different tool tip text that I use to identify each label afterwards, the problem is that the tool tip is always showing on hover and I need it to always be hidden.
Each label has a different image icon that's why I can't use the label text.
I can't find any documentation on the label API for some function like .hidetooltip.
Edit
Each of many JLabel objects on a GridLayout holds an Image. I need to know the line and column of each image.
To hide the tool tip text to null
myComponent.setToolTipText(null);
This is described in the API for this method: "param - the string to display; if the text is null, the tool tip is turned off for this component"
EDIT: In response to your actual issue that you describe in one of your comments, there are a variety of ways association information with a JLabel. You could a) extend the class and keep instance variables defining the grid values b) use a Map key'd with the JLabel and value'd with the row/col c) use the Name of the JLabel
Each of many JLabel objects on a GridLayout holds an Image. I need to know the line and column of each image.
One way to achieve this is to store a BufferedImage[][] to check images against. E.G.
import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.net.URL;
import java.util.Random;
import javax.imageio.ImageIO;
public final class ImageArray {
int r = 8;
int c = 8;
// The images in the chess board, used to check which
// image was chosen for this place on the board.
final private BufferedImage[][] chessBoardImages = new BufferedImage[r][c];
private final int rowSprite = 2;
private final int colSprite = 6;
// Holds the tile sheet images
private final BufferedImage[] chessPieceImages =
new BufferedImage[colSprite * rowSprite];
private JComponent ui = null;
private final BufferedImage chessSpriteSheet;
ImageArray(BufferedImage chessSpriteSheet) {
this.chessSpriteSheet = chessSpriteSheet;
initUI();
}
private int getImageIndex(Image img) {
for (int i = 0; i < chessPieceImages.length; i++) {
if (chessPieceImages[i].equals(img)) {
return i;
}
}
return -1;
}
public void initUI() {
if (ui != null) {
return;
}
ui = new JPanel(new BorderLayout(4, 4));
ui.setBorder(new EmptyBorder(4, 4, 4, 4));
int w = chessSpriteSheet.getWidth();
int h = chessSpriteSheet.getHeight() / rowSprite;
int wStep = chessSpriteSheet.getWidth() / colSprite;
int hStep = chessSpriteSheet.getHeight() / rowSprite;
for (int x = 0; x < colSprite; x++) {
for (int y = 0; y < rowSprite; y++) {
chessPieceImages[x + (y * colSprite)]
= chessSpriteSheet.getSubimage(
x * wStep, y * hStep, wStep, h);
}
}
JPanel grid = new JPanel(new GridLayout(r, c));
ui.add(grid, BorderLayout.CENTER);
Random rand = new Random();
for (int x = 0; x < r; x++) {
boolean oddRow = x % 2 == 0;
for (int y = 0; y < c; y++) {
boolean oddCol = y % 2 == 0;
BufferedImage img = chessPieceImages[
rand.nextInt(colSprite * rowSprite)];
JLabel l = new JLabel(new ImageIcon(img));
chessBoardImages[x][y] = img;
l.setOpaque(true);
if ((oddRow && oddCol) || (!oddRow && !oddCol)) {
l.setBackground(Color.WHITE);
} else {
l.setBackground(Color.LIGHT_GRAY);
}
grid.add(l);
}
}
JLabel htmlLabel = new JLabel(getHtml());
htmlLabel.setHorizontalTextPosition(SwingConstants.CENTER);
htmlLabel.setVerticalTextPosition(SwingConstants.BOTTOM);
ui.add(htmlLabel,
BorderLayout.LINE_END);
}
private String getHtml() {
String style = "<style type='text/css'>"
+ "body {"
+ "font-size: 36px;"
+ "}"
+ ".white {"
+ "background-color: #FFFFFF;"
+ "}"
+ ".black {"
+ "background-color: #BBBBBB;"
+ "}"
+ "</style>";
String pre = "<html><head>%1s</head><body><table border=1 cellspacing=0>";
StringBuilder sb = new StringBuilder(String.format(pre, style));
for (int y = 0; y < r; y++) {
sb.append("<tr>");
for (int x = 0; x < c; x++) {
Image img = chessBoardImages[y][x];
final int index = getImageIndex(img);
// hack to convert index to unicode codepoint..
int unicodeOffset = ((index/colSprite)*colSprite)==0 ? colSprite : -colSprite;
int unicodeIndexOffset;
switch (index) {
case 3:
unicodeIndexOffset = 4;
break;
case 4:
unicodeIndexOffset = 3;
break;
case 9:
unicodeIndexOffset = 10;
break;
case 10:
unicodeIndexOffset = 9;
break;
default:
unicodeIndexOffset = index;
}
int unicode = 9812 + unicodeIndexOffset + unicodeOffset;
// end: hack to convert index to unicode index..
String cssClass;
boolean oddCol = x%2==1;
boolean oddRow = y%2==1;
if ((oddRow && oddCol) || (!oddRow && !oddCol)) {
cssClass = "white";
} else {
cssClass = "black";
}
sb.append(String.format(
"<td class='%1s'>&#%2s;</td>", cssClass, unicode));
}
sb.append("</tr>");
}
sb.append("</table></body></html>");
return sb.toString();
}
public JComponent getUI() {
return ui;
}
public static void main(String[] args) throws Exception {
String urlString = "http://i.stack.imgur.com/memI0.png";
final BufferedImage img = ImageIO.read(new URL(urlString));
Runnable r = new Runnable() {
#Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception useDefault) {
}
ImageArray o = new ImageArray(img);
JFrame f = new JFrame("Image Array");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationByPlatform(true);
f.setContentPane(o.getUI());
f.pack();
f.setMinimumSize(f.getSize());
f.setVisible(true);
}
};
SwingUtilities.invokeLater(r);
}
}
You should consider storing the information elsewhere. One way would be to make a class deriving from JLabel with the purpose of storing the line and column information. Then use instances of this subclass rather than use JLabel instances. They will render as a regular JLabel would, but you can retrieve the line and column information in a way that does not pop up that information in a tooltip.

action performed only once

I've got a form with gridLayout which contains 15 JButtons and one JLabel. Every button has an action and when it's fired It should show clicked!, perform some operation and show in console its position.
But it shows position in console only once - when I press any button first time. After that only clicked text appears in console.
What's the problem?
public class PuzzleUI extends JFrame {
private static final long serialVersionUID = 1L;
private int gap = 2;
private Puzzle puzzle;
private JComponent[][] itemGrid;
private JPanel controls;
public PuzzleUI(String title, int puzzles, int empty_cell) {
super(title);
puzzle = new Puzzle(puzzles, empty_cell);
itemGrid = new JComponent[puzzle.getRowSize()][puzzle.getRowSize()];
controls = new JPanel();
controls.setLayout(new GridLayout(puzzle.getRowSize(), puzzle
.getRowSize(), gap, gap));
init(this.getContentPane());
}
public void init(final Container pane) {
ActionListener al = new ActionListener() {
#Override
public void actionPerformed(ActionEvent e) {
Object ob = e.getSource();
boolean finished = false;
if (ob instanceof JButton) {
System.out.println("Clicked!");
int cnt = 0;
label: for (int i = 0; i < itemGrid.length; i++)
for (int j = 0; j < itemGrid[i].length; j++) {
if (itemGrid[i][j] == (JButton) ob) {
System.out.println(i + "-" + j); // appeared only once
finished = puzzle.swap(cnt);
break label;
}
cnt++;
}
PuzzleUI.this.init(PuzzleUI.this.getContentPane());
PuzzleUI.this.controls.repaint();
if (finished == true)
JOptionPane.showMessageDialog(
PuzzleUI.this,
"FINISHED WITH MOVE: "
+ PuzzleUI.this.puzzle.getMoves());
}
}
};
int cnt = 0;
for (int i = 0; i < itemGrid.length; i++)
for (int j = 0; j < itemGrid[i].length; j++) {
int value = puzzle.getListItem(cnt);
if (value == puzzle.getEmptyFlag())
itemGrid[i][j] = new JLabel("");
else {
JButton jb = new JButton(String.valueOf(value));
jb.addActionListener(al);
itemGrid[i][j] = jb;
}
controls.add(itemGrid[i][j]);
cnt++;
}
pane.add(controls);
}
}

Character Array needs to display in certain order and place

Trying to get the final part of this game to work. Its a hangman game, I just need it to display correct guesses where they are in the word.
This is the snippet of code of when a correct guess is given
else
{
int alreadyGuessed = guesses.indexOf(guess);
if (alreadyGuessed == -1)
{
guesses = guesses + guess + "";
jlbWord.setText("Word: " + charWord[currentGuess]);
}
else{}
}
Right now it simply shows each letter. I can also set it, so it shows each one as they are typed in but its not in the right order, which makes it much more difficult for the user to guess what the word is.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.awt.Dimension;
public class RightPanel extends JPanel implements KeyListener
{
JLabel jlbMissed, jlbWord, jlbTimer;
Color btnColor;
JComboBox jcbDifficulty;
JButton jbtStart, jbtQuit;
String[] difficulties = {"Easy", "Medium", "Hard"};
String[] words = {"First", "Next", "Hello", "World"};
char guess;
String word, guesses = "";
char[] charWord;
public static int incorrectGuesses = 0;
boolean clockIsRunning = false;
boolean gameInPlay = false;
int sec = 0;
int min = 0;
public RightPanel()
{
this.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
Random ran = new Random(); //
int rand = ran.nextInt(4); // Generates random number then selects word from words array
word = words[rand]; //
charWord = word.toCharArray();
ActionHandler actionHandler = new ActionHandler();
jlbMissed = new JLabel("Missed: ");
jlbWord = new JLabel("Word: ");
jlbTimer = new JLabel("Time: " + "0:00");
jbtStart = new JButton("Start");
jbtQuit = new JButton("Quit");
jcbDifficulty = new JComboBox();
jbtStart.addActionListener(actionHandler);
jbtQuit.addActionListener(actionHandler);
jcbDifficulty.addKeyListener(this);
jbtStart.addKeyListener(this);
for (int i = 0; i < 3; i++)
{
jcbDifficulty.addItem(difficulties[i]); // Creates Difficutly ComboBox
}
this.add(jcbDifficulty, getConstraints(0,0,1,1, GridBagConstraints.WEST));
this.add(jlbMissed, getConstraints(0,1,1,1, GridBagConstraints.WEST));
this.add(jlbWord, getConstraints(0,2,1,1, GridBagConstraints.WEST));
this.add(jlbTimer, getConstraints(0,4,1,1, GridBagConstraints.WEST));
this.add(jbtStart, getConstraints(0,6,1,1, GridBagConstraints.WEST));
this.add(jbtQuit, getConstraints(0,7,1,1, GridBagConstraints.WEST));
}
public void keyPressed(KeyEvent e){}
public void keyReleased(KeyEvent e){}
public void keyTyped(KeyEvent e)
{
guess = e.getKeyChar();
if (gameInPlay == false)
{
JOptionPane.showMessageDialog(this, "You have not started the game yet!", "Game has not Started", JOptionPane.ERROR_MESSAGE);
System.out.println("Game Not in Play");
}
else
{
if (Character.isLetter(guess))
{
if (incorrectGuesses > 11)
{
clockIsRunning = false;
gameInPlay = false;
JOptionPane.showMessageDialog(this, "You Killed Him! \nThe word was " + word, "He Ceases to Exist", JOptionPane.ERROR_MESSAGE);
jbtStart.setText("Retry?");
jbtStart.setBackground(Color.RED);
}
else
{
int currentGuess = word.indexOf(guess);
if (currentGuess == -1)
{
int alreadyGuessed = guesses.indexOf(guess);
if (alreadyGuessed == -1)
{
guesses = guesses + guess + "";
System.out.println(alreadyGuessed);
System.out.println(guesses);
String temp = jlbMissed.getText();
jlbMissed.setText(temp + guess + ", ");
incorrectGuesses++;
leftPanel.hangmanPic.setIcon(leftPanel.image[RightPanel.incorrectGuesses]);
}
else {}
}
else
{
int alreadyGuessed = guesses.indexOf(guess);
if (alreadyGuessed == -1)
{
guesses = guesses + guess + "";
jlbWord.setText("Word: " + charWord[currentGuess]);
}
else{}
}
}
}
else
JOptionPane.showMessageDialog(this, "That is not a valid guess!\n Please enter a character from A-Z", "Invalid Guess", JOptionPane.ERROR_MESSAGE);
}
}
private GridBagConstraints getConstraints(int gridx, int gridy, int gridwidth, int gridheight, int anchor)
{
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(5,5,5,5);
c.ipadx = 0;
c.ipady = 0;
c.gridx = gridx;
c.gridy = gridy;
c.gridwidth = gridwidth;
c.gridheight = gridheight;
c.anchor = anchor;
return c;
}
class ActionHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
Object source = e.getSource();
if (source == jbtStart)
{
if (clockIsRunning == true){}
else
{
if (jbtStart.getText() == "Start")
{
btnColor = jbtStart.getBackground();
clockIsRunning = true;
MyTimer timer = new MyTimer();
timer.start();
gameInPlay = true;
}
else if (jbtStart.getText() == "Retry?")
{
jbtStart.setText("Start");
jbtStart.setBackground(btnColor);
jlbTimer.setText("Time: " + "0:00");
sec = 0;
min = 0;
MyTimer timer = new MyTimer();
timer.start();
clockIsRunning = true;
gameInPlay = true;
incorrectGuesses = 0;
guesses = "";
jlbMissed.setText("Missed: ");
jlbWord.setText("Word: ");
leftPanel.hangmanPic.setIcon(leftPanel.image[RightPanel.incorrectGuesses]);
Random ran = new Random();
int rand = ran.nextInt(4);
word = words[rand];
}
}
}
else if (source == jbtQuit)
{
System.exit(0);
}
}
}
class MyTimer extends Thread
{
public void run()
{
while(true)
{
if(!clockIsRunning)
break;
try
{
Thread.sleep(1000);
}
catch (InterruptedException ecp)
{
}
if (sec == 59)
{
min++;
sec = 0;
}
else
sec++;
if(sec < 10)
jlbTimer.setText("Time:" + min+":0"+sec);
else
jlbTimer.setText("Time:" + min+":"+sec);
}
}
}
}
Yikes.
You should refactor your code and keep the guesses in a TreeSet<Character> data structure. It assures, that each character is stored only once and that an iterator returns all stored chars in ascending order.
Snippet:
Set<Character> guesses = new HashSet<Character>();
// add a guess
guesses.add('e');
guesses.add('r');
guesses.add('a');
guesses.add('e'); // will not be added, already in the set
// test
if (guesses.contains('e')) { ... }
// test if a word is "guessed"
boolean foundIt = true;
for (char c:word.toCharArray()) {
if (!guesses.contains(c)) {
foundIt = false;
break;
}
}
// foundIt is true if all chars of word have been guessed
// print
for (char c:guesses)
System.out.print(c); // prints: aer

Categories

Resources