我正在使用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();
}
});
}
}
一种简单、“笨拙”的解决方案
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 更好。