jeffiepoo
asked on
GUI's in Java
Hey everyone, I hope some of you have a lot of experience with GUI's in Java. I've never made one. Since I'm lazy and I have this membership I thought I would ask some experts to see if anyone has anything really useful.
I need to quickly and easily make a simple GUI for a chess program I am making. It needs to be a window with a picture of the current chessboard state, and a box (kindof like the CLI) that displays info and takes in new moves and orders as string inputs (like a CLI).
Please post helpful information, recommendations from experience, simple examples, and library recommendations. Please post relevant examples based on your personal experience and recommendations. Also, anything specifically involving a picture made up of sub-pictures would be great. I.E.- how to form a chessboard graphically and simply.
Thanks Experts!
-Jeff
I need to quickly and easily make a simple GUI for a chess program I am making. It needs to be a window with a picture of the current chessboard state, and a box (kindof like the CLI) that displays info and takes in new moves and orders as string inputs (like a CLI).
Please post helpful information, recommendations from experience, simple examples, and library recommendations. Please post relevant examples based on your personal experience and recommendations. Also, anything specifically involving a picture made up of sub-pictures would be great. I.E.- how to form a chessboard graphically and simply.
Thanks Experts!
-Jeff
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
create another panel and add your label and chessboard to that
JPanel panel = new JPanel(new BorderLayout());
panel.add(BorderLayout.NOT H, new JLabel("Hello world"));
panel.add(BorderLayout.CEN TER, chessboard);
JPanel panel = new JPanel(new BorderLayout());
panel.add(BorderLayout.NOT
panel.add(BorderLayout.CEN
ASKER
When I add that code in to the exact example given, the Board now becomes blank. It doesn't seem to work.
you need to also add the panel to your gui (probably where you currently add the board)
ASKER
So i added
JPanel panel2; // to the global variables list right by chessboard, (from your last comment)
//I added this right above where the pieces (pictures) are put in, like you suggested
panel2 = new JPanel(new BorderLayout());
panel2.add(BorderLayout.NO RTH, new JLabel("Hello world"));
panel2.add(BorderLayout.CE NTER, chessBoard);
It still seems to be blank
JPanel panel2; // to the global variables list right by chessboard, (from your last comment)
//I added this right above where the pieces (pictures) are put in, like you suggested
panel2 = new JPanel(new BorderLayout());
panel2.add(BorderLayout.NO
panel2.add(BorderLayout.CE
It still seems to be blank
where do u add panel2 to your gui?
ASKER
for instance, referenceing the link above: http://www.roseindia.net/java/example/java/swing/chess-application-swing.shtml
I added it as follows. Try this out
I added it as follows. Try this out
private static final long serialVersionUID = 1L;
JLayeredPane layeredPane;
JPanel chessBoard;
JPanel panel2;
JLabel chessPiece;
int xAdjustment;
int yAdjustment;
public ChessGUI(){
Dimension boardSize = new Dimension(600, 600);
// Use a Layered Pane for this this application
layeredPane = new JLayeredPane();
getContentPane().add(layeredPane);
layeredPane.setPreferredSize(boardSize);
layeredPane.addMouseListener(this);
layeredPane.addMouseMotionListener(this);
//Add a chess board to the Layered Pane
chessBoard = new JPanel();
layeredPane.add(chessBoard, JLayeredPane.DEFAULT_LAYER);
chessBoard.setLayout( new GridLayout(8, 8) );
chessBoard.setPreferredSize( boardSize );
chessBoard.setBounds(0, 0, boardSize.width, boardSize.height);
for (int i = 0; i < 64; i++) {
JPanel square = new JPanel( new BorderLayout() );
chessBoard.add( square );
int row = (i / 8) % 2;
if (row == 0)
square.setBackground( i % 2 == 0 ? Color.blue : Color.white );
else
square.setBackground( i % 2 == 0 ? Color.white : Color.blue );
}
panel2 = new JPanel();
panel2.setLayout(new BorderLayout());
panel2.add(BorderLayout.NORTH, new JLabel("Hello world"));
panel2.add(BorderLayout.CENTER, chessBoard);
//Add a few pieces to the board
JLabel piece = new JLabel( new ImageIcon("piece.jpeg") );
JPanel panel = (JPanel)chessBoard.getComponent(0);
panel.add(piece);
> layeredPane.add(chessBoard , JLayeredPane.DEFAULT_LAYER );
> panel2.add(BorderLayout.CE NTER, chessBoard);
your adding the chessboard in two places
a component can only be added to 1 container
and you never add panel2 to anything (so it never appears)
try this:
chessBoard = new JPanel();
chessBoard.setLayout( new GridLayout(8, 8) );
chessBoard.setPreferredSiz e( boardSize );
chessBoard.setBounds(0, 0, boardSize.width, boardSize.height);
for (int i = 0; i < 64; i++) {
JPanel square = new JPanel( new BorderLayout() );
chessBoard.add( square );
int row = (i / 8) % 2;
if (row == 0)
square.setBackground( i % 2 == 0 ? Color.blue : Color.white );
else
square.setBackground( i % 2 == 0 ? Color.white : Color.blue );
}
panel2 = new JPanel();
panel2.setLayout(new BorderLayout());
panel2.add(BorderLayout.NO RTH, new JLabel("Hello world"));
panel2.add(BorderLayout.CE NTER, chessBoard);
layeredPane.add(panel2, JLayeredPane.DEFAULT_LAYER );
> panel2.add(BorderLayout.CE
your adding the chessboard in two places
a component can only be added to 1 container
and you never add panel2 to anything (so it never appears)
try this:
chessBoard = new JPanel();
chessBoard.setLayout( new GridLayout(8, 8) );
chessBoard.setPreferredSiz
chessBoard.setBounds(0, 0, boardSize.width, boardSize.height);
for (int i = 0; i < 64; i++) {
JPanel square = new JPanel( new BorderLayout() );
chessBoard.add( square );
int row = (i / 8) % 2;
if (row == 0)
square.setBackground( i % 2 == 0 ? Color.blue : Color.white );
else
square.setBackground( i % 2 == 0 ? Color.white : Color.blue );
}
panel2 = new JPanel();
panel2.setLayout(new BorderLayout());
panel2.add(BorderLayout.NO
panel2.add(BorderLayout.CE
layeredPane.add(panel2, JLayeredPane.DEFAULT_LAYER
ASKER
That makes sense why that would help. I made the recommended changes and still the same results. Thanks for sticking with me here. The file is attached and should compile correctly as I uploaded it.
ChessGUI.java
ChessGUI.java
as you're using a layed panel you need to explicitly set the size of panel2
ASKER
This is what finally worked for me. You don't add the new panel to the layered pane, you add the layered pane to the panel, then add the new panel to the (getContentPane()) whatever that is.
layeredPane = new JLayeredPane();
//getContentPane().add(layeredPane);
layeredPane.setPreferredSize(boardSize);
layeredPane.addMouseListener(this);
layeredPane.addMouseMotionListener(this);
chessBoard = new JPanel();
layeredPane.add(chessBoard, JLayeredPane.DEFAULT_LAYER);
chessBoard.setLayout( new GridLayout(8, 8) );
chessBoard.setPreferredSize( boardSize );
chessBoard.setBounds(0, 0, boardSize.width, boardSize.height);
for (int i = 0; i < 64; i++) {
JPanel square = new JPanel( new BorderLayout() );
chessBoard.add( square );
int row = (i / 8) % 2;
if (row == 0)
square.setBackground( i % 2 == 0 ? Color.darkGray : Color.white );
else
square.setBackground( i % 2 == 0 ? Color.white : Color.DARK_GRAY );
}
panel2 = new JPanel();
panel2.setPreferredSize(new Dimension(800, 800));
//layeredPane.add(panel2, JLayeredPane.DEFAULT_LAYER);
panel2.setLayout(new BorderLayout());
panel2.add(BorderLayout.NORTH, new JLabel("Hello world"));
panel2.add(BorderLayout.CENTER, layeredPane);
getContentPane().add(panel2);
ASKER
Valeri, that is an amazing example. I'm going to need to reference that for buttons.
Speaking of buttons, that is all I need to get working now. I can't figure this out for the life of me. For instance. How would I add a simple "Hello World" underneath or on top of the chessboard objects cited? I just need to figure out how to get a button to show up anywhere outside the chessboard and I can do the rest.
Thanks for any additional help guys!
-Jeff