在 JTextArea 中键入时,JLabel 中的文本会移动

When typing into JTextArea, text in JLabel moves

我正在制作一个简单的 GUI,但遇到了问题。 这是我的代码:

JFrame jFrame = new JFrame();
jFrame.setTitle("Simple Editor");
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setLocation(50,50);
jFrame.setResizable(true);

Box box = new Box(BoxLayout.Y_AXIS);

JTextArea jTextArea = new JTextArea();
jTextArea.setPreferredSize(new Dimension(470,500));

JLabel jLabel = new JLabel();

box.add(jTextArea);
box.add(jLabel);

jLabel.setText("Font type : " + Main.fontType + " font size : " + Main.size 
         + " background color : " + Main.backgroundColor
         + " font color : " + Main.fontColor);

jFrame.setContentPane(box);
jFrame.pack();
jFrame.setVisible(true);

当我在 JTextArea 中输入内容时,JLabel 中的文字在移动。我不知道如何解决这个问题。也许他们之间有一些组成部分?欢迎任何建议和帮助。

jTextArea.addKeyListener(new KeyAdapter() {
    @Override
    public void keyTyped(KeyEvent e) {
        jLabel.setText(jTextArea.getText());
    }
});

其中,

  • jTextArea - 你的名字对象 JTextArea class
  • jLabel - 你的名字对象 JLabel class

您在文本区域中添加了文本,但标签中的文本正在发生变化。我认为,这段代码可以帮助您解决问题。

这看起来像是 Box 如何计算大小和位置的产物。请注意,某些组件和布局管理器不使用 setPreferredSize,或仅将其用作提示,或仅将其用作计算的一部分,等等,因此 it cannot be depended upon as a reliable method to set the size of a component.

在这种情况下,我假设发生的事情是这样的:BoxLayout 通常使用 minimum/maximum 尺寸,而不是首选尺寸,min/max [=15] =] 是根据其文本内容计算的。随着文本的变化,大小会重新计算,因此布局也会发生变化。

一般来说,如果你有一个文本区域,你应该把它放在 JScrollPane 中:

Box box = new Box(BoxLayout.Y_AXIS);

JTextArea jTextArea = new JTextArea();

JScrollPane jScrollPane = new JScrollPane(jTextArea);
jScrollPane.getViewport().setPreferredSize(new Dimension(470,500));

JLabel jLabel = new JLabel();

box.add(jScrollPane);
box.add(jLabel);

这样,当 JTextArea 中的文本内容发生变化时,它可以简单地执行其操作,重新计算其大小,并从滚动窗格的一侧流出。

另见 How to Use Scroll Panes, How to Use Text Areas


根据 Andrew 的评论,这里有几种设置滚动窗格初始大小的方法,这些方法可能比显式设置视口的首选大小更可靠:

// specify rows & columns
JTextArea jTextArea = new JTextArea(20, 20);

// specify preferred scrollable viewport size
JTextArea jTextArea = new JTextArea() {
    @Override
    public Dimension getPreferredScrollableViewportSize() {
        return new Dimension(470,500);
    }
};