当前位置: 首页 > 知识库问答 >
问题:

图形类型变量绘制的线在为其创建标签时消失

慕俊迈
2023-03-14
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.*;

public class NewJFrame extends JFrame {
    private Graphics g1;
    private JLabel label = new JLabel();
    // holds information of all businesses
    private Object[][] busInfo = new Object[10][15];

    public NewJFrame() {
        initComponents();
        g1 = jPanel1.getGraphics();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {
        jPanel1 = new javax.swing.JPanel();
        jButton1 = new javax.swing.JButton();
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGap(0, 858, Short.MAX_VALUE));
        jPanel1Layout.setVerticalGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGap(0, 564, Short.MAX_VALUE));
        jButton1.setText("Click Me");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(
                javax.swing.GroupLayout.Alignment.TRAILING,
                layout.createSequentialGroup().addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(jButton1).addGap(425, 425, 425))
                .addGroup(layout.createSequentialGroup().addGap(48, 48, 48)
                        .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap(61, Short.MAX_VALUE)));
        layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup().addGap(28, 28, 28)
                        .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED).addComponent(jButton1)));
        pack();
    }// </editor-fold>

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        printBarChart(2, 1);
        System.out.println(getSize());
    }

    public static void main(String args[]) {
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        java.awt.EventQueue.invokeLater(() -> {
            new NewJFrame().setVisible(true);
        });
    }

    public void printBarChart(int bestBus, int worstBus) {
        busInfo[0][7] = 24325.08;
        busInfo[1][7] = 15394.59;
        busInfo[2][7] = 186719.84;
        int y = jPanel1.getSize().height;
        int x = jPanel1.getSize().width;
        double balance, maxScale = (double) busInfo[bestBus][7] + 650;
        int sameBusDistance, diffBusDistance = 0, scaleNum, maxPoint;
        for (int i = 0; i <= 2; ++i) {
            if (i == 0) {
                diffBusDistance = 0;
            } else {
                diffBusDistance += 65;
            }
            // color of best business
            if (i == bestBus) {
                g1.setColor(Color.YELLOW);
                // color of worst business
            } else if (i == worstBus) {
                g1.setColor(Color.RED);
                // color of other businesses (neither best nor worst)
            } else {
                g1.setColor(Color.BLACK);
            }
            balance = (double) busInfo[i][7];
            sameBusDistance = 25;
            scaleNum = y - 100;
            maxPoint = scaleNum - (scaleNum * (int) balance / (int) maxScale) + 50;
            g1.drawLine(125 + diffBusDistance, y - 50, 125 + diffBusDistance, maxPoint);
            g1.drawLine(125 + sameBusDistance + diffBusDistance, y - 50, 125 + sameBusDistance + diffBusDistance,
                    maxPoint);
            g1.drawLine(125 + sameBusDistance + diffBusDistance, maxPoint, 125 + diffBusDistance, maxPoint);
            jPanel1.add(label);
            jPanel1.setLayout(null);
            label.setSize(100, 50);
            label.setFont(label.getFont().deriveFont(8f));
            label.setLocation(125 + sameBusDistance + diffBusDistance - 30, maxPoint - 50);
            label.setText("" + busInfo[i][7]);
        }
    }

    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JPanel jPanel1;
    // End of variables declaration

}

但是,第二个会从视图中删除第一个栏及其标签:

打印条形图标签导致其他条形图及其标签消失

共有1个答案

呼延卓
2023-03-14

同样,我建议不要对组件使用调用的getGraphics()。现在,您应该已经最小化并恢复了GUI,以便在最小化和恢复GUI时看到图形不稳定。我建议你在你的JPanel上画颜料。

但也有一个例外——如果你在BuffereImage中绘制,你可以使用从中获得的图形对象,然后在JLabel中的ImageIcon中显示图像。例如,在下面的代码中,我创建了一个用空图像填充的JLabel(以确定其大小)。然后,我在按下按钮时用一些条形图数据填充图像,将图像放入一个ImageIcon中,然后通过调用setIcon(…)用该图标设置JLabel 在上面:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;

import javax.swing.*;

@SuppressWarnings("serial")
public class DrawInImage extends JPanel {
    private static final int IMG_W = 900;
    private static final int IMG_H = 700;
    private static final int GAP = 20;
    private BufferedImage img = new BufferedImage(IMG_W, IMG_H, BufferedImage.TYPE_INT_ARGB);
    private Icon icon = new ImageIcon(img);
    private JLabel label = new JLabel(icon);
    private int[] data = { 4, 2, 9, 7, 3, 8, 2, 8 };

    public DrawInImage() {
        JPanel btnPanel = new JPanel();
        btnPanel.add(new JButton(new AbstractAction("Press Me") {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                printBarChart();
            }
        }));
        setLayout(new BorderLayout());
        add(label);
        add(btnPanel, BorderLayout.PAGE_END);
    }

    private void printBarChart() {
        // create new image
        img = new BufferedImage(IMG_W, IMG_H, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = img.createGraphics(); // get image's graphics
        g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g2.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 18));

        // get sizes of drawing area
        int totalWidth = IMG_W - 2 * GAP;
        int totalHeight = IMG_H - 2 * GAP;
        // number of columns including gaps
        int columns = 2 * data.length + 1;

        // calc the max data + 1
        int maxData = 0;
        for (int i : data) {
            if (i > maxData) {
                maxData = i;
            }
        }
        maxData++; // + 1

        for (int i = 0; i < data.length; i++) {
            int x1 = GAP + ((2 * i + 1) * totalWidth) / columns;
            int x2 = GAP + ((2 * i + 2) * totalWidth) / columns;
            int y1 = GAP + (totalHeight * (maxData - data[i])) / maxData;
            int y2 = GAP + totalHeight;

            float hue = (float) i / (float) data.length;
            Color c = Color.getHSBColor(hue, 1f, 1f);
            g2.setColor(c);
            g2.fillRect(x1, y1, x2 - x1, y2 - y1);
            g2.setColor(Color.BLACK);
            String text = "Data " + (i + 1);
            int strX = x1;
            int strY = y1 - GAP / 2;
            g2.drawString(text, strX, strY);
        }

        g2.dispose(); // dispose of graphics objects *we* create
        icon = new ImageIcon(img); // create new icon
        label.setIcon(icon); // display in label
    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("Draw In Image");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new DrawInImage());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

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

显示为

 类似资料:
  • 本文向大家介绍C# 绘制实时折线图,波形图,包括了C# 绘制实时折线图,波形图的使用技巧和注意事项,需要的朋友参考一下 此Demo是采用VS自带的Chart图表控件,制作实时动态显示的折线图,和波形图。本文仅供学习分享使用,如有不足之处,还请指正。 涉及知识点: Chart 控件,功能强大,可以绘制柱状图,折线图,波形图,饼状图,大大简化了对图的开发与定制。     Chart控件的相关概念: C

  • 问题内容: 因此,我正在创建一个免费的手绘图JPanel,它会响应鼠标的移动并 绘制线条。我得到了它的大部分工作,除了一个错误,它会 在线之间随机画一条直线。该随机直线不是 故意的,在缓冲图像上绘制的内容严格来说应该是 用户绘制的内容。这些随机绘制的线不是由用户完成的, 这令人困惑。以下是我的代码,任何人都可以看看吗?所包含的图像 使您可以直观地看到正在执行的操作。 问题答案: 您可能希望嵌套列表

  • 长期读者,第一次在这里提问。 我正在使用plotly和dplyr的group_by创建多个图(group_by变量的每个级别一个图形)。 在下面的示例中,我每年创建一个绘图(group_by变量),我想将年份分配为图形标题。但是,我不知道如何使用数据帧(或tibble)中的存储值来分配标题。 任何建议都非常感谢!谢谢大家!

  • 问题内容: 我在MySQL中使用ENUM数据类型,想重用它,但不重新输入值。MySQL中是否有等效于C,C ++定义类型的方法? 我要执行以下操作: 这可能吗? 谢谢 问题答案: 号MySQL不支持或为,例如,PostgreSQL的呢。 您可能必须再次输入所有名称。您可以使用复制和粘贴或SQL脚本来减轻执行此操作所需的工作。 您还可以使用这些表来获取ENUM定义的文本,然后将其内插到新的语句中。

  • 问题内容: 在Matplotlib中,我按如下所示制作虚线网格: 但是,我无法找出如何(甚至可能)在其他图形元素(如条形图)后面绘制网格线。更改添加网格的顺序与添加其他元素的顺序没有区别。 是否有可能使网格线出现在其他所有内容的后面? 问题答案: 据此-http://matplotlib.1069221.n5.nabble.com/axis-elements-and-zorder- td5346.

  • 我有一个关于常量类型的问题,这些常量被限制在特定的值,以及在GO中如何实现这些。假设我创建了一个类型,它有两个常量值和,我希望限制该类型()的用户创建类型的其他值。是否通过创建包并使值和可见,并使类型仅限于包含包来实现这一点?例如,请参见下面的代码 这是将类型限制为某些常量值的正确方法吗?