簡體   English   中英

如何使用jpanel與油漆(或重繪)

[英]how to use jpanel with paint (or repaint)

我是油漆/圖形的新手,並想知道如何將JPanel添加到我的代碼中,使得整個圖形將在JPanel而不是JFrame上。

換句話說,我正在嘗試創建一個允許我這樣做的GUI:在右側顯示LEFT側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();
}
}

在此輸入圖像描述

  1. 而不是實現Runnable ,建立一個調用repaint()ActionListener 從Swing Timer調用它。
  2. 有兩種方法可以做到這一點。
    • 擴展JComponentJPanel
    • BufferedImage繪制並將其添加到JLabelImageIcon
  3. 如果擴展組件,則在不需要添加其他子項時使用JComponent如果需要則使用JPanel 對於其中一個, 重寫paintComponent(Graphics)而不是paint(Graphics)
  4. BufferedImage可能是這個用例的更好選擇,因為它似乎是動畫(假設是故意持續的)一系列行。
  5. Swing GUI應該在EDT上啟動。
  6. 不要調用setBounds 相反,將首選大小設置為自定義組件,為文本區域的構造函數使用合理值,並將它們與布局(以及適當的填充和邊框)組合,然后在添加所有組件后在框架上調用pack()
  7. 如果JRE在Thread啟動之前調用repaint()則會有一個NPE。

..問題是什么? 哦,對,如果可以推斷出問題是“如何將其他組件與自定義繪制的組件結合起來?” - 使用嵌套布局。 請參閱嵌套布局示例

如果使用BufferedImage作為后備存儲,您可以將其放置在該示例中的圖像中,除了您將遺漏JTable以及JSplitPane

閱讀自定義繪畫的Swing教程,了解正確的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM