gpt4 book ai didi

java - JPanel 将正确显示按钮,但无法正确显示自定义 JComponent

转载 作者:行者123 更新时间:2023-11-30 05:06:38 27 4
gpt4 key购买 nike

我有一个扩展JComponentCell类。目标是显示一组单元格,并且每个单元格都能够处理自己的点击事件等。它基本上是一个平面按钮。

当我向 JPanel 添加多个单元格时,仅显示其中一个单元格。如果使用相同的代码,我用按钮替换单元格,一切都会按预期工作。

我错过了什么?

主要方法

public static void main(String[] args){
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(new Dimension(300,300));
JPanel jp = new JPanel();
jp.setLayout(new GridLayout(1, 3));
if(true){//Use buttons instead of cells
jp.add(new JButton("Button 1"));
jp.add(new JButton("Button 2"));
jp.add(new JButton("Button 3"));
}
else{ //Use cells instead of buttons
Cell a = new Cell(10,0,0);
Cell b = new Cell(10,0,1);
Cell c = new Cell(10,0,2);
jp.add(a,0);
jp.add(b,1);
jp.add(c,2);
}

f.add(jp);
f.setVisible(true);
}

细胞类别

public class Cell extends JComponent{
private static int numCells=0;
private Dimension size;
private int dt;
private int dl;
private Color color;
public Cell(int size, int dt, int dl){
numCells++;
Random rand = new Random();
this.size = new Dimension(size,size);
this.dt = dt;
this.dl = dl;
this.color = new Color(//Random color, but only in one :r, g, or b
(numCells%3==0)?rand.nextInt(255):0,
(numCells%3==1)?rand.nextInt(255):0,
(numCells%3==2)?rand.nextInt(255):0
);
this.setPreferredSize(this.size);
this.setMaximumSize(this.size);
this.setMinimumSize(this.size);
this.setBackground(color);
this.setVisible(true);
this.setOpaque(true);
}
public void amClicked(){
JOptionPane.showMessageDialog(this.getParent(),
this.toString());
}

public String toString(){
return ""+dt+","+dl;
}
public void paintComponent(Graphics g){
Graphics ng = g.create();
try{
super.paintComponent(ng);
ng.setColor(color);
System.out.println(String.format("%d,%d,%d,%d(%d,%d,%d)",
this.getX(), this.getY(), this.getWidth(), this.getHeight(),
this.color.getRed(),this.color.getGreen(),this.color.getBlue()));
ng.fillRect(this.getX(), this.getY(), this.getWidth(), this.getHeight());
}
finally{
ng.dispose();
}
}


}

最佳答案

您要添加 3 个组件,但只有一个被漆成黑色。向单元格添加红线边框以查看:

  public Cell(int size, int dt, int dl) {
numCells++;
//.... code deleted

// !!this.color = new Color(Color.BLACK); // *** won't compile!
color = Color.black;

//.... code deleted

this.setOpaque(true);
setBorder(BorderFactory.createLineBorder(Color.red, 2)); // **** add this
}

编辑:这条线对我来说看起来很粗略:

     g.fillRect(this.getX(), this.getY(), this.getWidth(), this.getHeight());

为什么在这里使用 getX 和 getY ?这些方法返回相对于容器而不是单元格的位置信息,但是随后您使用它来绘制相对于单元格而不是容器的位置,因此黑色矩形将从可见单元格中绘制出来,这可能是不是你想要的。也许您需要对两者都使用 0:

     g.fillRect(0, 0, this.getWidth(), this.getHeight());

关于java - JPanel 将正确显示按钮,但无法正确显示自定义 JComponent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4909749/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com