Как добавить поведение пунктирной рамки к тексту JLabel
?
Я попробовал это
JLabel search = new JLabel("<html><marquee>Search</marquee><html>");
но не работа.
См. http: //forums.sun .com / thread.jspa? forumID = 57 & threadID = 605616 для получения подробной информации о том, как это сделать:)
(Изменить: я бы, вероятно, использовал System.currentTimeMillis () непосредственно внутри метода paint () вместо использования timer, а затем разделите / по модулю (%), чтобы получить его в требуемом диапазоне для 'смещения x' в примерах).Увеличивая размер числа деления, вы можете изменить скорость ((System.currentTimeMillis () / 200)% 50).
(Редактировать 2: я только что обновил приведенный ниже код, чтобы исправить проблему с перерисовкой. Теперь мы планируем перерисовку в методе рисования; может быть, есть способ получше, но это работает :))
(Редактировать 3: Errr, Я попробовал использовать более длинную строку, и это испортилось. Это легко исправить (снова увеличьте диапазон по ширине, чтобы компенсировать отрицательные значения, вычтите по ширине)
package mt;
import java.awt.Graphics;
import javax.swing.Icon;
import javax.swing.JLabel;
public class MyJLabel extends JLabel {
public static final int MARQUEE_SPEED_DIV = 5;
public static final int REPAINT_WITHIN_MS = 5;
/**
*
*/
private static final long serialVersionUID = -7737312573505856484L;
/**
*
*/
public MyJLabel() {
super();
// TODO Auto-generated constructor stub
}
/**
* @param image
* @param horizontalAlignment
*/
public MyJLabel(Icon image, int horizontalAlignment) {
super(image, horizontalAlignment);
// TODO Auto-generated constructor stub
}
/**
* @param image
*/
public MyJLabel(Icon image) {
super(image);
// TODO Auto-generated constructor stub
}
/**
* @param text
* @param icon
* @param horizontalAlignment
*/
public MyJLabel(String text, Icon icon, int horizontalAlignment) {
super(text, icon, horizontalAlignment);
// TODO Auto-generated constructor stub
}
/**
* @param text
* @param horizontalAlignment
*/
public MyJLabel(String text, int horizontalAlignment) {
super(text, horizontalAlignment);
// TODO Auto-generated constructor stub
}
/**
* @param text
*/
public MyJLabel(String text) {
super(text);
}
/* (non-Javadoc)
* @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
*/
@Override
protected void paintComponent(Graphics g) {
g.translate((int)((System.currentTimeMillis() / MARQUEE_SPEED_DIV) % (getWidth() * 2)) - getWidth(), 0);
super.paintComponent(g);
repaint(REPAINT_WITHIN_MS);
}
}
Также можно попробовать использовать прокси-сервер для сквозной записи, который поддерживается, поскольку SVN 1.5 работает нормально.
С этой настройкой у вас есть главный и подчиненный репозиторий.
Подчиненное репо действует как локальный кэш чтения, в то время как фиксация будет передана через прокси на главный сервер и синхронизирована обратно.
Это решение поставляется с subversion/apache.
Дополнительные сведения см. в блоге svndevelopers . Или превосходная книга SVN , или последняя, но не менее важная, тренировка администратора субтренирования презентации
-121--2708687-Пробовали ли вы Node Access или Content Access ?
-121--3579186- Как вы обнаружили, HTML на JLabel ограничен форматированием и не поддерживает < область >
тэгов. Для изменения текста каждые несколько миллисекунд необходимо использовать функцию SwingWorker
или ExecisingService
.
hier - быстрое грязное решение. Если вам нужно, я могу уточнить код в некоторых моментах.
package gui;
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
public class ScrollLabel extends JPanel {
private static final long serialVersionUID = 3986350733160423373L;
private final JLabel label;
private final JScrollPane sPane;
private final ScrollMe scrollMe;
public ScrollLabel(String text) {
setLayout(new GridLayout(1, 1));
label = new JLabel(text);
sPane = new JScrollPane(label);
sPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
JScrollBar horizontalScrollBar = new JScrollBar(JScrollBar.HORIZONTAL);
sPane.setHorizontalScrollBar(horizontalScrollBar);
setBorder(BorderFactory.createLineBorder(Color.RED));
add(sPane.getViewport());
scrollMe = new ScrollMe(this, label, sPane);
scrollMe.start();
}
class ScrollMe extends Thread {
JScrollPane sPane;
ScrollLabel parent;
JLabel label;
ScrollMe(ScrollLabel parent, JLabel label, JScrollPane sPane) {
this.sPane = sPane;
this.parent = parent;
this.label = label;
}
boolean isRunning = true;
@Override
public void run() {
int pos = 0;
try {
while (isRunning) {
if (sPane.isVisible()) {
int sWidth = parent.getSize().width;
int lWidth = label.getWidth();
if (sWidth < lWidth) {
if (pos + sWidth > lWidth)
pos = 0;
sPane.getHorizontalScrollBar().setValue(pos);
}
}
synchronized (this) {
wait(50);
pos += 1;
}
}
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally {
isRunning = false;
}
}
}
public static void main(String[] args) {
JFrame jFrame = new JFrame("ScrollLabel");
jFrame.getContentPane().add(new ScrollLabel("how to add marquee behaviour to Jlabel !Java"));
jFrame.setVisible(true);
}
}
Это отлично работает (я написал это сам, поэтому могут быть некоторые ошибки):
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class JMarqueeLabel extends JPanel implements Runnable
{
/**
*
*/
private static final long serialVersionUID = -2973353417536204185L;
private int x;
private FontMetrics fontMetrics;
public static final int MAX_SPEED = 30;
public static final int MIN_SPEED = 1;
private int speed;
public static final int SCROLL_TO_LEFT = 0;
public static final int SCROLL_TO_RIGHT = 1;
private int scrollDirection = 0;
private boolean started = false;
private JLabel label;
public JMarqueeLabel(String text)
{
super();
label = new JLabel(text)
{
/**
*
*/
private static final long serialVersionUID = -870580607070467359L;
@Override
protected void paintComponent(Graphics g)
{
g.translate(x, 0);
super.paintComponent(g);
}
};
setLayout(null);
add(label);
setSpeed(10);
setScrollDirection(SCROLL_TO_RIGHT);
}
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
label.paintComponents(g);
}
public void setScrollDirection(int scrollDirection)
{
this.scrollDirection = scrollDirection;
}
public int getScrollDirection()
{
return scrollDirection;
}
public void setSpeed(int speed)
{
if (speed < MIN_SPEED || speed > MAX_SPEED)
{
throw new IllegalArgumentException("speed out of range");
}
this.speed = speed;
}
public int getSpeed()
{
return speed;
}
@Override
public void validateTree()
{
System.out.println("Validate...");
super.validateTree();
label.setBounds(0, 0, 2000, getHeight());
if (!started)
{
x = getWidth() + 10;
Thread t = new Thread(this);
t.setDaemon(true);
t.start();
started = true;
}
}
public String getText()
{
return label.getText();
}
public void setText(String text)
{
label.setText(text);
}
public void setTextFont(Font font)
{
label.setFont(font);
fontMetrics = label.getFontMetrics(label.getFont());
}
@Override
public void run()
{
fontMetrics = label.getFontMetrics(label.getFont());
try
{
Thread.sleep(100);
} catch (Exception e)
{
}
while (true)
{
if (scrollDirection == SCROLL_TO_LEFT)
{
x--;
if (x < -fontMetrics.stringWidth(label.getText()) - 10)
{
x = getWidth() + 10;
}
}
if (scrollDirection == SCROLL_TO_RIGHT)
{
x++;
if (x > getWidth() + 10)
{
x = -fontMetrics.stringWidth(label.getText()) - 10;
}
}
repaint();
try
{
Thread.sleep(35 - speed);
} catch (Exception e)
{
}
}
}
}
Это работает для очень длинных строк. Если вам нужны более длинные строки, вам нужно изменить 2000
на большее число.
Надеюсь, это именно то, что вам нужно: -)
Я нашел в Интернете решение , которое работает, по крайней мере, для меня: -)