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

如何在不同的位置绘制多个JLabel?(图标不显示)

林英武
2023-03-14

我正在尝试使用for loop在许多不同的位置绘制多个图标。出于某种原因,他们就是不出现。我不知道我遗漏了什么——我找到的唯一线索是关于将layout设置为null,但IntelliJ会覆盖它。图标应该显示在“mapa”面板中。我尝试手动添加它们,但没有任何改变。

我的代码:

package okna;

import logistyka.Walker;
import logistyka.errand.Errand;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

public class WalkerGUI extends JFrame{
    private JPanel mainPanel;
    private JLabel walkerName;
    private  JTextField walkerNameField;
    private JLabel walkerAddress;
    private  JTextField walkerAddressField;
    private JButton searchErrandsButton;
    private JComboBox errandsComboBox;
    private JLabel errandsList;
    private JTextField walletValue;
    private JLabel Wallet;
    private JRadioButton archivalErrandsRadioButton;
    private JRadioButton currentErrandsRadioButton;
    private JButton payOutButton;
    private JButton seeProfileButton;
    private JPanel mapa;
    ArrayList<Errand> masterErrandList = new ArrayList<>();

    public WalkerGUI(Walker w, ArrayList<Errand> masterErrandList)  {
        setContentPane(mainPanel);
        ArrayList<JLabel> errandsLabels = new ArrayList<>();
        ImageIcon x = new ImageIcon(System.getProperty("user.dir") + "\\src\\x.png");
        this.masterErrandList = masterErrandList;
        for (Errand errand: masterErrandList) {
            JLabel label = new JLabel("whtvr");
            label.setIcon(x);
            label.setLocation((int)errand.getAddress().getX(),(int)errand.getAddress().getY());
            label.setMinimumSize(new Dimension(20,20));
            label.setPreferredSize(new Dimension(20,20));
            label.setVisible(true);
            errandsLabels.add(label);
        }

        walkerNameField.setText(w.getDescription().getName());
        walkerAddressField.setText(w.getDescription().getHomeRegion().getCurrentAddress().toString());
        walletValue.setText(String.valueOf(w.getWalletSatus()));
        seeProfileButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JFrame frame = new ProfileGUI(w);
                frame.pack();
                frame.setVisible(true);
            }
        });
        payOutButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                w.setWalletSatus(0);
                walletValue.setText(String.valueOf(w.getWalletSatus()));
            }
        });
    }


}

共有1个答案

通令
2023-03-14

您可以使用SpringLayout(而不是null布局)。方法Errand.get地址(). getX()将返回JLabel左边缘与其容器左边缘的距离,而Errand.get地址(). getY()将返回JLabel顶部边缘与其容器顶部边缘的距离。

你问题中的代码不是一个最小的、可复制的例子,所以下面的代码应该被视为概念的证明。

import java.awt.EventQueue;
import java.awt.Point;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SpringLayout;

public class SprinGui {

    private void createAndDisplayGui() {
        JFrame frame = new JFrame("Spring");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel contentPane = (JPanel) frame.getContentPane();
        SpringLayout layout = new SpringLayout();
        contentPane.setLayout(layout);
        Point[] points = new Point[]{new Point(5, 5),
                                     new Point(5, 100),
                                     new Point(225, 150),
                                     new Point(250, 210)};
        Class<?> meClass = getClass();
        Icon[] icons = new Icon[4];
        icons[0] = new ImageIcon(meClass.getResource("coffee.png"));
        icons[1] = new ImageIcon(meClass.getResource("dollar.png"));
        icons[2] = new ImageIcon(meClass.getResource("dynamite.png"));
        icons[3] = new ImageIcon(meClass.getResource("soccer-player.png"));
        for (int i = 0; i < 4; i++) {
            JLabel label = new JLabel(icons[i]);
            contentPane.add(label);
            layout.putConstraint(SpringLayout.WEST,
                                 label,
                                 points[i].x,
                                 SpringLayout.WEST,
                                 contentPane);
            layout.putConstraint(SpringLayout.NORTH,
                                 label,
                                 points[i].y,
                                 SpringLayout.NORTH,
                                 contentPane);
        }
        frame.setSize(450, 300);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SprinGui instance = new SprinGui();
        EventQueue.invokeLater(() -> instance.createAndDisplayGui());
    }
}

这就是GUI的外观。

请注意,如何使用图标可能也很有帮助。

 类似资料:
  • 我有一张桌子,比如: 生成虚拟数据: 我想用垫线 (v1.4) 在 Python 3 中完成一个任务: 绘制的直方图 按 两个小时,未能获得所需的直方图 我阅读了matplotlib的示例和用户指南。令人惊讶的是,我没有找到关于如何从颜色图中指定颜色的教程 我在谷歌上搜索过,但没有找到一个简洁的例子 我想一个人可以用,不导入一系列模块,例如,

  • 问题内容: 我有一个具有多年温度记录的温度文件,格式如下: 每年的记录数量和时间不同,因此熊猫的datetimeindices都不同。 我想在同一图中绘制不同年份的数据以进行比较。X轴为1月至12月,Y轴为温度。我应该怎么做呢? 问题答案: 尽管Chang的答案说明了如何在同一图形上多次绘制,但是在这种情况下,使用a和ing可能会更好: (假设您已经在数据框中使用了日期时间索引) 现在很容易绘制(

  • 这是我的线程的最终输出,它获取屏幕截图并将其存储在一个矢量中。 用于获取屏幕截图,这些截图基本上是屏幕的光栅,不包含光标位置。作为一种解决办法,我使用类获取,然后获取一个。然后在该点绘制图像。 如果将记录区域设置为全屏分辨率,则一切都很酷。但是,如果我改变了记录区域,光标会被绘制在错误的位置。 这个黑色光标应该在Eclipse IDE的Play按钮的顶部。然而,它处于错误的位置。 如果光标超出记录

  • 我想在一个图像上手动绘制多个区域来创建一个绘制区域的二进制掩码(地面真相)。 我附加了一个代码,使用Emfreehand来完成一个区域的工作,但一旦释放鼠标按钮,该区域的二进制掩码就会显示出来。有没有一种方法可以绘制多个区域,然后显示二进制掩码?(多次调用Emfreehand可能不起作用,因为每个图像的区域数不同)。 多谢了。

  • 使用matplotlib时,我可以使用{importmatplotlib.pyplotas plt}因为我使用Tkinter,所以我也会使用PicreCanvasTkAgg来做同样的事情 有人能帮我在如何实现matplotlib的停顿效果在菲格勒CanvasTkAgg。

  • 当我运行以下代码时,即使没有收到任何错误消息,也不会显示绘图。 我试过以下方法:1)更换Spyder- 我正在使用Python 3.6和Anaconda附带的Spyder