1

我无法让 Swing 布局做我想做的事。我希望包含两个 JEditorPanes 的中心面板在它包含相等(固定)高度的“n”个窗格时滚动。
我一直在玩 Netbean 的 UI 设计器,试图让它工作
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
}
4

1 回答 1

4

这是一个可以指导您进一步努力的sscce 。指定每个面板的首选大小以强制显示滚动条;同样,设置框架的整体大小(在 之后pack())以强制出现外部滚动条。有关更多信息,请参阅此问答。还要注意使用符合RFC 2606的URL。

顺便说一句,您可能应该在过度依赖 GUI 编辑器之前 研究布局。

图片

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://stackoverflow.com/a/12827643/230513
 * @see https://stackoverflow.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);
            }
        });
    }
}
于 2012-10-10T20:19:17.983 回答