2016-11-01 127 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,但我会试试看 –