Font font=new Font("Serif",Font.BOLD|Font.ITALIC,24);
FontRenderContext frc=scratchG2.getFontRenderContext(); TextLayout t1=new TextLayout(text,font,frc); Rectangle2D textBounds=t1.getBounds(); int textWidth=(int)Math.ceil(textBounds.getWidth()); int textHeight=(int)Math.ceil(textBounds.getHeight()); int horizontalPad=10; int verticalPad=6;
To OnlyFor_love(有生之年,狭路相逢,终不能幸免.....) 我看了你的运行结果,可那不是我想要的,你的那个结果是自动产生运动的文字,我的问题是怎样才能拖动滚动条来使内容移动呀
To OnlyFor_love(有生之年,狭路相逢,终不能幸免.....) 我看了你的运行结果,可那不是我想要的,你的那个结果是自动产生运动的文字,我的问题是怎样才能拖动滚动条来使内容移动呀
To OnlyFor_love(有生之年,狭路相逢,终不能幸免.....) 我看了你的运行结果,可那不是我想要的,你的那个结果是自动产生运动的文字,我的问题是怎样才能拖动滚动条来使内容移动呀
妹妹你的那个程序没问题啊,正如happyegg所说是因为你的“aaa”太少了,打多几个就可以出了
我明白妹妹你的意思,你所需要的功能java没有提供。如果policy设成always,它也只是显示滚动条在那儿,上面有没有滚动块,要看这个JScrollPane的viewport里能不能放下你要显示的东西。 如果你非要让它在即时只有一个“a”的时候也能滚动(这好像有点象Excel),那只有一个办法了:JScrollBar bar = scrollPane.getHorizontalScrollBar(); BoundedRangeModel model = bar.getModel(); model.addChangeListener(listener);自己实现一个ChangeListener,比较model.getValue()的返回值和最小、最大值,如果滑动块已经到了尽头,就增加那个label的size。至于增加多少,就看你自己的需要了,Excel就是一次加一行或一列。不知道行不行,试试吧。
并且设置值就行了应该!
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.awt.image.*;public class ScrollText extends JComponent
{
private BufferedImage image;
private Dimension imageSize;
private volatile int currOffset;
private Thread internalThread;
private volatile boolean noStopRequested;
public ScrollText(String text)
{
currOffset=0;
buildImage(text);
this.setMinimumSize(imageSize);
this.setPreferredSize(imageSize);
this.setMaximumSize(imageSize);
this.setSize(imageSize);
noStopRequested=true;
Runnable r=new Runnable()
{
public void run()
{
try
{
runWork();
}
catch(Exception e)
{
e.printStackTrace();
}
}
};
internalThread=new Thread(r,"ScrollText");
internalThread.start();
}
private void buildImage(String text)
{
//请求绘制时,打开反锯齿,并运用高质量选项
RenderingHints renderHints=new RenderingHints(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
renderHints.put(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY);
//创建一幅临时图像,用于判断文件的大小
BufferedImage scratchImage=new BufferedImage(1,1,BufferedImage.TYPE_INT_RGB);
Graphics2D scratchG2=scratchImage.createGraphics();
scratchG2.setRenderingHints(renderHints);
Font font=new Font("Serif",Font.BOLD|Font.ITALIC,24);
FontRenderContext frc=scratchG2.getFontRenderContext();
TextLayout t1=new TextLayout(text,font,frc);
Rectangle2D textBounds=t1.getBounds();
int textWidth=(int)Math.ceil(textBounds.getWidth());
int textHeight=(int)Math.ceil(textBounds.getHeight());
int horizontalPad=10;
int verticalPad=6;
imageSize=new Dimension(textWidth+horizontalPad,textHeight+verticalPad);
//创建适当大小的图像
image=new BufferedImage(imageSize.width,imageSize.height,BufferedImage.TYPE_INT_RGB);
Graphics2D g2=image.createGraphics();
g2.setRenderingHints(renderHints);
int baselineOffset=(verticalPad/2)-((int)textBounds.getY());
g2.setColor(Color.white);
g2.fillRect(0,0,imageSize.width,imageSize.height);
g2.setColor(Color.blue);
t1.draw(g2,0,baselineOffset);
//立即释放资源,但保持动画显示图像
scratchG2.dispose();
scratchImage.flush();
g2.dispose();
}
public void paint(Graphics g)
{
//不论当前大小,确保裁减边缘
g.setClip(0,0,imageSize.width,imageSize.height);
int localOffset=currOffset; //以防改变
g.drawImage(image,-localOffset,0,this);
g.drawImage(image,imageSize.width-localOffset,0,this);
//绘制轮廓
g.setColor(Color.black);
g.drawRect(0,0,imageSize.width-1,imageSize.height-1);
}
private void runWork()
{
while(noStopRequested)
{
try
{
Thread.sleep(100); //每秒10帧
//调整滚动位置
currOffset=(currOffset+1)%imageSize.width;
//通知事件线程调用paint()
repaint();
}
catch(InterruptedException e)
{
Thread.currentThread().interrupt();
}
}
}
public void stopRequest()
{
noStopRequested=false;
internalThread.interrupt();
}
public boolean isAlive()
{
return internalThread.isAlive();
}
public static void main(String args[])
{
ScrollText st=new ScrollText("Java can do animation!");
JPanel p=new JPanel(new FlowLayout());
p.add(st);
JFrame f=new JFrame("ScrollText Demo");
f.setContentPane(p);
f.setSize(400,100);
f.setVisible(true);
}
}
我看了你的运行结果,可那不是我想要的,你的那个结果是自动产生运动的文字,我的问题是怎样才能拖动滚动条来使内容移动呀
我看了你的运行结果,可那不是我想要的,你的那个结果是自动产生运动的文字,我的问题是怎样才能拖动滚动条来使内容移动呀
我看了你的运行结果,可那不是我想要的,你的那个结果是自动产生运动的文字,我的问题是怎样才能拖动滚动条来使内容移动呀
如果你非要让它在即时只有一个“a”的时候也能滚动(这好像有点象Excel),那只有一个办法了:JScrollBar bar = scrollPane.getHorizontalScrollBar();
BoundedRangeModel model = bar.getModel();
model.addChangeListener(listener);自己实现一个ChangeListener,比较model.getValue()的返回值和最小、最大值,如果滑动块已经到了尽头,就增加那个label的size。至于增加多少,就看你自己的需要了,Excel就是一次加一行或一列。不知道行不行,试试吧。
新手请教,谢谢
把JTextArea放在JScrollPane里,在JTextArea上调用scrollRectToVisible方法textArea.scrollRectToVisible(new Rectangle(0, textArea.getHeight(), 0, 0));