Como fazer um JPanel A4 [RESOLVIDO]

2 respostas
I

Olá pessoal,
Estou tentando fazer um JPanel parecer uma folha A4, só que o problema é que quando eu adiciono este JPanel em um JScrollPane, que por sua vez é adicionado em um JFrame, eu gostaria que meu JPanel matem-se seu setPreferredSize() como 595, 824 (que é o tamanho de uma folha A4 na vertical) porém ele se estende em todo o espaço do JFrame (devido o seu setLayout() está definido como BorderLayout.Center), já tentei outros gerenciadores de layout e estudei na documentação da Sun os métodos setColumnHeaderView(columnView), setRowHeaderView(rowView) e setCorner(), tentei colocar JPanels ao redor do pnlA4 para diminuir seu tamanho até ficar A4, porém nada deu certo ainda.

Alguém por favor tem uma ideia, link, sugestão de como fazer isto... desde já agradeço pela atenção.
package view;

import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;

public class JPanelA4 extends javax.swing.JFrame {

    private JTabbedPane tbcMenu;
    private JTabbedPane tbcStatus;
    private JPanel pnlA4;
    private JScrollPane sclRolagem;

    public JPanelA4() {
        construtor();
        super.setExtendedState(MAXIMIZED_BOTH);
        super.setDefaultCloseOperation(EXIT_ON_CLOSE);
        super.add(tbcMenu, BorderLayout.NORTH);
        super.add(tbcStatus, BorderLayout.SOUTH);
        
        /*Aqui está o problema*/
        super.add(sclRolagem, BorderLayout.CENTER);/*Comente está linha*/ 
        //super.add(pnlA4, BorderLayout.CENTER);/*Descomente está linha*/
        
        
    }

    private void construtor() {
        this.tbcMenu = new JTabbedPane();
        this.tbcMenu.addTab("Arquivo", new JPanel());
        this.tbcMenu.addTab("Editar", new JPanel());
        this.tbcMenu.addTab("Configurações", new JPanel());

        this.pnlA4 = new JPanel();
        this.pnlA4.setPreferredSize(new java.awt.Dimension(595, 824));
        this.pnlA4.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        this.pnlA4.setBackground(java.awt.Color.white);

        this.sclRolagem = new javax.swing.JScrollPane(pnlA4);
        
        this.tbcStatus = new JTabbedPane();
        this.tbcStatus.addTab("Propriedades", new JPanel());
        this.tbcStatus.addTab("Saida", new JPanel());
        this.tbcStatus.addTab("Dicas", new JPanel());
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new JPanelA4().setVisible(true);
            }
        });
    }
}

2 Respostas

T

Você está tentando fazer um editor de texto com páginas, certo?

Alterei um pouco aqui e acho que funciona (está até comentado :D ):

package view;

import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;

public class JPanelA4 extends javax.swing.JFrame {

    private JTabbedPane tbcMenu;
    private JTabbedPane tbcStatus;
    private JPanel pnlA4;
    private JPanel umaareaqualquer; // conterá o pnlA4 e será alterado pelo JScrollPane
    private JScrollPane sclRolagem;

    public JPanelA4() {
        construtor();
        super.setExtendedState(MAXIMIZED_BOTH);
        super.setDefaultCloseOperation(EXIT_ON_CLOSE);
        super.add(tbcMenu, BorderLayout.NORTH);
        super.add(tbcStatus, BorderLayout.SOUTH);

		// uma linha só, adicionando o JScrollPane, que já contém o JPanel umaareaqualquer, que contém o JPanel pnlA4
        super.add(sclRolagem, BorderLayout.CENTER);
    }

    private void construtor() {
        this.tbcMenu = new JTabbedPane();
        this.tbcMenu.addTab("Arquivo", new JPanel());
        this.tbcMenu.addTab("Editar", new JPanel());
        this.tbcMenu.addTab("Configurações", new JPanel());

        this.pnlA4 = new JPanel();
        this.pnlA4.setPreferredSize(new java.awt.Dimension(595, 824));
        this.pnlA4.setSize(pnlA4.getPreferredSize());
        this.pnlA4.setLocation(10, 10); // muda a localização da folha, para ficar afastada da borda: só por "estilo"
        this.pnlA4.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        this.pnlA4.setBackground(java.awt.Color.white);

        this.umaareaqualquer = new JPanel();
		this.umaareaqualquer.setLayout(null); // layout nulo, assim a posição do pnlA4 não ficará amarrada a um layout
		this.umaareaqualquer.setPreferredSize(new java.awt.Dimension(620, 900)); // Tem que ser maior que a "folha" (pnlA4)
        this.umaareaqualquer.setSize(umaareaqualquer.getPreferredSize()); // torna size igual a PreferredSize: fiz por hábito, não sei se é realmente necessário
        this.umaareaqualquer.add(pnlA4); // adicionamos a esse novo JPanel o pnlA4

		this.sclRolagem = new javax.swing.JScrollPane(umaareaqualquer); // criamos o JScrollPane ligado ao novo JPanel (não mais o pnlA4)

        this.tbcStatus = new JTabbedPane();
        this.tbcStatus.addTab("Propriedades", new JPanel());
        this.tbcStatus.addTab("Saida", new JPanel());
        this.tbcStatus.addTab("Dicas", new JPanel());
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new JPanelA4().setVisible(true);
            }
        });
    }
}

Não vou dizer que, para o que você pretende (ou não), este é o melhor caminho, porque não sou especialista em Java (muit menos em Swing). Deve haver outros modos (como usar o gridbaglayout dentro de um JPanel, dentro de um NullLayout), mas este me pareceu funcionar. Só algumas considerações:
- se for adicionar mais páginas, você terá de redimensionar o JPanel umaareaqualquer, com setPreferredSize() e revalidate();
- pesquise outros métodos de se fazer isso. O meu funciona, mas sinceramente não me muito bom;
- se não me engano, há classes/métodos para a conversão de pixels em polegadas/tamanhos de folha (para caber numa página) e de impressão. Acho que vale a pena uma pesquisa, para não fazer algo que pode já estar pronto;
- também há classes prontas para texto e RichText. Veja se não vale a pena usá-las e "extendê-las";
- me faça um favor e, se for usar esse código, mude o nome umaareaqualquer;

Abraço.

I

Muito Obrigado TerraSkilll.

Estou tentando fazer um editor de fluxograma (semelhante ao Portugol e yEd Grafh). Correto vou permitir que o usuário adicione mais páginas e imprima, então vou procurar isto que você sugeriu. Enfim, vou testar este código que você enviou, obrigado também por colocar os comentários, qualquer coisa eu peço mais uma ajudinha.

Valeu. :smiley:

Criado 22 de agosto de 2011
Ultima resposta 23 de ago. de 2011
Respostas 2
Participantes 2