I've been trying to setup this border layout for hours. I've looked up How to Use BorderLayout on the Java website but I still haven't gotten it.
I've included my code below for review and to make it easier to see how I am trying to use the BorderLayout function.
How do I setup a border layout on JL3?
class GameStructure {
private String []wordList = {"computer","java","activity","alaska","appearance","article",
"automobile","basket","birthday","canada","central","character","chicken","chosen",
"cutting","daily","darkness","diagram","disappear","driving","effort","establish","exact",
"establishment","fifteen","football","foreign","frequently","frighten","function","gradually",
"hurried","identity","importance","impossible","invented","italian","journey","lincoln",
"london","massage","minerals","outer","paint","particles","personal","physical","progress",
"quarter","recognise","replace","rhythm","situation","slightly","steady","stepped",
"strike","successful","sudden","terrible","traffic","unusual","volume","yesterday"};
private JTextField tf;
private JLabel jl2;
public void window() {
ImageIcon ic = new ImageIcon("hangman.png");
JFrame gameFrame = new JFrame();
JPanel jp = new JPanel();
JPanel jpLets = new JPanel();
JPanel jpBlank = new JPanel();
JPanel imgPane = new JPanel();
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
panel2.setLayout(new BorderLayout());
jpLets.setLayout(new BoxLayout(jpLets, BoxLayout.Y_AXIS));
panel1.setLayout(new BorderLayout());
panel1.setOpaque(false);//!!
//jp.setBorder(BorderFactory.createTitledBorder(""));
tf = new JTextField(1);
JLabel img = new JLabel(ic, JLabel.CENTER);
JLabel jl = new JLabel("Enter a letter", JLabel.CENTER);
jl2 = new JLabel("Letters used: ", JLabel.CENTER);
JLabel jl3 = new JLabel("__ ", JLabel.CENTER);
jl.setFont(new Font("Rockwell", Font.PLAIN, 20));
tf.setFont(new Font("Rockwell", Font.PLAIN, 20));
jl2.setFont(new Font("Rockwell", Font.PLAIN, 20));
imgPane.add(img, BorderLayout.CENTER);
jp.add(jl);
jp.add(tf);
jpLets.add(jl2);
jpBlank.add(jl3);
//jpMain.add(imgPane, BorderLayout.CENTER);
panel1.add(jp, BorderLayout.NORTH);
panel1.add(jpLets, BorderLayout.SOUTH);
panel1.add(imgPane);
panel2.add(panel1, BorderLayout.CENTER);
panel2.add(jpBlank, BorderLayout.PAGE_END);
gameFrame.setTitle("Hangman");
gameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gameFrame.setIconImage(
new ImageIcon("Hangman-Game-grey.png").getImage());
gameFrame.setResizable(false);
gameFrame.add(panel2);
gameFrame.setSize(600, 600);
gameFrame.setLocationRelativeTo(null);
gameFrame.setVisible(true);
int j = 0;
int []length = new int[64];
for(j = 0; j<64; j++) {
length[j] = wordList[j].length();//gets length of words in wordList
}//end for
int l = 0;
String line = "";
//create line first then put into .setText
for(int m = 0; m<length[l]; m++) {
line += "__ ";
l++;
}//end for
jl3.setText(line);
tf.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {//when enter key pressed
JTextField tf = (JTextField)e.getSource();
String letter = tf.getText();
jl2.setText(jl2.getText() + letter + " ");//sets jlabel text to users entered letter
}//end actionPerformed method
});
}//end userInput method
}
public class GameMain {
public static void main(String[] args) {
GameStructure game = new GameStructure();
game.window();
}
}
First of all, let me commend you on actually looking at that tutorial I linked you yesterday and putting effort into learning :)
Here's a couple things I see.
Here, you're trying to use a BorderLayout for a JLabel. Generally you want to use the LayoutManagers with containers, (JPanels, JFrames, JDialogs, JApplets). Get rid of the code below.
Also here, With all your
jp.add()
's.I'm assuming you want to use a BorderLayout, but there was no BorderLayout specified for the
jp
Panel. By default, if you don't specify a LayoutManager, JPanel will give you aFlowLayout
Keep in mind, when you assign a
BorderLayout
to a container, you want to make sure every component you add to it, has a Layout position specified. No position should be used more than once. Also, aBorderLayout.CENTER
generally should always be used. (e.g. if you only have two components in the panel, useBorderLayout.SOUTH
,BorderLayout.CENTER
).Also, you should learn to nest Layout with multiple Panels to get your desired result. Here's a simple example. Say you have two buttons and a Image Label
I want the layout to look like this
First thing I want to do is add the buttons to a separate JPanel. Then wrap the label in a JPanel (not necessary, but I like using panels);
Then I'm going to wrap the two panels with another panel with a BorderLayout
So my final panel would look like this
Let's say you came up with another panel you wanted to add. You want to add this new panel to the left of the panel we just created. We only now need to use the
panel1
panel we created and wrap that panel and new panel in another panelSee how the layout and panel have been. This is great way to handle laying out components
You are not adding the jp to the gameFrame nor the jp2. Either way you add many components to the jp panel, which is not set as a BorderLayout (so, by default it is set to FlowLayout) and then you just add it to the jp2, which is set to BorderLayout, but has only two components.
So, try to add the following line between these two (existing) lines: