Pergunta

Eu estou tentando desenhar uma barra lateral para um projeto que estou trabalhando. Eu escolhi usar GridBagLayout porque eu ficou frustrado com as limitações de BoxLayout. Alguém poderia ajudar a explicar o que estou fazendo de errado. O que eu quero é que a barra lateral para conter dois JPanels. O código que eu tenho lugares-los no meio da barra lateral, em vez de no topo. Alguém poderia explicar o que estou ausente aqui.

    JPanel sideBar = new JPanel();
    sideBar.setBounds(0, 0, 180, (int)this.getBounds().getHeight());
    sideBar.setLayout(new GridBagLayout());


    JPanel optionBar = new JPanel();
    optionBar.setBorder(BorderFactory.createTitledBorder("Box1"));
    optionBar.setLayout(new GridBagLayout());


    JPanel buttonBar = new JPanel();
    buttonBar.setBorder(BorderFactory.createTitledBorder("Options"));
    buttonBar.setLayout(new GridBagLayout());


    GridBagConstraints c = new GridBagConstraints();
    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 0;
    c.ipady = 5;
    c.insets = new Insets(10,0,0,0);


    JButton simplify;
    simplify = new JButton("Open");
    simplify.addActionListener( this.listener );
    c.gridy = 0;
    buttonBar.add(simplify, c);

    JButton mergeButton;
    mergeButton = new JButton("Close");
    mergeButton.addActionListener( this.listener );
    c.gridy = 1;
    buttonBar.add(mergeButton, c);

    JButton splitButton;
    splitButton = new JButton("Merge");
    splitButton.addActionListener( this.listener );
    c.gridy = 2;
    buttonBar.add(splitButton, c);

    c.insets = new Insets(0,5,5,5);
    c.gridy = 0;
    sideBar.add(optionBar, c);

    c.gridy = 1;
    c.ipadx = 70;
    sideBar.add(buttonBar, c);

    return(sideBar);
Foi útil?

Solução

GridBagLayout só irá alocar espaço vertical suficiente para que um componente requer, deixando o resto em branco. Eu espero que você está vendo seus componentes barra lateral centrada verticalmente?

Para "empurrar" os componentes, você precisa definir um peso vertical. Se você definir a restrição weighty a 1,0 no seu último componente, ele irá ocupar todo o espaço vertical restante para esse componente e empurre o resto para o topo. (Você também pode precisar de âncora que último painel para GridBagConstraints.NORTH).

Tente c.weighty = 1.0 antes sideBar.add(buttonBar, c);

Outras dicas

Se você estiver familiarizado / mais confortável com HTML, você pode usar table2gridbag . É uma pequena ferramenta de console que leva uma descrição layout (tabela HTML) e traduz isso em uma descrição de layout equivalente para a configuração do gerenciador de GridBagLayout

O código que eu tenho os coloca A meio caminho da barra lateral, em vez de pelo o topo.

Bem, você precisa começar por ler o balanço tutorial para aprender como utilizar os gerenciadores de layout corretamente. BoxLayout é muito mais fácil do que GridBagLayout porque você não tem que aprender a especificar restrições. Mas se você quiser usar GridBagLayout, em seguida, ler a seção sobre "How to Use GridBagLayout". Você pode querer concentrar-se na seção que trata do "weightx e pesadas" constrangimentos. Baseado em meu conhecimento limitado que deve ajudar a resolver o problema.

Além disso, ao usar gerenciadores de layout que você não usa setBounds () ou setSize ().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top