通过JScrollPane的JButton

问题描述

我有一段代码,应该在放在JTextArea的{​​{1}}上添加按钮。按钮不在滚动窗格内!

JScrollPane

问题是只要 JScrollPane scrollPane = new JScrollPane(); scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); scrollPane.setBounds(10,340,375,242); contentPane.add(scrollPane); JButton btnClean = new JButton(); btnClean.setBounds(340,341,26,23); contentPane.add(btnClean); taLog = new JTextArea(); taLog.setEditable(false); taLog.setLineWrap(true); taLog.setFont(new Font("Arial",Font.PLAIN,12)); scrollPane.setViewportView(taLog); epInfo = new JEditorPane(); epInfo.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES,Boolean.TRUE); epInfo.setFont(new Font("Tahoma",12)); epInfo.setContentType("text/html"); epInfo.setEditable(false); epInfo.setBackground(null); epInfo.setBorder(null); epInfo.setBounds(10,241,37); setInfoText(); contentPane.add(epInfo); 更改其值按钮就不会刷新-它只是消失-直到我将鼠标光标拖到它上面。我想然后启动了一些JTextArea
我发现可以将repaint()添加到DocumentListener并手动刷新按钮,但是它一直有效,直到滚动条出现在JTextArea中。 我也可以使用

JScrollPane

,但是它被调用了很多次,所有这些刷新都不是必需的。 是否有任何合理(有效)的方法来检查scrollPane.getViewport().addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) {}}); 是否已更改?

enter image description here

解决方法

在这种情况下,空布局很有用,因为主窗口是固定的

不,它没有用。

每次您的代码使用组件的随机数(即,设置大小/位置)时,代码都不容易维护。

我也使用WindowBuilder

由IDE生成的代码无法在另一个IDE中维护。

学习使用布局管理器。使用布局管理器的目的是避免对数字进行硬编码,并使代码在任何环境中均可维护。

只要JTextArea更改其值按钮,问题就不会刷新

contentPane.add(scrollPane);
...
contentPane.add(btnClean);

Swing旨在在添加到同一容器中时以二维方式显示组件。

如果要以二维方式显示组件,则需要具有父/子关系:

- content pane
    - text area
        button

因此,代码应类似于:

textArea.setLayout( new FlowLayout(FlowLayout.RIGHT) );
//contentPane.add(btnClean);
textArea.add(btnClean);

注意:您可以配置FlowLayout以删除顶部和右侧的间距。

问题在于该按钮将覆盖显示在文本区域中的所有文本。

因此,更好的解决方案是将按钮设置在文本区域的外部。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...