问题描述
我有一段代码,应该在放在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)
{}});
是否已更改?
解决方法
在这种情况下,空布局很有用,因为主窗口是固定的
不,它没有用。
每次您的代码使用组件的随机数(即,设置大小/位置)时,代码都不容易维护。
我也使用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以删除顶部和右侧的间距。
问题在于该按钮将覆盖显示在文本区域中的所有文本。
因此,更好的解决方案是将按钮设置在文本区域的外部。