Разметка качания - центральная панель для прокрутки несколькими панелями JEditor

У меня проблемы с получением макетов Swing, чтобы делать то, что я хочу. Я хочу, чтобы центральная панель, которая содержит две JEditorPanes, прокручивалась, когда она содержала n панелей одинаковой (фиксированной) высоты.
Я играл в дизайнере интерфейса Netbean, чтобы попытаться заставить его работать
jPanel3 - центральная панель
jEditorPane4 и 5 - некоторые примеры панелей редактора (они будут содержать комментарии)

public class GBugForm1 extends javax.swing.JFrame {

public static void main(String[] args)
{
    GBugForm1 form;
    form = new GBugForm1();
    form.setDefaultCloseOperation(javax.swing.JDialog.DISPOSE_ON_CLOSE);
    form.setSize(500,500);
    form.setVisible(true);
}

/**
 * Creates new form GBugForm
 */
public GBugForm1() {
    initComponents();
}

/**
 * This method is called from within the constructor to initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is always
 * regenerated by the Form Editor.
 */
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

    jPanel1 = new javax.swing.JPanel();
    jPanel3 = new javax.swing.JPanel();
    jScrollPane6 = new javax.swing.JScrollPane();
    jEditorPane4 = new javax.swing.JEditorPane();
    jScrollPane4 = new javax.swing.JScrollPane();
    jEditorPane5 = new javax.swing.JEditorPane();
    jPanel4 = new javax.swing.JPanel();
    jPanel2 = new javax.swing.JPanel();

    setPreferredSize(new java.awt.Dimension(500, 460));
    setLayout(new java.awt.BorderLayout());

    jPanel1.setLayout(new java.awt.BorderLayout());

    jPanel3.setLayout(new javax.swing.BoxLayout(jPanel3, javax.swing.BoxLayout.PAGE_AXIS));

    jEditorPane4.setPreferredSize(new java.awt.Dimension(106, 200));
    jScrollPane6.setViewportView(jEditorPane4);

    jPanel3.add(jScrollPane6);

    jScrollPane4.setViewportView(jEditorPane5);

    jPanel3.add(jScrollPane4);

    jPanel1.add(jPanel3, java.awt.BorderLayout.CENTER);

    jPanel4.setPreferredSize(new java.awt.Dimension(492, 105));

    javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
    jPanel4.setLayout(jPanel4Layout);
    jPanel4Layout.setHorizontalGroup(
        jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 500, Short.MAX_VALUE)
    );
    jPanel4Layout.setVerticalGroup(
        jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 105, Short.MAX_VALUE)
    );

    jPanel1.add(jPanel4, java.awt.BorderLayout.PAGE_START);

    add(jPanel1, java.awt.BorderLayout.CENTER);

    jPanel2.setPreferredSize(new java.awt.Dimension(400, 40));

    javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
    jPanel2.setLayout(jPanel2Layout);
    jPanel2Layout.setHorizontalGroup(
        jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 500, Short.MAX_VALUE)
    );
    jPanel2Layout.setVerticalGroup(
        jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 40, Short.MAX_VALUE)
    );

    add(jPanel2, java.awt.BorderLayout.SOUTH);
}// </editor-fold>

// Variables declaration - do not modify
private javax.swing.JEditorPane jEditorPane4;
private javax.swing.JEditorPane jEditorPane5;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
private javax.swing.JScrollPane jScrollPane4;
private javax.swing.JScrollPane jScrollPane6;
// End of variables declaration
}

1 ответ

Решение

Вот пример, который может направить ваши дальнейшие усилия. Предпочтительный размер каждой панели указывается для отображения полосы прокрутки; аналогичным образом устанавливается общий размер кадра (после pack()) заставить внешнюю полосу прокрутки появиться. Смотрите этот Q&A для получения дополнительной информации. Обратите внимание также на использование URL-адреса, соответствующего RFC 2606.

Кроме того, вы, вероятно, должны изучить макеты, прежде чем слишком полагаться на графический редактор.

образ

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.io.IOException;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

/**
 * @see https://stackru.com/a/12827643/230513
 * @see https://stackru.com/questions/4755524
 */
public class HtmlView extends JPanel {

    private static final String EXAMPLE = "http://www.example.com";
    private final JEditorPane jep;

    public HtmlView(String url) {
        super(new GridLayout(1, 1));
        jep = new JEditorPane();
        try {
            jep.setPage(EXAMPLE);
        } catch (IOException ioe) {
            ioe.printStackTrace(System.err);
        }
        jep.setEditable(false);
        this.add(new JScrollPane(jep));
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(600, 200);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                JPanel panel = new JPanel(new GridLayout(0, 1));
                panel.add(new HtmlView(EXAMPLE));
                panel.add(new HtmlView(EXAMPLE));
                panel.add(new HtmlView(EXAMPLE));
                f.add(new JScrollPane(panel));
                f.pack();
                f.setSize(640, 480);
                f.setVisible(true);
            }
        });
    }
}
Другие вопросы по тегам