Kondax Design
Kondax Design

Reputation: 175

JPanel size not being set

I'm currently working on an irc bot and today I would like to create a GUI for it.

I'm trying to create a column layout that has two parts, left and right. The left side will show console output, the right will contain all the controls (joining channels, commands etc).

I'm having issues creating the two columns. I have a JPanel that is the whole width and height of the window and has a border of 10 pixels, and then I have two panels within that; left and right.

The left and right panels are for some reason taking the whole size of the window, and the right panel is overlapping everything.

Here's an example picture: https://i.sstatic.net/Hobvh.png The white is the right panel, it should only be half the size and have an identical but black panel on the left of it.

Here's my current code, sorry if it's messy, new to the whole Swing GUI.. Thanks for any help.

package tk.TaylerKing.GribbyBot;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.HashMap;

import javax.swing.BorderFactory;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

import com.alee.laf.WebLookAndFeel;
import com.alee.laf.menu.WebMenuBar;
import com.alee.laf.menu.WebMenuItem;
import com.alee.laf.panel.WebPanel;
import com.alee.laf.rootpane.WebFrame;

public class GribbyBot extends WebFrame {
    private static final long serialVersionUID = 4641597667372956773L;
    public static HashMap<String, ArrayList<String>> connections = new HashMap<String, ArrayList<String>>();
    public static void main(String[] args) throws Exception {
        UIManager.setLookAndFeel(WebLookAndFeel.class.getCanonicalName());
        SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                GribbyBot gb = new GribbyBot();
                gb.setVisible(true);
            }
        });
    }
    public GribbyBot(){
        WebPanel panel = new WebPanel();
        panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        panel.setPreferredSize(new Dimension(780, 580));

        WebMenuBar menu = new WebMenuBar();
        WebMenuItem file = new WebMenuItem("Exit");
        file.setMnemonic(KeyEvent.VK_E);
        file.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                System.exit(0);             
            }
        });
        menu.add(file);
        setJMenuBar(menu);

        WebPanel left = new WebPanel();
        left.setPreferredSize(new Dimension(380, 580));
        left.setBackground(Color.BLACK);

        WebPanel right = new WebPanel();
        right.setPreferredSize(new Dimension(380, 580));
        right.setBackground(Color.WHITE);

        add(panel);
        panel.add(left);
        panel.add(right);
        setTitle("GribbyBot");
        setSize(800, 600);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
    }
}

On a side note, all the variables that are prefixed with "Web" are the same as Swing, but it's a custom GUI.

Upvotes: 1

Views: 501

Answers (1)

Braj
Braj

Reputation: 46871

Override JComponent#getPreferredSize() instead of using setPreferredSize()

Read more Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?

If extremely needed in case of Performing Custom Painting then try in this way:

Sample code:

final JPanel panel = new JPanel(){
    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        // your custom painting code here
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(40, 40);
    }
};

Why are using setPreferredSize() method whereas you can achieve this design easily using any proper layout such as BoxLayout, GridLayout, BorderLayout etc.

Read more about layout How to Use Various Layout Managers

EDIT

try JPanel panel = new JPanel(new GridLayout(1,2));

Upvotes: 3

Related Questions