2012-02-17 127 views
3

我有一套JLabel s,每個包含一個字母(通過seText()),不透明和背景設置爲白色,JPanelGridLayout,因此標籤形成一個表。 我正在做一個簡單的動畫突出顯示某些行和列,然後有交集。我可以使用標籤setBackground()來達到此目的,但是如果能夠使用Graphics對象(也許在交叉點周​​圍繪製一個圓,然後清除它),我認爲我會有更多「選擇」。 我試圖擴展JLabel,或直接在JPanel上繪圖(在方法中使用getGraphics()),但它不起作用,我認爲繪圖在這種情況下是在標籤後面。我無法弄清楚在哪種情況下應該放置「繪畫」代碼,屏幕上什麼也不顯示。如何在JPanel上的JLabel上「繪製」?

簡而言之,像下面這樣的方法,可以用來在標籤上繪製?
它應該是JLabel還是JPanel方法?

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

我不是100%肯定究竟是什麼影響你試圖實現,但聽起來好像你最好通過繪製JLabel的'paintComponent(...)'方法。爲什麼不創建[sscce](http://sscce.org)並向我們展示您嘗試過的內容? – 2012-02-17 12:40:24

+2

這是什麼我錯了?請使用[SSCCE](http://sscce.org/)編輯您的問題 – mKorbel 2012-02-17 12:40:38

+1

請說明您正在嘗試做什麼而不是長篇大論。 – Juvanis 2012-02-17 12:46:09

回答

4

如果你所覆蓋paintChildren()

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

如果我把繪圖代碼放在JPanel的paintChildren ()圖形會顯示。但是如果我想在方法調用上繪製和刪除,如何在paintChildren()之外獲取子圖形上下文?或者我應該將繪畫代碼放在paintChildren()中,並且每次都依賴於繪製/刪除的條件? – meno 2012-02-17 13:32:17

+0

我不確定你想實現什麼,但是你可以在BufferedImage中繪製所有的內容並使用它。 – StanislavL 2012-02-17 13:39:10

+0

我只是試圖能夠編寫方法,可以繪製JLabels的網格,例如drawSomething(x,y),並清除它(作爲動畫的一部分)。 通過「使用」你的意思是指BufferedImage,在繪圖之後將它添加到面板上? – meno 2012-02-17 13:58:14

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 2017-06-25 19:52:58

+0

@Tommy:很高興這個例子有所幫助。感謝您的讚賞和其他保持微笑:-) – 2017-07-15 16:36:21

0

使用的paintComponent(圖形克)用塗料(圖形克)。這將畫在GUI上