2014-09-10 2 views
0

첫 번째 JPanel에 설정된 값을 반환하고 RYSUJ 버튼을 클릭하여 두 번째 JPanel을 다시 칠하고 싶습니다.다른 패널의 값으로 JPanel을 새로 고침

내 주요 클래스 :

public static void main(String[] args) throws IOException { 
     FractalFrame gui = new FractalFrame(); 
     gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     gui.setVisible(true); 
    } 

프레임 :

public class FractalFrame extends JFrame { 

     public FractalFrame() { 

     setTitle("Fractalz beta"); 
     setSize(800, 600); 
     setResizable(false); 

     FractalzGUI gui = new FractalzGUI(); 

     FractalJPanel panel = new FractalJPanel(gui.kol, gui.zoom, gui.radio); 
     this.add(panel); 
     this.add(gui, BorderLayout.EAST); 

     } 

    } 

GUI를 클래스 (그것의 첫번째 JPanel의) :

public class FractalzGUI extends JPanel implements ActionListener { 

private JRadioButton mandelbrotRadio = new JRadioButton("Zbiór Mandelbrota"); 
private JRadioButton shipRadio = new JRadioButton("Płonący statek"); 
private JLabel ustawZoom = new JLabel("zoom: "); 
private JTextField zoomtf = new JTextField("", 5); 
private JLabel wyborKoloru = new JLabel("Wybierz kolor: "); 
private String[] kolory = {"zolty", "niebieski", "czerwony", "zielony", "brazowy", "fioletowy"}; 
private JComboBox listaKolorow = new JComboBox(kolory); 
private JButton rysuj = new JButton("Rysuj!"); 
public int radio=0; //1 = mandelbrot, 2 = ship 
public int zoom=0; 
public int kol=0; 


public FractalzGUI() { 

    this.setLayout(new GridBagLayout()); 
    GridBagConstraints gbc = new GridBagConstraints(); 
    gbc.insets = new Insets(0, 0, 0, 0); 
    gbc.gridx = 0; 
    gbc.gridy = 0; 
    this.add(mandelbrotRadio, gbc); 
    gbc.gridy = 1; 
    this.add(shipRadio, gbc); 

    gbc.gridx = 0; 
    gbc.gridy = 2; 
    this.add(ustawZoom, gbc); 
    gbc.gridx = 1; 
    this.add(zoomtf, gbc); 
    gbc.gridx = 0; 
    gbc.gridy = 3; 
    this.add(wyborKoloru, gbc); 
    gbc.gridx = 1; 
    this.add(listaKolorow, gbc); 
    gbc.gridx = 0; 
    gbc.gridy = 4; 
    this.add(rysuj, gbc); 

    mandelbrotRadio.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 

      shipRadio.setSelected(false); 
     } 
    }); 

    shipRadio.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 

      mandelbrotRadio.setSelected(false); 
     } 

    }); 



    rysuj.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 

      if (mandelbrotRadio.isSelected()) { 

       radio = 1; 

      } else if (shipRadio.isSelected()) { 

       radio = 2; 

      } 

      if(zoomtf.getText().equals("")) zoom=0; 
      else zoom=Integer.parseInt(zoomtf.getText());     

      switch(listaKolorow.getSelectedIndex()){ 
       case 0: 
        kol = 40; 
        break; 
       case 1: 
        kol = 165; 
        break; 
       case 2: 
        kol = 256; 
        break; 
       case 3: 
        kol = 105; 
        break; 
       case 4: 
        kol = 20; 
        break; 
       case 5: 
        kol = 200; 
        break; 
      } 




     } 


    }); 



} 

@Override 
public void actionPerformed(ActionEvent e) { 
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
} 

} 
+0

두 번째 패널이 표시되지 않고 어디서 붙어 있습니까? 당신의 문제를 어디에서 해결하려고합니까? –

+0

프레임에서 두 번째 JPanel (이름이 지정된 패널)을 초기화하는 것을 볼 수 있습니다. 두 번째 패널의 코드를 보낼 필요가 없습니다. init에 관한 것입니다. 나는 3 개의 변수를 반환하고 싶다. 즉, 콜, 줌, 라디오를 GUI에서 불러오고 두 번째 패널을 새 값으로 새로 고침 – Wyrzeu

+0

내 대답이 맞습니까? 그것에 대해 질문이 있으십니까? –

답변

2
내가 매개 변수를 보낼 수있는 간단한 솔루션을 필요로

스윙을 잊어 버리십시오. GUI를 잊어 버리십시오. 한 객체가 다른 객체의 상태를 변경하는 가장 쉬운 방법은 첫 번째 객체가 두 번째 객체의 메소드를 호출하여 정보를 전달하는 것입니다. 하나의 클래스가 다른 클래스의 인스턴스를 보유해야하고, 필요에 따라 두 번째 전달 정보에서 첫 번째 메소드를 호출해야합니다. 이것은 하나의 클래스의 인스턴스를 다른 클래스의 인스턴스로 전달하여 FractalFrame 생성자에서 모두 설정할 수 있습니다.

필요하다면 두 가지를 서로 전달할 수도 있지만, 이것은 커플 링을 상당히 조여줍니다. 즉,


FractalzGUI gui = new FractalzGUI(); FractalJPanel panel = new FractalJPanel(gui.kol, gui.zoom, gui.radio); // obviously these classes need setter methods gui.setFractalJPanel(panel); this.add(panel); this.add(gui, BorderLayout.EAST); 

편집 전문과 순수 주의자에 의해 호출

... 더 나은 아직, 당신의 GUI의 기초가되는 논리를 보유하고 별도의 비 GUI 모델 클래스를 사용합니다. 뷰 클래스 (GUI 클래스)가 모델에 리스너를 등록하도록 허용 한 다음 한 클래스가 모델을 변경하면 모든 리스너에 알림을 보내 모델을 상태로 쿼리 한 다음 그에 따라 뷰를 조정할 수 있습니다.

+1

모델이 오기를 바랍니다.) – MadProgrammer

+0

@MadProgrammer : yep –

+2

Objective C 및 iOS로 게임을 시작 했으므로 모델, 컨트롤러 및보기를 분리하지 않으면 서둘러 보냅니다. 어둠의 정장과 어둠의 밴에서의 음영 : P – MadProgrammer

관련 문제