0

我正在开发一个摆动 UI,当工具全屏或有人手动调整大小时,我需要更改 textArea 的大小。

我正在使用 netbeans GUI 构建器,所以显然一切都在 GroupLayout 中。我当前的 GUI 可以说只有文本区域,我没有添加其他组件。所以我们有 JFrame>>JPanel1>>jTextArea ,它锚定在顶部和两侧,所以当我调整工具的大小时,它会水平扩展以填充整个空间,但由于它没有锚定在底部,所以调整大小不会填充底部空间,我在底部留下了一个空白空间..

我已经试了

jPanel1.addComponentListener(new ComponentAdapter() {
        @Override
        public void componentResized(ComponentEvent e) {
            }
    });

我在这里要做的是,如果 JPanel1 的大小发生变化,当我们调整大小时会发生变化.. 它应该被调用并做一些会垂直改变 textArea 大小的事情..

这一切都是为了给你我问题的基础。现在我真正拥有的是Jpanel1。在顶部,我将这个 TextArea 水平锚定在两侧,在它下方我有一个小的 JPanel2 从一侧水平锚定到另一侧以显示一些数据。当我全屏显示时,JPanel2 和 textArea 都会调整大小以完全并排,但在垂直方向上,该 textArea 和 JPanel2 之间会出现一些空白空间。所以我在想的是获得textArea底部和Jpanel2顶部之间那个空间的高度(这也是我不知道该怎么做。)并且在上面提到的方法中我会做一些事情来增加textArea的大小与我发现的空白高度。

这是我的代码:

public class NewJFrame extends javax.swing.JFrame {

/**
 * Creates new form NewJFrame
 */
public NewJFrame() {
    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">//GEN-BEGIN:initComponents
private void initComponents() {

    jPanel1 = new javax.swing.JPanel();
    jScrollPane1 = new javax.swing.JScrollPane();
    jTextArea1 = new javax.swing.JTextArea();
    jPanel2 = new javax.swing.JPanel();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jTextArea1.setColumns(20);
    jTextArea1.setRows(5);
    jScrollPane1.setViewportView(jTextArea1);

    jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("MyBorder"));

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

    javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
    jPanel1.setLayout(jPanel1Layout);
    jPanel1Layout.setHorizontalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(jPanel1Layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addContainerGap())
        .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
    );
    jPanel1Layout.setVerticalGroup(
        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(jPanel1Layout.createSequentialGroup()
            .addGap(57, 57, 57)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(88, 88, 88)
            .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
    );

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addContainerGap())
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addContainerGap())
    );

    pack();
}// </editor-fold>//GEN-END:initComponents

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    /* Set the Nimbus look and feel */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new NewJFrame().setVisible(true);
        }
    });
}

// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextArea jTextArea1;
// End of variables declaration//GEN-END:variables

}

但我不知道该怎么做。我知道还有一些关于此的其他线程,所以请不要将其标记为重复。如果有任何其他解决方案,请帮我找到它..

我已经浏览了其他链接,这些链接以不同的方式显示了这个问题的解决方案。但是由于以下限制,我无法使用它:
1. 我正在使用 NetBeans 的 GUI Builder,它不允许我修改代码当我将元素放在面板和东西上时生成的内容,所有这部分代码都是自动生成的,因此无法修改。
2.我经历过的解决方案都有一个共同点,它们没有任何自动生成的代码。他们正在从头开始建造它。如果我要从头开始,我将能够做到,但这里不是这样。

我想要针对我们无法修改生成的代码但可以动态调整大小的确切场景的解决方案,以便我可以调用一些侦听器并更改大小..

请在这个问题上多多包涵,我知道这么多的限制让像你这样的人在极端情况下需要帮助。

4

1 回答 1

0

看来您的问题与您的 layoutmanager 和 netbeans gui biulder 有关。您可以尝试使用另一个布局管理器,并且边框布局非常适合您的情况。使用合适的布局管理器(例如此处的边界布局),您不需要监听组件调整大小的事件。

public class Example extends JPanel {

    public Example() {
        super(new BorderLayout());
        add(new JScrollPane(new JTextArea()), BorderLayout.CENTER);
    }

    private static void createAndShowGUI() {
        JFrame frame = new JFrame();
        frame.setContentPane(new Example());
        frame.setSize(200, 200);
        frame.setVisible(true);
    }

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

编辑:使用组布局

public class Example extends JFrame {

    private JPanel contentPane;

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater( () -> {
            Example  frame = new Example ();
            frame.setVisible(true);
        } );
    }

    public Example () {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        setContentPane(contentPane);
        JPanel panel = new JPanel();
        JPanel panel_1 = new JPanel();
        panel_1.setBorder(new TitledBorder("JPanel 2"));
        GroupLayout gl_contentPane = new GroupLayout(contentPane);
        gl_contentPane.setHorizontalGroup(
            gl_contentPane.createParallelGroup(Alignment.LEADING)
                .addGroup(gl_contentPane.createSequentialGroup()
                    .addComponent(panel))
                .addComponent(panel_1)
        );
        gl_contentPane.setVerticalGroup(
            gl_contentPane.createParallelGroup(Alignment.LEADING)
                .addGroup(gl_contentPane.createSequentialGroup()
                    .addComponent(panel)
                    .addComponent(panel_1))
        );
        panel.setLayout(new BorderLayout(0, 0));

        JTextArea textArea = new JTextArea();
        panel.add(textArea);
        contentPane.setLayout(gl_contentPane);
    }
}
于 2016-08-27T14:11:38.423 回答