2016-11-01 2 views
0

Ich arbeite derzeit an einem Java-Projekt, das aus einem Rahmen, Haupt-Panel und 3 Sub-Panels besteht. Auf der Nordseite des Hauptpanels habe ich mein DataPanel, auf der Westseite habe ich mein buttonPanel und in der mitte ich habe meine drawPanelJava JPanel JFrame bekommen Höhe und Breite

Mein DrawPanel sollte eine Initiale von 5 Kreisen anzeigen und wenn create button geklickt wird, sollte X Anzahl der Kreise zeichnen, die vom Benutzer angegeben werden. Ich möchte jedoch, dass die Kreismittelpunkte nur in DrawPanel sichtbar sind, dh nicht mehr als die Hälfte eines Kreises wird abgeschnitten. Ich möchte keine Länge und Breite festlegen, um sie dynamisch im Verhältnis zur Rahmen-/Panelgröße zu machen.

Hier ist mein Code

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); 

} 

und

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); 
    } 
} 

Antwort

2

ist es trotzdem, es dynamisch relativ

Sie ein AncestorListener in dem Rahmen/Panel-Größe zu machen das Panel und behandeln das ancestorAdded Ereignis. Dieses Ereignis wird generiert, wenn das Panel einer sichtbaren GUI hinzugefügt wird.

Dies bedeutet, dass Ihre create(...)-Methode von dieser Methode (nicht der Konstruktor) aufgerufen werden muss. Dann, wenn der Code ausgeführt wird, können Sie die getWidth() und getHeight() Methoden des Panels verwenden, um die tatsächliche Größe des Panels zu erhalten und Ihre Verarbeitung durchzuführen.

+0

hm ok Ich habe noch nicht Ahnenlistener verwendet, aber ich werde es versuchen –