2012-02-17 11 views
3

JLabelのセットを持っていて、それぞれがJPanelGridLayoutの文字を含む(seText()経由で)、不透明で背景が白に設定されているので、ラベルがテーブルを形成しています。 私は、特定の行と列を強調表示し、そこに交差点を表示する簡単なアニメーションを行っています。私はこの目的のためにsetBackground()のラベルを使うことができますが、Graphicsオブジェクトを使うことができればもっと選択肢があると思っていました。 JLabel、または直接JPanelの図を伸ばしようとしましたが(方法ではgetGraphics()を使用しています)、動作しませんでした。この場合、図面はラベルの後ろにあると思います。どちらの場合でも「塗装」コードをどこに配置すればいいのか分かりません。画面に何も表示されません。JPanelでJLabelを「ペイントする」方法は?

要するに、以下のような方法でラベルの上に描画することができますか?
JLabelまたはJPanelメソッドである必要がありますか?既存のJComponentの

の上に特定の図面をペイントするのJLayeredPaneをしようとする場合があります

public void drawsomething() { 
    Graphics2D g2d = (Graphics2D) getGraphics(); 
    g2d.fillRect(100, 100, 100, 100); 
    } 
+4

私は100%確かにあなたが達成しようとしているが、あなたがJLabelの 'paintComponent(...)'メソッドで描画するのに最適であるかのように聞こえます。なぜあなたは[sscce](http://sscce.org)を作り、何を試してみたのですか? –

+2

私は間違っていますか? [SSCCE](http://sscce.org/) – mKorbel

+1

であなたの質問を編集してください。長い話をするのではなく、何をしようとしているのかを明示してください。 – Juvanis

答えて

4

ここでの例を参照してください?

protected void paintChildren(Graphics g) { 
    super.paintChildren(g); 
//paint your lines here 
} 
+0

私はJPanelのpaintChildren ()図面が表示されます。しかし、メソッド呼び出しをペイントして削除したければ、どのようにしてpaintChildren()の外で子グラフィックコンテキストを取得できますか?または、paintChildren()にペイントコードを配置し、毎回描画/削除の条件に依存する必要がありますか? – meno

+0

あなたが達成したいことはわかりませんが、BufferedImage内のすべてのコンテンツをペイントして使用することができます。 – StanislavL

+0

私は、例えばのJLabel、drawSomething(x、y)のグリッド上に描画できるメソッドを書くことができるようにしよう、と(アニメーションの一部として)、それをクリアしています。 BufferedImageを「使用する」とは、描画後にパネルに追加することを意味しますか? – meno

2

私は本当にまだものを描画についてあまり知らないが、ちょうどあなたがうまくいけば、あなたはそれからいくつかの情報を得ることができ、見するための一つの小さなサンプルコードを作成しました。 JLabel you can use it's paintComponent(Graphics g)メソッドで塗りつぶすために。

サンプルコード:代わりに、塗料の

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class DrawingOnJLabel extends JFrame 
{ 
    private CustomLabel label; 
    private int flag = 1; 
    private JPanel contentPane; 

    public DrawingOnJLabel() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 

     contentPane = new JPanel(); 
     contentPane.setBackground(Color.WHITE); 
     label = new CustomLabel(200, 200); 
     label.setLabelText("A"); 
     label.setValues(50, 50, 100, 100, 240, 60); 

     final JButton button = new JButton("CLEAR"); 
     button.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent ae) 
      { 
       SwingUtilities.invokeLater(new Runnable() 
       { 
        public void run() 
        { 
         if (flag == 1)    
         { 
          label.setFlag(flag); 
          flag = 0; 
          button.setText("REPAINT"); 
          contentPane.revalidate(); 
          contentPane.repaint(); 
         } 
         else if (flag == 0) 
         { 
          label.setFlag(flag); 
          flag = 1; 
          button.setText("CLEAR"); 
          contentPane.revalidate(); 
          contentPane.repaint(); 
         } 
        } 
       }); 
      } 
     });  

     contentPane.add(label); 

     add(contentPane, BorderLayout.CENTER); 
     add(button, BorderLayout.PAGE_END); 
     setSize(300, 300); 
     setVisible(true); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new DrawingOnJLabel(); 
      } 
     }); 
    } 
} 

class CustomLabel extends JLabel 
{ 
    private int sizeX; 
    private int sizeY; 
    private int x, y, width, height, startAngle, arcAngle; 
    private int flag = 0; 
    private String text; 

    public CustomLabel(int sX, int sY) 
    { 
     sizeX = sX; 
     sizeY = sY; 
    } 

    // Simply call this or any set method to paint on JLabel. 
    public void setValues(int x, int y, int width, int height, int startAngle, int arcAngle) 
    { 
     this.x = x; 
     this.y = y; 
     this.width = width; 
     this.height = height; 
     this.startAngle = startAngle; 
     this.arcAngle = arcAngle; 
     repaint(); 
    } 

    public void setFlag(int value) 
    { 
     flag = value; 
     repaint(); 
    } 

    public Dimension getPreferredSize() 
    { 
     return (new Dimension(sizeX, sizeY)); 
    } 

    public void setLabelText(String text) 
    { 
     super.setText(text); 
     this.text = text; 
     flag = 0; 
     repaint(); 
    } 

    public void paintComponent(Graphics g) 
    { 
     if (flag == 0) 
     { 
      g.setColor(Color.RED);   
      g.drawString(text, 20, 20); 
      g.setColor(Color.BLUE); 
      g.drawOval(x, y, width, height); 
      g.fillOval(x + 20, y + 20, 15, 15); 
      g.fillOval(x + 65, y + 20, 15, 15); 
      g.fillRect(x + 40, y + 40, 5, 20); 
      g.drawArc(x + 20, y + 30, 55, 55, startAngle, arcAngle);    
     } 
     else if (flag == 1) 
     { 
      g.clearRect(x, y, width, height); 
     } 
    } 
} 
+0

母、素敵な出力を参照してください。これは私のために物事をクリアしました。 – CodingNinja

+0

@Tommy:例が助けてくれてうれしいです。感謝の気持ちと残りのためにありがとう –

0

使用paintComponent(グラフィックスG)(グラフィックスg)を得ました。それはGUI上にペイントされます

関連する問題