2016-06-23 7 views
1

안녕 스윙 추가합니다. 이런 식으로 뭔가 : enter image description hereJPanel에 동적으로 나는 다음과 같은 사용자 인터페이스를 가지고 싶습니다

내가 빈 JFrame에 그리드를 생성 할 수 있어요,하지만 난 더가 나타납니다 JFrame 내부 요소,하지만 아주 작은있을 때 추가하려고 할 때.

이것은 내가 시도한 코드입니다.

@Override 
public void actionPerformed(ActionEvent ae) { 
    // ... 
    this.view.jfrm.add(new Grid()); 
    this.view.jfrm.revalidate(); 
    this.view.jfrm.repaint(); 

} 

이 그리드 클래스 : 클래스 UITable은 버튼과 입력 텍스트

public UITable(){ 

    jfrm = new JFrame("Plants experiment"); 
    jfrm.setLayout(new FlowLayout()); 
    jfrm.setSize(1000, 1000); 
    jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    //JLabel titles for input texts 
    JLabel jlab_plants = new JLabel(" Enter nº plants: "); 
    JLabel jlab_time = new JLabel(" Enter evolution time: "); 
    jlab_prueba = new JLabel(""); 

    //Input texts 
    jtf_plants = new JTextField(10); 
    jtf_plants.setActionCommand("numPlants"); 
    jtf_time = new JTextField(10); 
    jtf_time.setActionCommand("time"); 

    //Buttons 
    jbtnStart = new JButton("Start"); 

    //Add components 
    jfrm.add(jlab_plants); 
    jfrm.add(jtf_plants); 
    jfrm.add(jlab_time); 
    jfrm.add(jtf_time); 
    jfrm.add(jbtnStart); 
    jfrm.add(jlab_prueba); 

    //Set visibility 
    jfrm.setVisible(true); 
} 

동적으로 그리드를 추가 생성

public class Grid extends JPanel{ 
//Change Point to Plant in order to have a different color for each object 
private List<Plant> fillCells; 

public Grid() { 
    //fillCells = new ArrayList<>(25); 
    fillCells = PlantsControler.myPlants; 
} 

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    System.out.println("Width: "+getWidth()+" Height: "+ getHeight()); 
---- //Returns Width: 10 Height: 10 ------ 
    g.clearRect(0, 0, getWidth(), getHeight()); 
    for (Plant fillCell : fillCells) { 
     int cellX = 10 + (fillCell.getX() * 10); 
     int cellY = 10 + (fillCell.getY() * 10); 
     g.setColor(fillCell.getColor()); 
     g.fillRect(cellX, cellY, 10, 10); 
    } 
    g.setColor(Color.BLACK); 
    g.drawRect(10, 10, 800, 500); 

    for (int i = 10; i <= 800; i += 10) { 
     g.drawLine(i, 10, i, 510); 
    } 

    for (int i = 10; i <= 500; i += 10) { 
     g.drawLine(10, i, 810, i); 
    } 
} 

public void fillCell(int x, int y, Color color) { 
    fillCells.add(new Plant(x, y, color)); 
    repaint(); 
} 

public void fillCell(Plant plant){ 
    fillCells.add(plant); 
    repaint(); 
} 
public void fillCell(){ 
    repaint(); 
} 

public void clearGrid(){ 
    fillCells.clear(); 
} 

덕분에 미리에게!

+0

1) ['CardLayout' (http://download.oracle.com/javase/8/docs/api/java/awt/CardLayout.html)이 않음]에 도시 된 바와 같이, (사용 http://stackoverflow.com/a/5786005/418556). 첫 번째 이미지는 첫 번째 카드로 빈 패널을 사용하여 얻을 수 있습니다. 2) 더 나은 도움을 받으려면 [MCVE] 또는 [Short, Self Contained, Correct Example] (http://www.sscce.org/)를 게시하십시오. 3)'public class Grid는 JPanel을 확장합니다. {'이 컴포넌트는 레이아웃에 대한 제안으로 getPreferredSize()를 오버라이드해야합니다. –

+1

이 사용자 인터페이스에는 동적 JPanel이 필요하지 않습니다. 사용자가 필드를 채울 때 예상되는 것을 알 수 있도록 빈 그리드를 표시 할 수 있고 표시해야합니다. 일반적으로 Swing 구성 요소를 만든 다음 Swing 구성 요소를 사용합니다. –

+0

@Andrew Thompson, 귀하의 답변과 조언에 감사드립니다. getPreferredsize()를 재정의 (override) 할 수있었습니다. CardLayout을 사용하면 어떤 이점이 있습니까? – Spirrow

답변

0

다음과 같이 시도해 볼 수 있습니다.

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class DemoFrame extends JFrame { 

    JTextField field = new JTextField(); 

    public DemoFrame() { 
     setLayout(new BorderLayout()); 
     JPanel controlsPane = new JPanel(new FlowLayout()); 
     controlsPane.add(new JLabel("I m a Label")); 
     field.setPreferredSize(new Dimension(100,20)); 
     controlsPane.add(field); 
     JButton button = new JButton("I am add drawPanel"); 
     controlsPane.add(button); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent paramActionEvent) { 
       DemoFrame.this.add(new DrawPanel(), BorderLayout.CENTER); 
       DemoFrame.this.revalidate(); 
      } 
     }); 
     add(controlsPane,BorderLayout.NORTH); 
    } 

    public static void main(String[] args) { 
     DemoFrame frame = new DemoFrame(); 
     frame.setVisible(true); 
     frame.pack(); 
    } 

    class DrawPanel extends JPanel { 

     @Override 
     protected void paintComponent(Graphics g) { 
      // TODO Auto-generated method stub 
      super.paintComponent(g); 
      g.setColor(Color.BLUE); 
      g.drawString(field.getText(), this.getWidth()/2, this.getHeight()/2); 
     } 
    } 
}