1
안녕 스윙 추가합니다. 이런 식으로 뭔가 : JPanel에 동적으로 나는 다음과 같은 사용자 인터페이스를 가지고 싶습니다
내가 빈 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();
}
덕분에 미리에게!
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()를 오버라이드해야합니다. –
이 사용자 인터페이스에는 동적 JPanel이 필요하지 않습니다. 사용자가 필드를 채울 때 예상되는 것을 알 수 있도록 빈 그리드를 표시 할 수 있고 표시해야합니다. 일반적으로 Swing 구성 요소를 만든 다음 Swing 구성 요소를 사용합니다. –
@Andrew Thompson, 귀하의 답변과 조언에 감사드립니다. getPreferredsize()를 재정의 (override) 할 수있었습니다. CardLayout을 사용하면 어떤 이점이 있습니까? – Spirrow