【问题标题】:JPanel size not being set未设置 JPanel 大小
【发布时间】:2014-06-08 17:54:35
【问题描述】:

我目前正在开发一个 irc 机器人,今天我想为它创建一个 GUI。

我正在尝试创建一个包含左右两部分的列布局。 左侧将显示控制台输出,右侧将包含所有控件(加入通道、命令等)。

我在创建两列时遇到问题。我有一个 JPanel,它是窗口的整个宽度和高度,边框为 10 像素,然后我在其中有两个面板;左右。

由于某种原因,左右面板占据了窗口的整个大小,而右侧面板与所有内容重叠。

这是一个示例图片:http://i.imgur.com/lc4vHVH.png 白色是右侧面板,它应该只有一半大小,并且在左侧有一个相同但黑色的面板。

这是我当前的代码,如果它是混乱的,对不起,对整个 Swing GUI 来说都是新的。谢谢你的帮助。

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);
    }
}

附带说明,所有以“Web”为前缀的变量都与 Swing 相同,但它是自定义 GUI。

【问题讨论】:

    标签: java swing user-interface layout-manager


    【解决方案1】:

    覆盖JComponent#getPreferredSize() 而不是使用setPreferredSize()

    阅读更多Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?

    如果在Performing Custom Painting的情况下非常需要,那么尝试这种方式:

    示例代码:

    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);
        }
    };
    

    为什么要使用setPreferredSize() 方法,而您可以使用任何适当的布局轻松实现此设计,例如BoxLayoutGridLayoutBorderLayout 等。

    阅读更多关于布局How to Use Various Layout Managers

    编辑

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

    【讨论】:

    • 在这种情况下发布最少的可测试代码。我这里不知道WebFrameWebPanel是什么?
    • 似乎是外部 GUI 的问题,我现在已经解决了。谢谢!
    • 我更新了我的帖子。在删除所有 setPreferredSize() 方法后尝试这个。
    猜你喜欢
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多