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

时间:2015-06-07 14:58:49

标签: java swing layout-manager

我正在制作一个简单的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中的文字正在移动。我无法弄清楚如何解决这个问题。也许它们之间有一些组件?欢迎任何建议和帮助。

2 个答案:

答案 0 :(得分:3)

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

在这种情况下,我会假设发生的事情是这样的:BoxLayout通常使用最小/最大尺寸,而不是首选尺寸,JTextArea的最小值/最大值是基于它的文字内容。随着文本的变化,重新计算大小,因此布局也会发生变化。

一般情况下,如果您有文字区域,则应将其放在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 PanesHow 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);
    }
};

答案 1 :(得分:1)

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

其中,

  • jTextArea - 您JTextArea class
  • 的名称对象
  • jLabel - 您JLabel class
  • 的名称对象

您在textarea中添加文本,标签中的文字正在更改。我想,这段代码可以帮助您确定问题。