[RESOLVIDO]Problemas com borderLayout.SOUTH fantasma sobrescrevendo

Olá, estou fazendo um programa com o qual preciso colocar uma TabbedPane no painel centro do container, porém quando eu faço isso, fica um Borrão na parte de baixo, como se a parte sul do Container sobrescrevesse a parte Centro (lembrando que é um borderLayout), entretanto, eu não adicionei nenhum Painel Sul, e não faço ideia do que esteja atrapalhando, segue o código:

package Cadastra;

import Controla.TableModel;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.TableColumn;
import javax.swing.text.MaskFormatter;

/**
 *
 * @author Thomas
 */
public class CadastraVerbas extends JDialog {

    JRadioButton rbHora = new JRadioButton("Cálculo por Hora");
    JRadioButton rbValor = new JRadioButton("Cálculo por Valor");
    JRadioButton rbFgts = new JRadioButton("FGTS s/ Pacto");
    JRadioButton rbIndeni = new JRadioButton("Indenizações");
    JRadioButton rbInss = new JRadioButton("INSS");
    JRadioButton rbSeguro = new JRadioButton("Seguro Desemprego");

    JCheckBox cbAbaterValor = new JCheckBox("Abater Valores Pagos Mês a Mês");
    JCheckBox cbOmitir = new JCheckBox("Omitir na Impressão os Meses com Valor Zerado");
    JCheckBox cbAbaterTot = new JCheckBox("Abater o totalNegativo da Verba no Resumo Geral");

    ButtonGroup bgFora = new ButtonGroup();

    JTextField tfNomeVerb = new JTextField(10);

    JFormattedTextField tfPerDe;
    JFormattedTextField tfPerAte;

    MaskFormatter datas;

    JTabbedPane tbFora = new JTabbedPane();
    JTabbedPane tbHoras = new JTabbedPane();
    JTabbedPane tbValor = new JTabbedPane();
    JTabbedPane tbFgts = new JTabbedPane();

    BorderLayout Border = new BorderLayout();

    GridLayout Gl6c1 = new GridLayout(6, 1);
    GridLayout Gl4c1 = new GridLayout(4, 1);
    GridLayout Gl1c2 = new GridLayout(1, 2);
    GridLayout Gl2c1 = new GridLayout(2, 1);
    GridLayout Gl3c1 = new GridLayout(3, 1);
    GridLayout Gl1c3 = new GridLayout(1, 3);
    GridLayout Gl1c1 = new GridLayout(1, 1);

    FlowLayout flE = new FlowLayout(FlowLayout.LEFT);
    FlowLayout flC = new FlowLayout(FlowLayout.CENTER);
    FlowLayout flD = new FlowLayout(FlowLayout.RIGHT);

    JPanel pnN = new JPanel();
    JPanel pnNC1 = new JPanel(Gl1c2);
    JPanel pnNC1C1 = new JPanel(Gl3c1);
    JPanel pnNC1C1L1 = new JPanel(flE);
    JPanel pnNC1C1L2 = new JPanel(flE);
    JPanel pnNC1C1L3 = new JPanel(flE);
    JPanel pnNC1C2 = new JPanel(Gl3c1);
    JPanel pnNC1C2L1 = new JPanel(flE);
    JPanel pnNC1C2L2 = new JPanel(flE);
    JPanel pnNC1C2L3 = new JPanel(flE);
    JPanel pnNC2 = new JPanel(Gl4c1);
    JPanel pnNC2L1 = new JPanel(Gl1c2);
    JPanel pnNC2L1C1 = new JPanel(flD);
    JPanel pnNC2L1C2 = new JPanel(flE);
    JPanel pnNC2L2 = new JPanel(flE);
    JPanel pnNC2L3 = new JPanel(flE);
    JPanel pnNC2L4 = new JPanel(flE);
    JPanel pnNC3 = new JPanel(Gl2c1);
    JPanel pnNC3L1 = new JPanel(Gl1c2);
    JPanel pnNC3L1C1 = new JPanel(flD);
    JPanel pnNC3L1C2 = new JPanel(flE);
    JPanel pnNC3L2 = new JPanel(Gl1c2);
    JPanel pnNC3L2C1 = new JPanel(flD);
    JPanel pnNC3L2C2 = new JPanel(flE);
    JPanel pnC = new JPanel(Gl1c1);
    JPanel pnCHor = new JPanel(Border);
    JPanel pnCValo = new JPanel(Border);
    JPanel pnCFgts = new JPanel(Border);
    JPanel pnCInss = new JPanel(Border);
    JPanel pnCInden = new JPanel(Border);
    JPanel pnCSegur = new JPanel(Border);
    JPanel pnCHorBase = new JPanel(Gl2c1);
    JPanel pnCHorBaseS = new JPanel(Gl1c3);
    JPanel pnCHorBaseSC1 = new JPanel(flC);
    JPanel pnCHorBaseSC2 = new JPanel(flC);
    JPanel pnCHorBaseSC3 = new JPanel(flC);
    JPanel pnCHorConv = new JPanel();
    JPanel pnCHorVal = new JPanel();
    JPanel pnCHorFer = new JPanel();
    JPanel pnCHor13 = new JPanel();
    JPanel pnCHorAvi = new JPanel();
    JPanel pnCHorSaldo = new JPanel();
    JPanel pnCValBase = new JPanel();
    JPanel pnCValConv = new JPanel();
    JPanel pnCValVal = new JPanel();
    JPanel pnCValFer = new JPanel();
    JPanel pnCVal13 = new JPanel();
    JPanel pnCValAvi = new JPanel();
    JPanel pnCValSaldo = new JPanel();
    Container cp;

    JTable tb1 = new JTable(new TableModel());
    JScrollPane sctb1 = new JScrollPane(tb1);

    JButton btAddCol = new JButton("Adicionar Colunas");
    JButton btRemCol = new JButton("Remover Colunas");
    JButton btAtualCol = new JButton("Atualizar");

    private List<JCheckBox> checkboxes = new ArrayList<JCheckBox>();

    public CadastraVerbas() {
        try {
            datas = new MaskFormatter("**/**/****");
            datas.setValidCharacters("0123456789");
        } catch (ParseException P) {
            P.printStackTrace();
        }
        tfPerAte = new JFormattedTextField(datas);
        tfPerDe = new JFormattedTextField(datas);
        tfPerAte.setColumns(6);
        tfPerDe.setColumns(6);

        setModal(true);
        cp = getContentPane();
        cp.setLayout(Border);
        setSize(850, 600);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setTitle("Cadastro de Verbas e Reflexos");

        pnNC1C1L1.add(rbHora);
        pnNC1C1L2.add(rbValor);
        pnNC1C1L3.add(rbFgts);
        pnNC1C2L2.add(rbIndeni);
        pnNC1C2L1.add(rbInss);
        pnNC1C2L3.add(rbSeguro);

        bgFora.add(rbHora);
        bgFora.add(rbValor);
        bgFora.add(rbFgts);
        bgFora.add(rbIndeni);
        bgFora.add(rbInss);
        bgFora.add(rbSeguro);

        rbHora.setSelected(true);

        pnNC1C1.add(pnNC1C1L1);
        pnNC1C1.add(pnNC1C1L2);
        pnNC1C1.add(pnNC1C1L3);

        pnNC1C2.add(pnNC1C2L1);
        pnNC1C2.add(pnNC1C2L2);
        pnNC1C2.add(pnNC1C2L3);
//
        pnNC1.add(pnNC1C1);
        pnNC1.add(pnNC1C2);
//
        pnNC2L1C1.add(new JLabel("Nome das Verbas:  "));
        pnNC2L1C2.add(tfNomeVerb);

        pnNC2L1.add(pnNC2L1C1);
        pnNC2L1.add(pnNC2L1C2);
        pnNC2L2.add(cbAbaterValor);
        pnNC2L3.add(cbAbaterTot);
        pnNC2L4.add(cbOmitir);

        pnNC2.add(pnNC2L1);
        pnNC2.add(pnNC2L2);
        pnNC2.add(pnNC2L3);
        pnNC2.add(pnNC2L4);
//
        pnNC3L1C1.add(new JLabel("De:  "));
        pnNC3L1C2.add(tfPerDe);

        pnNC3L1.add(pnNC3L1C1);
        pnNC3L1.add(pnNC3L1C2);

        pnNC3L2C1.add(new JLabel("Até:  "));
        pnNC3L2C2.add(tfPerAte);

        pnNC3L2.add(pnNC3L2C1);
        pnNC3L2.add(pnNC3L2C2);

        pnNC3.add(pnNC3L1);
        pnNC3.add(pnNC3L2);

        pnN.add(pnNC1);
        pnN.add(pnNC2);
        pnN.add(pnNC3);

        pnCHorBase.add(sctb1);

        pnCHorBaseSC1.add(btAddCol);
        pnCHorBaseSC2.add(btRemCol);
        pnCHorBaseSC3.add(btAtualCol);
        pnCHorBaseS.add(pnCHorBaseSC1);
        pnCHorBaseS.add(pnCHorBaseSC2);
        pnCHorBaseS.add(pnCHorBaseSC3);

        pnCHorBase.add(pnCHorBaseS);

        tbHoras.add(pnCHorBase, "Base de Cálculo");
        tbHoras.add(pnCHorConv, "Conversão");
        tbHoras.add(pnCHorVal, "Valor Pago");
        tbHoras.add(pnCHorFer, "Férias");
        tbHoras.add(pnCHor13, "13º Salário");
        tbHoras.add(pnCHorAvi, "Aviso Prévio");
        tbHoras.add(pnCHorSaldo, "Saldo Salário");

        tbValor.add(pnCValBase, "Base de Cálculo");
        tbValor.add(pnCValConv, "Conversão");
        tbValor.add(pnCValVal, "Valor Pago");
        tbValor.add(pnCValFer, "Férias");
        tbValor.add(pnCVal13, "13º Salário");
        tbValor.add(pnCValAvi, "Aviso Prévio");
        tbValor.add(pnCValSaldo, "Saldo Salário");

//        pnCHor.add(tbHoras);
//        pnCValo.add(tbValor);
//
        tbFora.add(tbHoras, "Horas Extras");
        tbFora.add(tbValor, "Valores");
        tbFora.add(pnCFgts, "FGTS s/ Pacto");
        tbFora.add(pnCInss, "INSS");
        tbFora.add(pnCInden, "Indenizações");
        tbFora.add(pnCSegur, "Seguro Desemprego");

        tbFora.setEnabledAt(0, true);
        tbFora.setEnabledAt(1, false);
        tbFora.setEnabledAt(2, false);
        tbFora.setEnabledAt(3, false);
        tbFora.setEnabledAt(4, false);
        tbFora.setEnabledAt(5, false);
//        
        pnC.add(tbFora);

//        pnCHorBaseS.add();
        cp.add(pnN, BorderLayout.NORTH);
        cp.add(pnC, BorderLayout.CENTER);

        btAddCol.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                TableColumn tx = new TableColumn(tb1.getColumnCount());
                int selected = tb1.getSelectedColumn();
//                tb1.addColumn(tx);//adiciona coluna
//                tb1.removeColumn(tb1.getColumnModel().getColumn(selected));//remove coluna
            }
        });

        rbHora.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                for (int i = 0; i < 6; i++) {
                    tbFora.setEnabledAt(i, false);
                }
                tbFora.setSelectedIndex(0);
                tbFora.setEnabledAt(0, true);

            }
        });
        rbValor.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                for (int i = 0; i < 6; i++) {
                    tbFora.setEnabledAt(i, false);
                }
                tbFora.setSelectedIndex(1);
                tbFora.setEnabledAt(1, true);

            }
        });
        rbFgts.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                for (int i = 0; i < 6; i++) {
                    tbFora.setEnabledAt(i, false);
                }
                tbFora.setSelectedIndex(2);
                tbFora.setEnabledAt(2, true);

            }
        });
        rbInss.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                for (int i = 0; i < 6; i++) {
                    tbFora.setEnabledAt(i, false);
                }
                tbFora.setSelectedIndex(3);
                tbFora.setEnabledAt(3, true);

            }
        });
        rbIndeni.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                for (int i = 0; i < 6; i++) {
                    tbFora.setEnabledAt(i, false);
                }
                tbFora.setSelectedIndex(4);
                tbFora.setEnabledAt(4, true);

            }
        });
        rbSeguro.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                for (int i = 0; i < 6; i++) {
                    tbFora.setEnabledAt(i, false);
                }
                tbFora.setSelectedIndex(5);
                tbFora.setEnabledAt(5, true);

            }
        });

        setLocationRelativeTo(null);
        setVisible(true);
    }

}

Além disso, quando eu tento adicionar o “pnC” em outro lugar do container que não seja o centro, dá erro de StackOverFlow, o que poderia ser?

OBS: estou com meu Model de JTable, utilizando AbstractTableModel e, os botões ainda não fazem nada, mas isso eu resolvo, o meu problema é a questão de um painel bloqueando a visão mesmo,

e para melhor entendimento, por uma questão de estética tenho tantos JPanels, sendo que pnNC1L1C1 significa: painel norte, coluna1, linha1, coluna1

Table Model:

package TableModels;

import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author Thomas
 */
public class TableModelHorBase extends AbstractTableModel{

    public static final int DATA=0;
    public static final int TOTAL=1;
    public static final int DIVISOR=2;
    public static final int VALOR_POR_HORA=3;
    ArrayList<String> colName=new ArrayList<>();

    @Override
    public int getRowCount() {
        return 6; //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public int getColumnCount() {
        return 4; //To change body of generated methods, choose Tools | Templates.
    }

    public void setCol(String col,int loc){
        colName.add(loc,col);
    }

    public String getColumnName(int col){
        colName.add("Data");
        colName.add("Total");
        colName.add("Divisor");
        colName.add("Valor por Hora");
        return colName.get(col);
    }

    @Override
    public Object getValueAt(int row, int col) {
        if(col==DATA){
            return "data, " +" linha: "+String.valueOf(row);
                    }
        else if(col==TOTAL){
            return "TOTAL,  "+ "linha:  "+String.valueOf(row);
        }
        else if(col==DIVISOR){
            return "DIVISOR,  "+ "linha:  "+String.valueOf(row);
        }
        else if(col==VALOR_POR_HORA){
            return "VALOR_POR_HORA,  "+ "linha:  "+String.valueOf(row);
        }

        return "falha";
    }

    @Override
    public boolean isCellEditable(int row, int col){
        return true;
    }

    public void remover(int col){

    }
}
JPanel pnCHor = new JPanel(Border);
JPanel pnCValo = new JPanel(Border);
JPanel pnCFgts = new JPanel(Border);
JPanel pnCInss = new JPanel(Border);
JPanel pnCInden = new JPanel(Border);
JPanel pnCSegur = new JPanel(Border);

Acho q o BorderLayout não pode ser “reaproveitado”, deve ser uma instancia por JPanel.

1 curtida

lol, deu certo ‘-’ mas sabe me dizer o porque isso ocorre?

Sim, quando é feito container.add(component, BorderLayout.NORTH) ou container.add(component), o add chama o metodo addLayoutComponent do layout passando os mesmos parametros. No caso do BorderLayout, ele tem atributos q guardam a posição dos components, portando toda vez q chama o add apontando para o mesmo destino, o component anterior é substituido pelo novo.

Seria mais facil entender se acessar o fonte do BorderLayout, se vc estiver usando o netbeans, segure Ctrl e clique na classe para abrir o código do BorderLayout, no eclipse também é possivel da mesma forma, mas pede o caminho do source q está localizado no \Java\jdk1.8.X\src.zip,

1 curtida

aaaa entendi, muito obrigado mesmo!!!