gpt4 book ai didi

java - 如何在不使用 NullLayout 的情况下以循环方式在 JPanel 上定位对象?

转载 作者:行者123 更新时间:2023-11-29 03:12:20 24 4
gpt4 key购买 nike

所以我的问题是这样的:我有一个扩展 JProgressBar 的类,基本上它看起来像一个闪烁的圆圈(它也根据分配给该指示器的任务数量分成多个部分,我需要每次我将指示器切换到下一个任务时都使用 setUI,这很糟糕,但现在可以了)。我需要将其中的 37 个圆圈放在 JPanel 上,以便它们形成自己的圆圈。现在我这样做:

private void addToPane(JPanel pane){
pane.setLayout(null);
Insets insets = pane.getInsets();
int width = pane.getWidth();
int height = pane.getHeight();
Dimension size = new Dimension(30, 30);
//Dimension mid = new Dimension(width/2, height/2);
Dimension mid = new Dimension(200, 250);
int r = 210;
double revox, revoy, angle = -Math.PI/2;
double revangle = 2*Math.PI/37;
for(int i=1; i<38; i++){
FlashingIndicator templabel = new FlashingIndicator();
templabel.setPreferredSize(size);
templabel.setUI(new ProgressIndicator(flash, 0, false));
templabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
indicate.add(templabel);
revox = r*Math.cos(angle);
revoy = r*Math.sin(angle);
indicate.get(i - 1).setBounds(insets.left + mid.width + (int) revox, insets.top + mid.height + (int) revoy, size.width, size.height);
pane.add(indicate.get(i - 1));
angle-=revangle;
}
}

不用说:这很糟糕。我想根据面板的大小定位它们,但是当在 createUIComponents() 中调用函数时(我使用 IntelliJ Idea 的 GUI 生成器)- 面板尚未正确创建,所以 getWidth() 只返回 0。出于显而易见的原因,使用 200 和 250 这样的随机数是不好的。似乎普遍的共识是:空布局不好,我不应该使用它。那么问题来了:

我应该使用哪个 LayoutManager 来正确定位指示器?我能想到的就是 GridLayout,但我现在的做法是指标很好地重叠了一点,使用网格会使它看起来很粗糙。如果我不能为此使用管理器 - 我怎样才能让它依赖于面板的大小?

现在看起来像这样:

最佳答案

覆盖 paintDeterminate()自定义方法 BasicProgressBarUI呈现您的指标;查看相关示例 here .您可以缩放渲染,如图所示 here , 以填充组件的方式;这将消除对组件内部自定义布局管理器的需要。覆盖 getPreferredSize(),如讨论的那样 here , 这样您的自定义进度指示器就可以与封闭布局一起正常工作。

image

image

关于java - 如何在不使用 NullLayout 的情况下以循环方式在 JPanel 上定位对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28657964/

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