Как добавить поведение пунктирной рамки к JLabel

Как добавить поведение пунктирной рамки к тексту JLabel?

Я попробовал это

JLabel search = new JLabel("<html><marquee>Search</marquee><html>");

но не работа.

9
задан Joachim Sauer 1 March 2010 в 05:23
поделиться

5 ответов

См. 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);
    }
}
3
ответ дан 3 November 2019 в 03:47
поделиться

Также можно попробовать использовать прокси-сервер для сквозной записи, который поддерживается, поскольку SVN 1.5 работает нормально.

С этой настройкой у вас есть главный и подчиненный репозиторий.

Подчиненное репо действует как локальный кэш чтения, в то время как фиксация будет передана через прокси на главный сервер и синхронизирована обратно.

Это решение поставляется с subversion/apache.

Дополнительные сведения см. в блоге svndevelopers . Или превосходная книга SVN , или последняя, но не менее важная, тренировка администратора субтренирования презентации

-121--2708687-

Пробовали ли вы Node Access или Content Access ?

-121--3579186-

Как вы обнаружили, HTML на JLabel ограничен форматированием и не поддерживает < область > тэгов. Для изменения текста каждые несколько миллисекунд необходимо использовать функцию SwingWorker или ExecisingService .

1
ответ дан 3 November 2019 в 03:47
поделиться

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);
    }
}

0
ответ дан 3 November 2019 в 03:47
поделиться

Это отлично работает (я написал это сам, поэтому могут быть некоторые ошибки):

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 на большее число.

Надеюсь, это именно то, что вам нужно: -)

2
ответ дан 3 November 2019 в 03:47
поделиться

Я нашел в Интернете решение , которое работает, по крайней мере, для меня: -)

1
ответ дан 3 November 2019 в 03:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: