gpt4 book ai didi

java - JLabel 组件保留在屏幕上

转载 作者:行者123 更新时间:2023-11-30 02:29:13 24 4
gpt4 key购买 nike

我正在制作一个非常基本的条形图,它必须显示 6 个值。我遇到的问题是,当我将条放在屏幕上时,一旦它们停留在屏幕上,我就无法将它们取下。我尝试过使用删除、重绘和重新验证功能,但这些都不起作用。

我需要做什么才能移除栅栏,以免它们堵塞?

我的代码:

import javax.swing.*;
import java.awt.*;
import java.util.Collections;

public class BarChart extends JPanel
{
private JLabel[] bars;

public BarChart(int[] data)
{
update(data);
}

public void update(int[] data)
{
this.setSize(190, 155);
this.setLayout(null);

int max = 0;
for (int i = 0; i < 6; i++) {if (data[i] > max) {max = data[i];}}

bars = new JLabel[6];

for (int i = 0; i < 6; i++)
{
bars[i] = new JLabel();
bars[i].setOpaque(true);
bars[i].setBackground(Color.RED);

int height = (max != 0) ? (data[i]*155)/max : 0;
System.out.printf("%d, %d, %d,... ", height, data[i], max);

this.add(bars[i]);
bars[i].setSize(25, height);
bars[i].setLocation((31*i)+5, 155-height);
}
System.out.println("");
}
}

最佳答案

对于您当前的代码,您需要调用 removeAll(),然后 JPanel 上的 revalidate()repaint() 将“解决”您的问题,但您还有其他不相关的问题:

  • 当您应该生成首选尺寸时,您正在设置组件的尺寸 - 这是布局管理器通常使用的方式
  • 您正在使用 null 布局,这是一件非常危险的事情
  • 您正在使用一个“神奇”数字作为 for 循环结束条件 - 这是一件非常危险的事情。你怎么知道数据数组中有 6 个且只有 6 个项目。简单地使用数据数组的长度有什么危害,就像您之前可能已经做过的数百次一样?

相反,请考虑使用更灵活的代码,该代码将适应您提供的任何数据大小,并避免空布局。例如,考虑以下在 JPanel 的 PaintComponent 方法中绘制条形的代码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;

@SuppressWarnings("serial")
public class TestBarChart extends JPanel {
private static final int[] INIT_DATA = { 1, 2, 4, 5, 6, 9 };
protected static final int MIN_DATA_lENGTH = 5;
protected static final int MAX_DATA_LENGTH = 9;
private static final int MAX_VALUE = 9;
private static final int PREF_W = 300;
private static final int PREF_H = 240;
private BarChart2 barChart2 = new BarChart2(INIT_DATA, MAX_VALUE, PREF_W, PREF_H);

public TestBarChart() {
barChart2.setBorder(BorderFactory.createLineBorder(Color.BLUE));

JPanel chartsPanel = new JPanel(new GridLayout(1, 0));
chartsPanel.setLayout(new GridLayout(1, 0));
chartsPanel.add(barChart2);

JButton resetDataBtn = new JButton(new AbstractAction("Reset Data") {

@Override
public void actionPerformed(ActionEvent e) {
int dataLength = (int) ((MAX_DATA_LENGTH - MIN_DATA_lENGTH) * Math.random()) + MIN_DATA_lENGTH;
int[] data = new int[dataLength];
for (int i = 0; i < data.length; i++) {
data[i] = (int) (MAX_VALUE * Math.random()) + 1;
}
barChart2.setData(data, MAX_VALUE);
}
});
JPanel btnPanel = new JPanel();
btnPanel.add(resetDataBtn);

setLayout(new BorderLayout());
add(chartsPanel);
add(btnPanel, BorderLayout.PAGE_END);
}

private static void createAndShowGui() {
TestBarChart mainPanel = new TestBarChart();

JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}

@SuppressWarnings("serial")
class BarChart2 extends JPanel {
private static final double BAR_WIDTH = 0.90;
private int prefW;
private int prefH;
private static final Color BAR_COLOR = Color.RED;
private int[] data;
private int maxValue;

public BarChart2(int[] data, int maxValue, int prefW, int prefH) {
setData(data, maxValue);
this.prefW = prefW;
this.prefH = prefH;
}

public final void setData(int[] data, int maxValue) {
this.data = data;
this.maxValue = maxValue;
repaint();
}

public int[] getData() {
return data;
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(BAR_COLOR);

// simple algebraic calculations on where to place the bars
double denom = data.length + 1 - BAR_WIDTH;
int barWidth = (int) ((getWidth() * BAR_WIDTH) / denom);

for (int i = 0; i < data.length; i++) {
int x = (int) (getWidth() * (i + 1 - BAR_WIDTH) / denom);
int height = (int) (getHeight() * data[i] / (double) maxValue);
int y = (int) (getHeight() - height);
g.fillRect(x, y, barWidth, height);
}
}

@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(prefW, prefH);
}

}

请注意,如果您重新调整 GUI 的大小,条形图也会重新调整大小以填充 GUI。请注意,图表可容纳任意数量的数据条,所有这些都取决于传递到其中的数据数组的长度。

关于java - JLabel 组件保留在屏幕上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44684249/

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