GUI,在面板内安排按钮

时间:2013-11-20 07:04:04

标签: java swing user-interface

如何正确显示按钮?

继承我的代码:

import javax.swing.*;
import java.awt.*;
public class cal extends JFrame

{

private JLabel monthnym, monnym,tuesnym,wednym,thunym,frinym,satnym,sunnym;
private JButton b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,
b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30;
private JPanel panel1, panel2, panel3,panel4;
public cal()
{
    super("November");
    Container c = getContentPane();

    c.setLayout(new GridLayout(7,5));
    panel1=new JPanel(new GridLayout(1,0));
    monthnym=new JLabel("November 2013");
    panel1.add(monthnym);

    panel2=new JPanel(new GridLayout(1,7,2,2));
    sunnym=new JLabel("SUN");
    monnym=new JLabel("MON");
    tuesnym=new JLabel("TUE");
    wednym=new JLabel("WED");
    thunym=new JLabel("THU");
    frinym=new JLabel("FRI");
    satnym=new JLabel("SAT");
    panel2.add(sunnym);
    panel2.add(monnym);
    panel2.add(tuesnym);
    panel2.add(wednym);
    panel2.add(thunym);
    panel2.add(frinym);
    panel2.add(satnym);

    panel3=new JPanel(new GridLayout(5,7,3,3));
    b1=new JButton("1");
    b2=new JButton("2");
    b3=new JButton("3");
    b4=new JButton("4");
    b5=new JButton("5");

    panel3.add(b1);
    panel3.add(b2);
    panel3.add(b3);
    panel3.add(b4);
    panel3.add(b5);



    //panel4=new JPanel(new GridLayout(4,7,5,5));
    c.add(panel1);
    c.add(panel2);
    c.add(panel3);
    //c.add(panel4);
    setSize(500,500);
    show();
}








public static void main(String[] args) {

    cal app = new cal();

}

}

我编辑我的代码severwal次,但没有运气。  我认为(x,y)中存在某些东西,但我没有任何改变。

并且这些按钮是30,我将其减少到5,因为我在发布此问题时出错

3 个答案:

答案 0 :(得分:3)

基本上,GridLayout正在为它认为需要的空间保留空间,但是因为它想要的区域比你提供的区域大,所以它被挤压了所有东西。

如果我将内容窗格的布局管理器从c.setLayout(new GridLayout(7, 5));更改为c.setLayout(new BorderLayout());,我会...

enter image description here

我的第一个建议是使用更好的布局。您已经将代码分解为单独的组件,这是一个良好的开端,您可以为每个部分使用不同的布局管理器来生成更好的布局。

如果它根本不适合(合理的)屏幕,您可能需要考虑将UI放入JScrollPane ...

您还应该使用JFrame#pack来确定主框架的尺寸,而不是setSize

看看A Visual Guide to Layout Managers的一些想法。

接下来,我建议您生成一个维护基本内容的自定义组件,以便您可以重复使用。

我还建议您查看Initial Threads并确保在事件调度线程的上下文中构建UI以防止可能出现的问题。

我还鼓励您将按钮放入数组或某种类型的List,而不是创建30个命名变量...恕我直言

答案 1 :(得分:2)

试试这个:

c.setLayout(new GridLayout(3,5));

panel3=new JPanel(new GridLayout(1,7,1,1));

答案 2 :(得分:2)

根据@MadProgrammer的建议,尝试为面板使用不同的LayoutManagers。我稍微改变了你的代码。我为您的容器设置了GridBagLayout,现在它看起来更好。

public class Form extends JFrame {

    private JLabel monthnym, monnym, tuesnym, wednym, thunym, frinym, satnym,
            sunnym;
    private JPanel panel1, panel2, panel3;

    public Form() {
        super("November");
        Container c = getContentPane();
        c.setLayout(new GridBagLayout());
        panel1 = new JPanel(new GridLayout(1, 0));
        monthnym = new JLabel("November 2013");
        panel1.add(monthnym);

        panel2 = new JPanel(new GridLayout(1, 0));
        sunnym = new JLabel("SUN");
        monnym = new JLabel("MON");
        tuesnym = new JLabel("TUE");
        wednym = new JLabel("WED");
        thunym = new JLabel("THU");
        frinym = new JLabel("FRI");
        satnym = new JLabel("SAT");
        panel2.add(sunnym);
        panel2.add(monnym);
        panel2.add(tuesnym);
        panel2.add(wednym);
        panel2.add(thunym);
        panel2.add(frinym);
        panel2.add(satnym);

        panel3 = new JPanel(new GridLayout(5, 7));
        for(int i =0;i<30;i++){
            JButton b = new JButton(""+i);
            panel3.add(b);
        }

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets(5, 5, 5, 5);
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridy =0;
        c.add(panel1,gbc);
        gbc.gridy++;
        c.add(panel2,gbc);
        gbc.gridy++;
        c.add(panel3,gbc);
        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        Form app = new Form();
    }

 }

enter image description here

同时使用pack()代替setSize()setVisible(true)代替弃用show()