2016-11-01 3 views
0

В настоящее время я работаю над проектом java, который состоит из рамки, главной панели и трех подпанелей. На севере от основной панели у меня есть моя датапанель, на западе у меня есть моя кнопкаПанель и в центре у меня есть drawPanelJava JPanel JFrame получение высоты и ширины

My 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. Это событие будет создано, когда панель будет добавлена ​​в видимый графический интерфейс.

Это значит, что ваш метод create(...) должен быть вызван этим методом (а не конструктором). Затем, когда код выполняется, вы можете использовать методы панели getWidth() и getHeight(), чтобы получить фактический размер панели и выполнить обработку.

+0

hm ok Я еще не использовал precestlerlistener, но я дам ему попробовать –

Смежные вопросы