2016-12-11 1 views
0

Bisher habe ich es so den Code erstellt zwei Frames: ein Frame, wo die DrawingComponent und ein Frame mit interaktiven Schaltflächen darauf platziert wird. Derzeit kann der Benutzer zwischen dem Zeichnen einer Linie, eines Rechtecks ​​oder einer Ellipse wählen. Ich habe MouseActionListener für die DrawingComponent eingerichtet, so dass das Zeichnen jeder Form individuell funktioniert.Versuchen Sie, eine Jframe-Klasse und eine Jcomponent-Klasse zu interagieren, wenn der Benutzer eine JCheckBox prüft


public class DrawingViewer extends JFrame { 

private JFrame controlFrame; 
private JButton drawButton, fillButton, undoButton; 
private JCheckBox lineBox, recBox, ellipseBox; 
private JLabel drawLabel, fillLabel; 
private DrawingComponent component; 

public DrawingViewer() { 
    setupThisFrame();  
    setupControlFrame(); 
    setupButtons(); 
    showFrames(); 
} 

.... 

fillLabel = new JLabel(); 
    fillLabel.setOpaque(true); 
    fillLabel.setFont(new Font("Consolas", Font.PLAIN,12)); 
    fillLabel.setForeground(Color.BLACK); 
    fillLabel.setBackground(null); 
    if(fillLabel.getBackground() != null){ 
     fillLabel.setText("   "); 
    } 
    else{ 
     fillLabel.setText(" nothing "); 
    } 

.... 

class shapeCheckListener implements ActionListener{ 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == lineBox){ 
      System.out.println("Line Chosen"); 
      component.setLine(); 
     } 
     else if (e.getSource() == recBox){ 
      System.out.println("Rectangle Chosen"); 
      component.setRec(); 
     } 
     else if (e.getSource() == ellipseBox){ 
      System.out.println("Ellipse Chosen"); 
      component.setEllipse(); 
     } 
     } 
    }  
} 

---------------------------------------------------------- 
public class DrawingComponent extends JComponent { 

private int mouseX; 
private int mouseY; 
private int mouseX2; 
private int mouseY2; 
public Shape shape; 
public Color borderColor; 
public Color fillColor; 

public DrawingComponent() { 
    setupMouse(); 
} 

@Override 
public void paintComponent(Graphics g){ 

    Graphics2D g2 = (Graphics2D) g; 

    if(shape != null){ 
     g2.draw(shape); 
    } 
    else{ 
     shape = null; 
    } 

} 

public void setLine(){ 
    shape = new Line2D.Double(mouseX, mouseY, mouseX2, mouseY2); 
} 
public void setRec(){ 
    shape = new Rectangle(Math.min(mouseX, mouseX2), Math.min(mouseY, mouseY2) , Math.abs(mouseX - mouseX2), Math.abs(mouseY - mouseY2)); 
} 
public void setEllipse(){ 
    shape = new Ellipse2D.Double(Math.min(mouseX, mouseX2), Math.min(mouseY, mouseY2), Math.abs(mouseX - mouseX2), Math.abs(mouseY - mouseY2)); 
} 
+0

Wo ist Javascript? – Viney

Antwort

1

Der Rahmen ist nur eine Hülle. Es sollte keine Daten bezüglich der App enthalten. In der Tat müssen Sie JFrame überhaupt nicht erweitern.

Ihre Zeichenbereiche sollten eine Methode zum Ändern der Eigenschaften der Klasse haben. Dann können Sie ein Schaltflächenfeld erstellen, das Zugriff auf die Zeichenbereichsklasse hat. Wann immer Sie eine Form ändern möchten, benachrichtigen Sie dann einfach den Zeichenbereich der Änderung.

Beispiele für diesen Ansatz finden Sie in Custom Painting Approaches. Dieses Beispiel hat nur eine Eigenschaft "color", die geändert werden kann. Sie müssen also eine "Form" -Eigenschaft hinzufügen.

Verwandte Themen