2011-10-05 76 views
2

我的問題:我有一個RoundedPanel類延伸JPanel並重寫paintComponent()方法,以便在面板上繪製圓角。我創建了MyPanel類,它擴展了RoundedPanel設置BorderLayout和paintComponent()調用

當我使用FlowLayout佈局在MyPanel上放置面板時,會出現圓角邊框。 爲了使面板上的組件被調整大小以便它們填滿最大空間,我將FlowLayout替換爲Borderlayout。但是,從來沒有調用paintComponent()方法,並且不再顯示四捨五入的邊框。

有誰知道如何創建一個圓形面板,其組件被拉伸以填充窗口大小時的空間?有人可以解釋爲什麼在使用Borderlayout時不調用paintComponent()方法嗎?

在此先感謝。

的代碼:

import java.awt.BasicStroke; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class Demo extends JFrame { 

    public static final int WINDOW_WIDTH = 540; 
    public static final int WINDOW_HEIGHT = 540; 
    private static MyPanel myPanel; 

    private Demo() { 
     super(); 
     myPanel = new MyPanel(); 
     getContentPane().add(myPanel); 
     setSize(new Dimension(500, 500)); 
     setPreferredSize(new Dimension(500, 500)); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new Demo(); 
    } 
} 

class MyPanel extends RoundedPanel { 

    private JPanel rootPanel = new JPanel(); 

    public MyPanel() { 
     super(); 
     rootPanel = buildRootPanel(); 
     rootPanel.setPreferredSize(new Dimension(400, 400)); 
     rootPanel.setBackground(Color.RED); 
     add(rootPanel); 

     // When uncommented, the Textfield is correctly resized to fit all available space , but the rounder border doesnt appear 
     //setLayout(new BorderLayout()); 
     //add(rootPanel, BorderLayout.CENTER); 
    } 

    private JPanel buildRootPanel() { 
     rootPanel.setLayout(new BorderLayout()); 
     JTextField field = new JTextField(); 
     rootPanel.add(field, BorderLayout.CENTER); 
     return rootPanel; 
    } 
} 

class RoundedPanel extends JPanel { 

    protected int strokeSize = 1;//Stroke size. it is recommended to set it to 1 for better view 
    private Color strokeColor = Color.BLACK; 
    protected Color shadowColor = Color.black;//Color of shadow 
    protected boolean shady = true;// Sets if it drops shadow 
    protected boolean highQuality = true;// Sets if it has an High Quality view 
    protected Dimension arcs = new Dimension(20, 20);// Double values for Horizontal and Vertical radius of corner arcs 
    protected int shadowGap = 5;// Distance between shadow border and opaque panel border 
    protected int shadowOffset = 4; // The offset of shadow. 
    protected int shadowAlpha = 150;// The transparency value of shadow. (0 - 255) 

    public RoundedPanel() { 
     super(); 
     setOpaque(false); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 

     System.out.println("++++++++++++++ in paintComponent"); 
     super.paintComponent(g); 
     int width = getWidth(); 
     int height = getHeight(); 
     int shadowGap = this.shadowGap; 
     Color shadowColorA = new Color(shadowColor.getRed(), shadowColor.getGreen(), shadowColor.getBlue(), shadowAlpha); 
     Graphics2D graphics = (Graphics2D) g; 

     //Sets antialiasing if HQ. 
     if (highQuality) { 
      graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     } 

     //Draws shadow borders if any. 
     if (shady) { 
      graphics.setColor(shadowColorA); 
      graphics.fillRoundRect(
       shadowOffset,// X position 
       shadowOffset,// Y position 
       width - strokeSize - shadowOffset, // width 
       height - strokeSize - shadowOffset, // height 
       arcs.width, arcs.height);// arc Dimension 
     } else { 
      shadowGap = 1; 
     } 

     //Draws the rounded opaque panel with borders. 
     graphics.setColor(getBackground()); 
     graphics.fillRoundRect(0, 0, width - shadowGap, height - shadowGap, arcs.width, arcs.height); 
     //graphics.setColor(getForeground()); 
     graphics.setColor(strokeColor); 

     graphics.setStroke(new BasicStroke(strokeSize)); 
     graphics.drawRoundRect(0, 0, width - shadowGap, height - shadowGap, arcs.width, arcs.height); 

     //Sets strokes to default, is better. 
     graphics.setStroke(new BasicStroke()); 
    } 
} 
+0

+1 [sscce](http://sscce.org/)。 – trashgod

回答

4

貌似字段佔據面板的所有空間。如果孩子覆蓋所有父母和父母不可見,則不需要調用paintComponent(),因此不會調用它。 嘗試向內容添加空邊框。

+0

我試圖添加一個空的邊框,但圓角邊框仍然沒有出現。 –

+1

@ user980340設置emptyborder工作區,一定要足夠大,f.i. 10在每個方向 – kleopatra

+0

在MyPanel類中,我添加了以下行: setBorder(BorderFactory.createEmptyBorder(20,20,20,20)); 現在它工作:出現圓角邊框並自動調整組件大小。非常感謝StanislavL和kleopatra! –