2016-11-01 162 views
0

我目前正在研究一個由框架,主面板和3個子面板組成的java項目。在主面板的北部,我有我的dataPanel,在西部我有我的buttonPanel和中心我有我的drawPanelJava JPanel JFrame獲取高度和寬度

我的DrawPanel應該顯示5個圓圈的初始值,每當點擊創建按鈕時,它應該繪製X用戶指定的圓圈數量。不過,我希望圓心點在DrawPanel內全部可見,這意味着從面板上切除不超過任何圓的1/2。無論如何,我不希望設置長度和寬度,以使其相對於框架/面板尺寸呈動態。

這裏是我的代碼

public class MainPanel extends JPanel{ 

private DataPanel data; 
private JPanel buttonPanel; 
private DrawPanel dPanel; 

private JButton create; 
private JButton sort; 
private JButton coCenter; 
private JButton reset; 

public MainPanel() 
{ 

    setLayout(new BorderLayout()); 

    data = new DataPanel(); 
    add(data, BorderLayout.NORTH); 

    buttonPanelInitialize(); 
    add(buttonPanel,BorderLayout.WEST); 

    int a,b,c; 
    a = data.getDataField(); 
    b = data.getDataField1(); 
    c = data.getDataField2(); 
    dPanel = new DrawPanel(a,b,c); 
    add(dPanel, BorderLayout.CENTER); 

} 

private void buttonPanelInitialize() 
{ 
    buttonPanel = new JPanel(); 
    buttonPanel.setLayout(new GridLayout(4,1)); 
    buttonCreate(); 
    buttonSort(); 
    buttonCoCenter(); 
    buttonReset(); 

    buttonPanel.add(create); 
    buttonPanel.add(sort); 
    buttonPanel.add(coCenter); 
    buttonPanel.add(reset); 

} 

private void buttonCreate() 
{ 
    create = new JButton("Create"); 
    class cListener implements ActionListener 
    { 
     @Override 
     public void actionPerformed(ActionEvent event) { 

      //int amount = 0; 
      int amount = data.getDataField(); 
      int smallestR = data.getDataField1(); 
      int largestR = data.getDataField2(); 

      dPanel.create(amount,smallestR,largestR); 
     } 
    } 

    ActionListener createListener = new cListener();  
    create.addActionListener(createListener); 

} 

public class DrawPanel extends JPanel{ 

private ArrayList<ColorCircle> circles; 
private int numberOfCircles; 
private int smallestRadiusSize; 
private int biggestRadiusSize; 
private int width; 
private int height; 
public DrawPanel() 
{ 

    circles = new ArrayList<ColorCircle>(); 

} 
public DrawPanel(int number, int smallestRadius, int biggestRadius) 
{ 

    circles = new ArrayList<ColorCircle>(); 
    create(number,smallestRadius,biggestRadius); 
    width = (int)Math.random()*getWidth(); 
    height = (int)Math.random()*getHeight(); 
} 

public void create(int number, int smallestRadius, int biggestRadius) 
{ 
    numberOfCircles = number; 
    smallestRadiusSize = smallestRadius; 
    biggestRadiusSize = biggestRadius; 
    for(int i = 0; i < numberOfCircles ; i++) 
    { 
     int radius = (int) ((int)smallestRadiusSize+Math.random()*((int)biggestRadiusSize-(int)smallestRadiusSize+1)); 
     width = (int) ((int)100+Math.random()*701); //the problem is here 
     height = (int) ((int)100+Math.random()*501); //and here this part should be dynamic 
     circles.add(new ColorCircle(width,height,radius)); 
     System.out.println(smallestRadiusSize); 
     System.out.println(biggestRadiusSize); 
     System.out.println(radius+"-----"); 
     System.out.println(circles.size()); 
     System.out.println(width+" THis is x"); 
     System.out.println(height+" THIs is Y"); 
     repaint(); 
    } 
} 

public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D) g; 
    for(ColorCircle c : circles) 
    { 
     c.fill(g2); 
    } 
} 

回答

2

反正是有使其相對於機架/面板尺寸

動態您添加AncestorListener到面板並處理ancestorAdded事件。當面板添加到可見的GUI時,將會生成此事件。

所以這意味着你的create(...)方法需要從這個方法(而不是構造函數)調用。然後,在執行代碼時,可以使用面板的getWidth()getHeight()方法來獲取面板的實際大小並進行處理。

+0

hm好吧我以前沒有使用ancestorlistener,但我會試試看 –