为什么JTextArea加到JScrollPane中当文本宽度超过自身的宽度没有自动显示水平滚动条
文本长度超过自身的长度垂直滚动条没有随之滚动ReceivejPanel = new JPanel();
AnchorLayout ReceivejPanelLayout = new AnchorLayout(); getContentPane().add(ReceivejPanel, BorderLayout.NORTH); ReceivejPanel.setLayout(ReceivejPanelLayout); ReceivejPanel.setPreferredSize(new java.awt.Dimension(492, 173));
{
ReceivejLabel = new JLabel();
ReceivejPanel.add(ReceivejLabel, new AnchorConstraint(26, 208, 135, 1, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
AnchorLayout ReceivejLabelLayout = new AnchorLayout();
ReceivejLabel.setLayout(ReceivejLabelLayout);
ReceivejLabel.setText("\u63a5\u6536\u6d88\u606f\u7a97\u53e3");
ReceivejLabel.setFont(new java.awt.Font("KaiTi_GB2312",3,16));
ReceivejLabel.setForeground(new java.awt.Color(0,255,255));
ReceivejLabel.setPreferredSize(new java.awt.Dimension(102, 19));
}
{
ReceivejScrollPane = new JScrollPane();
ReceivejPanel.add(ReceivejScrollPane, new AnchorConstraint(170, 1001, 997, 1, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
ReceivejScrollPane.setPreferredSize(new java.awt.Dimension(492, 143));
{
ReceivejTextArea = new TextAreacvp(); ReceivejScrollPane.getViewport().add(ReceivejTextArea,null);
ReceivejTextArea.setPreferredSize(new java.awt.Dimension(474, 141));
ReceivejTextArea.setEditable(false);
ReceivejTextArea.setBackground(new java.awt.Color(192,192,192));
ReceivejTextArea.setForeground(new java.awt.Color(0,0,255));
ReceivejTextArea.setLineWrap(true);
}
}
文本长度超过自身的长度垂直滚动条没有随之滚动ReceivejPanel = new JPanel();
AnchorLayout ReceivejPanelLayout = new AnchorLayout(); getContentPane().add(ReceivejPanel, BorderLayout.NORTH); ReceivejPanel.setLayout(ReceivejPanelLayout); ReceivejPanel.setPreferredSize(new java.awt.Dimension(492, 173));
{
ReceivejLabel = new JLabel();
ReceivejPanel.add(ReceivejLabel, new AnchorConstraint(26, 208, 135, 1, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
AnchorLayout ReceivejLabelLayout = new AnchorLayout();
ReceivejLabel.setLayout(ReceivejLabelLayout);
ReceivejLabel.setText("\u63a5\u6536\u6d88\u606f\u7a97\u53e3");
ReceivejLabel.setFont(new java.awt.Font("KaiTi_GB2312",3,16));
ReceivejLabel.setForeground(new java.awt.Color(0,255,255));
ReceivejLabel.setPreferredSize(new java.awt.Dimension(102, 19));
}
{
ReceivejScrollPane = new JScrollPane();
ReceivejPanel.add(ReceivejScrollPane, new AnchorConstraint(170, 1001, 997, 1, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
ReceivejScrollPane.setPreferredSize(new java.awt.Dimension(492, 143));
{
ReceivejTextArea = new TextAreacvp(); ReceivejScrollPane.getViewport().add(ReceivejTextArea,null);
ReceivejTextArea.setPreferredSize(new java.awt.Dimension(474, 141));
ReceivejTextArea.setEditable(false);
ReceivejTextArea.setBackground(new java.awt.Color(192,192,192));
ReceivejTextArea.setForeground(new java.awt.Color(0,0,255));
ReceivejTextArea.setLineWrap(true);
}
}
怎么我的这样一个例子就可以?
import javax.swing .*;
public class Test extends JFrame
{
public Test()
{
JPanel contentPane = (JPanel) this.getContentPane(); JTextArea jTAinput = new JTextArea();
JScrollPane jScrollPane1 = new JScrollPane();
contentPane.add(jScrollPane1, null);
jScrollPane1.getViewport().add(jTAinput, null); this.setVisible(true);
}
public static void main(String args[])
{
Test t = new Test();
}
}
ReceivejScrollPane.getViewport().add(ReceivejTextArea,null);换成: ReceivejScrollPane.setViewportView(ReceivejTextArea);
@Override
public void run() {
resultArea.setSelectionStart(resultArea.getText().length());
}
};
Timer timer = new Timer();
timer.schedule(task, 0, 1000);
ReceivejScrollPane.getViewport().add(ReceivejTextArea);
这样就可以了
JScrollBar bar = ReceivejScrollPane.getVerticalScrollBar();
bar.setValue(bar.getMaximum());
楼主试试看.
ReceivejTextArea.setPreferredSize(new java.awt.Dimension(474, 141));
问题在这里。一定要要设置大小的话,给滚动视图设置大小,不要给里面的设置。
你要知道,scrollpane里面的viewport需要计算可见区域以及视图整个区域,计算出滚动条需要滚动到哪里。你把里面的一部分重置,却又不完全,滚动条当然就会出现一些你所谓的怪异现象了。jtextarea不直接管理滚动,但是实现scrollable接口:Dimension getPreferredScrollableViewportSize()
返回视图组件视口的首选大小。
int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction)
显示逻辑行或列的组件应计算滚动增量,它将根据方向的值完全公开一个行块或列块。
boolean getScrollableTracksViewportHeight()
如果视口总是强制此 Scrollable 的高度与视口高度匹配,则返回 true。
boolean getScrollableTracksViewportWidth()
如果视口总是强制此 Scrollable 的宽度与视口宽度匹配,则返回 true。
int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction)
显示逻辑行或列的组件应计算滚动增量,它将根据方向的值完全公开一个新的行或列。
去看一下文档,最好看一下源码,你就会有深刻理解了
import javax.swing.*;
import javax.swing.SwingUtilities;
import java.awt.*;public class A extends JFrame { /**
* @param args
*/
private JTextArea jta = new JTextArea();
private JScrollPane jsp = new JScrollPane();
JPanel jp = new JPanel(); public A() {
jta.setPreferredSize(new Dimension(100, 100));
// jsp.setPreferredSize(new Dimension(300,400));
jsp.getViewport().add(jta, null);
// jp.setPreferredSize(new Dimension(200,400));
//jp.add(jsp);
this.getContentPane().add(jsp);
} public static void run(final JFrame frame, final int width, final int height) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
frame.setSize(width, height);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
});
} public static void main(String[] args) {
// TODO Auto-generated method stub
run(new A(), 200, 300);
}}
ReceivejTextArea.setLineWrap(true);
改为
ReceivejTextArea.setLineWrap(false);