java swing如何固定JTextArea的百分比大小使其不改变?

问题描述 投票:0回答:1

我正在使用Java Swing的GridBagLayout开发GUI界面,其中我使用JTextArea,将其添加到JScrollPane后将其设置为左侧的40%,将JScrollPane添加到60%后将右侧设置为JList。当我第一次打开JTextArea时,JList组件是正常的,但是当我将文本粘贴到JTextArea时,JTextArea的大小发生了变化,这困扰了我很长时间。

请问stackoverflow的大神如何解决这个问题。如何保证无论我在JTextArea中输入什么内容,无论表单有多大,JTextArea始终保证为40%,JList始终保证为60%。

有时候,当我最大化窗口和最小化窗口时,可能会改变一会儿,然后一会儿JTextArea的宽带又会被拉长。这真的很令人沮丧,我不知道该怎么办。

我用的是GridBagLayout,不知道是不是哪里调整不对。

一开始我以为是GridBagLayout参数设置的问题。其他人已经将weightx设置为1.0,所以我也将其设置为1.0。一开始我用的是0.4和0.6。两者都设置为1.0,这样比例就是50%,但这并没有帮助,输入文本后JTextArea的大小仍然会变宽。我又调整回来了。

其他人说使用 new JTextArea(20,10) 来指定行和列,但我也尝试过,但不起作用。

我找到原因了,就是这个代码,原因是我在textArea中添加了insert和change、delete监听事件。我向这些事件添加了一个函数,将 JLabel 的内容设置为 TextArea 中的单词数,然后就发生了这种情况。但我还没解决。

package jlist.demo;

import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
import org.fife.ui.rtextarea.RTextArea;
import org.fife.ui.rtextarea.RTextScrollPane;

import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;

public class TestWinFrame2 extends JFrame {

    RTextArea textArea;
    RTextScrollPane scrollForTextArea;

    RTextArea textArea2;
    RTextScrollPane ScrollForTextArea2;

    JPanel leftPanel;

    JList jList;
    JScrollPane listScrollPane;

    JLabel wordNumberLabel;
    JToolBar toolBar;

    public TestWinFrame2() {
        GridBagLayout gridBagLayout = new GridBagLayout();
        setLayout(gridBagLayout);

        toolBar = new JToolBar(JToolBar.HORIZONTAL);

        // Add the toolbar to the panel, not the frame or contentPane
        GridBagConstraints bag = new GridBagConstraints();
        bag.anchor = GridBagConstraints.NORTHWEST; // Adjust the position of the toolbar
        bag.gridx = 0;
        bag.gridy = 0;
        bag.gridheight = 1;
        bag.gridwidth = 2;
        bag.weightx = 1.0; // Make the toolbar span the whole width of the panel
        bag.fill = GridBagConstraints.HORIZONTAL; // Make the toolbar fill the horizontal space
        wordNumberLabel = new JLabel("word-count");
        toolBar.add(wordNumberLabel);

        add(toolBar, bag);


        textArea = new RSyntaxTextArea();
        textArea.setLineWrap(true);
        textArea.setWrapStyleWord(true);
        scrollForTextArea = new RTextScrollPane(textArea);
        GridBagConstraints gbc_ScrollForTextArea = new GridBagConstraints();
        gbc_ScrollForTextArea.anchor = GridBagConstraints.WEST;
        gbc_ScrollForTextArea.fill = GridBagConstraints.BOTH;
        gbc_ScrollForTextArea.gridx = 0;
        gbc_ScrollForTextArea.gridy = 1;
        gbc_ScrollForTextArea.gridheight = 1;
        gbc_ScrollForTextArea.gridwidth = 1;
        gbc_ScrollForTextArea.weightx = 0.3d;
        gbc_ScrollForTextArea.weighty = 0.5d;
        add(scrollForTextArea, gbc_ScrollForTextArea);


        textArea2 = new RSyntaxTextArea();
        textArea2.setLineWrap(true);
        textArea2.setWrapStyleWord(true);
        ScrollForTextArea2 = new RTextScrollPane(textArea2);
        textAreaAddInsertListener();
        GridBagConstraints gbc_ScrollForTextArea2 = new GridBagConstraints();
        gbc_ScrollForTextArea2.anchor = GridBagConstraints.WEST;
        gbc_ScrollForTextArea2.fill = GridBagConstraints.BOTH;
        gbc_ScrollForTextArea2.gridx = 0;
        gbc_ScrollForTextArea2.gridy = 2;
        gbc_ScrollForTextArea2.gridheight = 1;
        gbc_ScrollForTextArea2.gridwidth = 1;
        gbc_ScrollForTextArea2.weightx = 0.3d;
        gbc_ScrollForTextArea2.weighty = 0.5d;
        add(ScrollForTextArea2, gbc_ScrollForTextArea2);

        jList = new JList();
        listScrollPane = new JScrollPane(jList);
        GridBagConstraints gbc_listScrollPane = new GridBagConstraints();
        gbc_listScrollPane.anchor = GridBagConstraints.WEST;
        gbc_listScrollPane.fill = GridBagConstraints.BOTH;
        gbc_listScrollPane.gridx = 1;
        gbc_listScrollPane.gridy = 1;
        gbc_listScrollPane.gridheight = 2;
        gbc_listScrollPane.gridwidth = 1;
        gbc_listScrollPane.weightx = 1.0d;
        gbc_listScrollPane.weighty = 1.0d;
        add(listScrollPane, gbc_listScrollPane);


        setSize(1200, 800);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public void textAreaAddInsertListener() {
        textArea.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent e) {
                System.out.println("insertUpdate---------------");
                wordNumberLabel.setText(textArea.getText().length() + "");
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                System.out.println("removeUpdate---------------");
                wordNumberLabel.setText(textArea.getText().length() + "");
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                System.out.println("changedUpdate---------------");
                wordNumberLabel.setText(textArea.getText().length() + "");
            }
        });
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestWinFrame2();
            }
        });
    }

}

java swing user-interface gridbaglayout
1个回答
0
投票

一种简单、“笨拙”的解决方案

public MyGridBagLayout extends GridBagLayout {
  public void layoutContainer(Container parent) {
    super.layoutContainer(parent);
    // Now check the TextArea is the taking up the correct amount of space
    // And if not, adjust it and the Component to the right
  }
}

就像我已经承认的那样,这是一个拼凑。但在我看来,你花在学习掌握 Swing 上的时间比学习 CSS 3 更好。

© www.soinside.com 2019 - 2024. All rights reserved.