首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的JFrame上不显示JPanels

我的JFrame上不显示JPanels
EN

Stack Overflow用户
提问于 2016-03-03 08:44:50
回答 1查看 34关注 0票数 0
代码语言:javascript
复制
public class Fantasy extends JFrame {
int di;
int mi;
int si;

public Fantasy() {
    setTitle("Fantasy Football");
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLayout(new BorderLayout());
    setSize(700,700);
    setResizable(false);

    String[] positions = {"4-4-2", "4-3-3", "3-5-2", "5-3-2", "3-4-3", "4-5-1"};

    JComboBox select = new JComboBox(positions);
    add(select, BorderLayout.NORTH);
    select.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            select.getItemAt(select.getSelectedIndex());
            Pattern p = Pattern.compile("(\\d)\\-(\\d)\\-(\\d)");
            Matcher m = p.matcher(select.toString());
            m.find();
            di = Integer.parseInt(m.group(1));
            mi = Integer.parseInt(m.group(2));
            si = Integer.parseInt(m.group(3));
        }
    });

    JPanel ptch = new JPanel();
    add(ptch, BorderLayout.CENTER);

    JPanel goal = new JPanel();
    goal.setLayout(new FlowLayout());
    goal.add(createGoalieHolder());

    JPanel dfnc = new JPanel();
    dfnc.setLayout(new FlowLayout());
    dfnc.add(createDefenceHolder());

    JPanel midf = new JPanel();
    midf.setLayout(new FlowLayout());
    midf.add(createMidfHolder());

    JPanel strk = new JPanel();
    strk.setLayout(new FlowLayout());
    strk.add(createStrkHolder());

    JPanel bnch = new JPanel();
    bnch.setLayout(new FlowLayout());
    bnch.add(createBenchHolder());

    ptch.add(goal);
    ptch.add(dfnc);
    ptch.add(midf);
    ptch.add(strk);
    add(bnch);
    setVisible(true);
}

private JPanel createGoalieHolder() {
    JPanel gh = new JPanel(new GridLayout(2,1));
    JTextField gk = new JTextField("Goalkeeper");
    JButton g = new JButton("+");
    gh.add(gk,g);
    return gh;
}

private JPanel createDefenceHolder() {
    JPanel dh = new JPanel(new GridLayout(2, 1));
    JTextField df = new JTextField("Defender");
    JButton d = new JButton("+");
    for (int a = 0; a < di; a++) {
        dh.add(df,d);
    }
    return dh;
}

private JPanel createMidfHolder() {
    JPanel mh = new JPanel(new GridLayout(2, 1));
    JTextField md = new JTextField("Midfielder");
    JButton m = new JButton("+");
    for (int b = 0; b < mi; b++) {
        mh.add(md,m);
    }
    return mh;
}


private JPanel createStrkHolder() {
    JPanel sh = new JPanel(new GridLayout(2, 1));
    JTextField sk = new JTextField("Striker");
    JButton s = new JButton("+");
    for (int c = 0; c < si; c++) {
        sh.add(sk,s);
    }
    return sh;
}

private JPanel createBenchHolder() {
        JPanel gkh = new JPanel(new GridLayout(2,1));
        JTextField gkt = new JTextField("Goalkeeper");
        JButton gkb = new JButton("+");
        gkh.add(gkt,gkb);

    for(int ad = 0; ad < (5-di); ad++) {
        JPanel dfh = new JPanel(new GridLayout(2,1));
        JTextField dft = new JTextField("Defender");
        JButton dfb = new JButton("+");
        dfh.add(dft,dfb);
        return dfh;
    }

    for(int bd = 0; bd < (5-mi); bd++) {
        JPanel mfh = new JPanel(new GridLayout(2,1));
        JTextField mft = new JTextField("Midfielder");
        JButton mfb = new JButton("+");
        mfh.add(mft,mfb);
        return mfh;
    }

    for(int cd = 0; cd < (3-si); cd++) {
        JPanel sih = new JPanel(new GridLayout(2,1));
        JTextField sit = new JTextField("Striker");
        JButton sib = new JButton("+");
        sih.add(sit,sib);
        return sih;
    }
    return gkh;
}
}

因此,createHolder方法应该使用JButtons和JTextFields创建JPanels。功能将在稍后添加。然而,在这一点上,我不能让任何东西真正出现在我的JFrame上,除了一个带有"Defender“字样的JTextField。我不确定还能怎么做。

EN

回答 1

Stack Overflow用户

发布于 2016-03-03 09:00:29

所以,基本上,你这样做...

代码语言:javascript
复制
add(ptch, BorderLayout.CENTER);
//...
add(bnch);

这和做这个差不多。

代码语言:javascript
复制
add(ptch, BorderLayout.CENTER);
//...
add(bnch, BorderLayout.CENTER);

或者这个..。

代码语言:javascript
复制
//add(ptch, BorderLayout.CENTER);
//...
add(bnch, BorderLayout.CENTER);

为了所有强烈的目的。

BorderLayout将只管理任何给定位置的单个组件,这意味着实际上只有bnch被布局。

如果不知道自己到底想要做什么,就很难知道具体要建议什么,但可以从尝试开始

代码语言:javascript
复制
add(ptch, BorderLayout.CENTER);
//...
add(bnch, BorderLayout.SOUTH);

这应该会有帮助。

接下来..。

代码语言:javascript
复制
private JPanel createGoalieHolder() {
    JPanel gh = new JPanel(new GridLayout(2, 1));
    JTextField gk = new JTextField("Goalkeeper");
    JButton g = new JButton("+");
    gh.add(gk, g);
    return gh;
}

这里的问题是gh.add(gk, g);,第二个参数通常是布局的约束属性,相反,您应该执行更多类似于...

代码语言:javascript
复制
private JPanel createGoalieHolder() {
    JPanel gh = new JPanel(new GridLayout(2, 1));
    JTextField gk = new JTextField("Goalkeeper");
    JButton g = new JButton("+");
    gh.add(gk);
    gh.add(g); 
    return gh;
}

这几乎适用于您的所有其他create方法

您可能希望花更多时间了解Laying Out Components Within a ContainerHow to Use BorderLayoutHow to Use GridLayout以了解更多详细信息

你会遇到的另一个问题是...

代码语言:javascript
复制
private JPanel createDefenceHolder() {
    JPanel dh = new JPanel(new GridLayout(2, 1));
    JTextField df = new JTextField("Defender");
    JButton d = new JButton("+");
    for (int a = 0; a < di; a++) {
        dh.add(df);
        dh.add(d);
    }
    return dh;
}

(我已经更正了add方法)组件只能驻留在单个父级中,因此上面的内容应该更类似于

代码语言:javascript
复制
private JPanel createDefenceHolder() {
    JPanel dh = new JPanel(new GridLayout(2, 1));
    for (int a = 0; a < di; a++) {
        JTextField df = new JTextField("Defender");
        JButton d = new JButton("+");
        dh.add(df);
        dh.add(d);
    }
    return dh;
}

但是,当您调用此方法时,di0,并且您对di所做的任何更改都不会影响UI,除非您重新调用此方法并使用新面板更新UI

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35761068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档