как использовать jpanel с краской (или перекрасить) - PullRequest
3 голосов
/ 26 декабря 2011

Я новичок в рисовании / графике и удивляюсь, как добавить JPanel в мой код так, чтобы вся графика была на JPanel, а не на JFrame.

Другими словами, я пытаюсь создать графический интерфейс, который позволит мне сделать это: на правой стороне покажите красивое движение линий на JPanel на левой стороне добавьте JTextArea (на JPanel), который покажет координацию графики.

  • Это упрощение более крупной проблемы, но я думаю, что код здесь легче понять.

Спасибо !!!

(рисунок ниже, перемещение строк или просто запуск кода)

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import javax.swing.JFrame;

public class Test extends JFrame implements Runnable  
{
    private Line2D line;

public Test()
{
    super("testing");
    this.setBounds( 500, 500, 500, 500 );
    this.setVisible( true );
}

public void paint( Graphics g ) 
{
    Graphics2D g2 = (Graphics2D) g;
    g2.draw(line); 
}

@Override
public void run()
{
    int x=50;
    while (true)
    {
        try
        {
            Thread.sleep( 50 );

            line = new Line2D.Float(100+x, 100+x, 250-x, 260+x%2);
            x++;
            repaint();
            if (x==5000)
                break;

        } catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }
}

public static void main (String args[])
{
    Thread thread = new Thread (new Test());
    thread.start();
}
}

enter image description here

Ответы [ 2 ]

5 голосов
/ 26 декабря 2011
  1. Вместо реализации Runnable установите ActionListener, который вызывает repaint(). Звони с свинга Timer.
  2. Есть 2 способа сделать это.
    • Расширение JComponent или JPanel
    • Нарисуйте BufferedImage и добавьте это к ImageIcon в JLabel.
  3. При расширении компонента используйте JComponent, если вам не нужно добавлять дополнительные дочерние элементы, или JPanel, если вы это делаете. Для любого из них переопределить paintComponent(Graphics) вместо paint(Graphics).
  4. BufferedImage может быть лучшим выбором для этого варианта использования, так как кажется, что он анимирует (предположительно намеренно устойчивый) ряд линий.
  5. Swing GUI должен быть запущен на EDT.
  6. Не звоните setBounds! Вместо этого установите предпочтительный размер для пользовательского компонента, используйте разумные значения для конструктора текстовой области и объедините их с макетами (и соответствующими отступами и границами), а затем вызовите pack() в кадре после добавления всех компонентов.
  7. Существует NPE, если JRE вызывает repaint() до начала Thread.

.. В чем был вопрос? Ах да, если можно сделать вывод, что вопрос в том, «Как объединить другие компоненты с пользовательским нарисованным компонентом?» - использовать вложенный макет. см. пример Nested Layout .

image

Если вы используете BufferedImage в качестве резервного хранилища, вы можете поместить его как изображение в этом примере, за исключением того, что вы пропустите JTable над ним, а также JSplitPane.

2 голосов
/ 26 декабря 2011

Прочтите учебник Swing по Custom Painting , чтобы узнать, как это сделать.

...