I am looking to develop a word guessing game for JAVA but I am having a bit of difficulty developing the GUI. I am not trying to develop a simple GUI that just using one text field, I would like to develop one that is more mobile-like so to say. Thus I would like to white-boxes show up as place holders for the characters in the word. It would something like the image below.
Essentially players will be able to drag and drop characters from below (I'll probably have them be buttons or something) into the place holder boxes to be compared to the character of the word at that location. I have tried making an array list of text fields but that failed horribly. Anyone have any suggestions on how to proceed?
Updated as per answer provided by MadProgrammer
After using some of MadProgrammer's code I came up with the following package structure for my views package.
> Views
>> GameBoard.java
>> HighScorePanel.java
>> MainPanel.java
>> ScorePanel.java
>> StatisticPanel.java
>> TimerPanel.java
>> ViewConfig.java
>> WordPanel.java
Essentially just a bunch of panels that are put together in the GameBoard.java class. The main issues that I am having is with the MainPanel.java class, and keeping the aspect ratios. So below is an image of the view so far, it looks half decent but the word hint & category are right up against the text fields, and the text fields not wide enough.
If I were to enlarge this frame, the spacing between the components would stay exactly the same and would not scale up. So essentially I looking for a way to dynamically set the spacing between components. I have placed the code for GameBoard.java, MainPanel.java and StatisticPanel.java below. GameBoard is composed of MainPanel and StatisticsPanel. StatisticsPanel is composed of ScorePanel, TimerPanel and HighScorePanel. Finally MainPanel is composed of the bits that MadProgrammer suggested earlier.
GameBoard.java
package views;
import java.awt.BorderLayout;
import javax.swing.JFrame;
public class GameBoard extends JFrame{
private StatisticsPanel sp = new StatisticsPanel();
private MainPanel mp = new MainPanel();
public GameBoard() {
// set the title for the game board
setTitle(ViewConfig.DEFAULT_GAME_TITLE);
// add panel components to board
add(sp, BorderLayout.PAGE_START);
add(mp, BorderLayout.CENTER);
// set the board size
setSize(ViewConfig.DEFAULT_FRAME_WIDTH, ViewConfig.DEFAULT_FRAME_HEIGHT);
// set the default close operation
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
GameBoard gb = new GameBoard();
// set visible
gb.setVisible(true);
}
}
StatisticsPanel.java
package views;
import java.awt.FlowLayout;
import javax.swing.JPanel;
public class StatisticsPanel extends JPanel {
private ScorePanel sp = new ScorePanel();
private TimerPanel tp = new TimerPanel();
private HighScorePanel hsp = new HighScorePanel();
protected StatisticsPanel() {
// Create a layout for the panel, flow layout in this case as each component should line up
// horizontally
FlowLayout panelLayout = new FlowLayout(FlowLayout.CENTER, (ViewConfig.DEFAULT_FRAME_WIDTH/6), 4);
// Set the panel's layout to the newly created layout
setLayout(panelLayout);
// add components
add(sp);
add(tp);
add(hsp);
}
}
MainPanel.java
package views;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class MainPanel extends JPanel {
private JButton submitAns, clearAns;
private JLabel wordHint, wordCategory;
private WordPanel wp = new WordPanel(ViewConfig.DEFAULT_GUESS_WORD.length());
protected MainPanel() {
// create the buttons to submit and clear answer
submitAns = new JButton(ViewConfig.DEFAULT_SUBMIT);
clearAns = new JButton(ViewConfig.DEFAULT_CLEAR);
// Create new default labels for the word hint and category
wordHint = new JLabel(ViewConfig.DEFAULT_WORD_HINT);
wordCategory = new JLabel(ViewConfig.DEFAULT_WORD_CATEGORY);
// Set layout manger to GridBagLayout
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.insets = new Insets(4, 4, 4, 4);
// add all components to panel with following format:
// Word Hint > Input Fields > Word Category > Buttons
add(wordHint, gbc);
add(wp, gbc);
add(wordCategory, gbc);
// Create secondary JPanel to group buttons together, give it flow layout and add button panel to parent
JPanel buttonPanel = new JPanel();
FlowLayout buttonPanelLayout = new FlowLayout(FlowLayout.CENTER, 10, 4);
buttonPanel.add(submitAns, buttonPanelLayout);
buttonPanel.add(clearAns, buttonPanelLayout);
// add button panel to parent
add(buttonPanel);
}
protected JLabel getWordHint() {
return wordHint;
}
protected void setWordHint(String wordHint) {
this.wordHint.setText(wordHint);
}
protected JLabel getWordCategory() {
return wordCategory;
}
protected void setWordCategory(String wordCategory) {
this.wordCategory.setText(wordCategory);
}
}