【发布时间】:2016-10-25 18:49:29
【问题描述】:
您好,我想要以下用户界面:
当用户点击开始时,我想在这些元素下面动态添加JPanel。像这样的东西:
我能够在一个空的JFrame 中生成网格,但是当我尝试添加它时,当JFrame 中有更多元素时,它会出现,但非常小。
这是我尝试过的代码。 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);
}
动态添加网格:
@Override
public void actionPerformed(ActionEvent ae) {
// ...
this.view.jfrm.add(new Grid());
this.view.jfrm.revalidate();
this.view.jfrm.repaint();
}
这是 Grid 类:
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,如this answer 所示。第一张图像将通过将空白面板作为初始卡片来实现。 2) 为了尽快获得更好的帮助,请发布minimal reproducible example 或Short, Self Contained, Correct Example。 3)public class Grid extends JPanel{这个组件应该覆盖getPreferredSize()作为布局的建议.. -
在这个用户界面中不需要动态 JPanel。您可以并且应该显示一个空网格,以便用户知道在他/她填写字段时会发生什么。一般来说,先创建 Swing 组件,然后使用 Swing 组件。
-
@Andrew Thompson,感谢您的回答和建议。我已经能够通过覆盖 getPreferredsize() 来做到这一点。如果我使用 CardLayout 会有什么优势?
-
1) 对于初学者来说,
jfrm.setSize(1000, 1000);完全没有必要,因为一旦添加了空白面板和非空白面板,代码就可以简单地调用pack(),但要进入它是太长的评论。 2) 顺便说一句 - 这不是答案,而是评论。
标签: java swing jpanel paintcomponent