【问题标题】:How to use JFrames or JWindows in an array如何在数组中使用 JFrames 或 JWindows
【发布时间】:2018-12-03 15:39:42
【问题描述】:

在我的代码中,我使用了 100 多个预定义的 JWindows 在屏幕上玩弄它们:显示或隐藏、移动等。 定义如下:

    public static JWindow R2 = new JWindow();
    public static JWindow R3 = new JWindow();
    public static JWindow S2 = new JWindow();
    public static JWindow S3 = new JWindow();

    R2.getContentPane().add(s0.labelNow("/testingPackage/" + "R2" + ".jpg"));
    R2.pack();
    R2.setLocation(10, 350);
    R2.setVisible(true);
    R3.getContentPane().add(s0.labelNow("/testingPackage/" + "R3" + ".jpg"));
    R3.pack();
    R3.setLocation(40, 350);
    R3.setVisible(true);
    S2.getContentPane().add(s0.labelNow("/testingPackage/" + "S2" + ".jpg"));
    S2.pack();
    S2.setLocation(550, 750);
    S2.setVisible(true);   etc.

正如您所看到的,这会导致代码非常混乱,所以我想知道是否可以将 JWindows 放在一个数组或类似的东西中,这样我就可以使用类似 'JWArray[4][50]' 和使用循环来声明、定义、移动、显示、隐藏它们?

请在下面找到我尝试使用 JWindows 数组的代码,这会导致“JWA[i].getContentPane().add”行出现空指针异常。我认为这个 JWA[] 声明一定是错误的。

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JWindow;

public class ShowPicture3 extends JPanel {

public static JWindow[] JWA = new JWindow[5];
public static ShowPicture3 s0 = new ShowPicture3();

public JLabel labelNow(String path) {
    ImageIcon imgIcon = new ImageIcon(ShowPicture3.class.getResource(path));
    JLabel label = new JLabel(imgIcon);
    add(label);
    return label;
}

public void prepareImages() {
    for (int i = 0; i < 5; i++) {
        System.out.println("/testingPackage/" + "R" + (i + 2) + ".jpg");
        s0.labelNow("/testingPackage/" + "R" + (i + 2) + ".jpg");
        JWA[i].getContentPane().add(s0.labelNow("/testingPackage/" + "R" + (i + 2) + ".jpg"));
        JWA[i].pack();
        JWA[i].setLocation(10 + i * 20, 350);
        JWA[i].setVisible(true);
    }
}

public static void main(String[] args) throws Exception {
    s0.prepareImages();
    JWA[0].setLocation(100, 750);
    JWA[2].setVisible(false);
}

}

【问题讨论】:

  • I'm using over 100 predefined JWindows - 我首先质疑你为什么想要 100 个 JWindows。在我看来,您只是在显示一堆图像。为什么不直接将图像添加到 JLabel,将标签添加到面板,然后将面板添加到框架? could put the JWindows in an array - 当然。数组可以容纳任何对象。为什么你会认为你不能做到这一点?我建议您尝试一下,如果遇到问题,您可以发布一个]mcve] 来展示问题并提出具体问题。
  • 感谢您的反应:到目前为止,我在原始问题中添加了一项试验......
  • ]mcve] @camickr 实际上是指[mcve] 或(自动扩展)minimal reproducible example。不可编译的代码 sn-ps 不构成 MCVE。顺便说一句 - 你从来没有解释过“我首先质疑你为什么想要一个 100 个 JWindows。”。见The Use of Multiple JFrames, Good/Bad Practice?JWindow也是如此。)
  • 我再次重复我的问题,你为什么要这样做。您发布了一段 sn-p 代码,但没有解释它的作用。您似乎正在尝试将图像放置在屏幕上的特定位置。那么为什么不使用带有适当布局管理器的 JPanel 来显示这些图像呢?
  • @Andrew :谢谢解释,我添加了缺少的导入语句,有问题的较低代码现在在运行时应该显示错误。

标签: java arrays swing jframe jwindow


【解决方案1】:

您忘记初始化 JWA 数组内容(默认填充为空),只需添加“JWA[i] = new JWindow();”如下例所示。

public void prepareImages() {
    for (int i = 0; i < 5; i++) {
        JWA[i] = new JWindow();
        System.out.println("/testingPackage/" + "R" + (i + 2) + ".jpg");
        s0.labelNow("/testingPackage/" + "R" + (i + 2) + ".jpg");
        JWA[i].getContentPane().add(s0.labelNow("/testingPackage/" + "R" + (i + 2) + ".jpg"));
        JWA[i].pack();
        JWA[i].setLocation(10 + i * 20, 350);
        JWA[i].setVisible(true);
    }
}

【讨论】:

  • tx Wojciech 为您提供帮助。我只是看不出与“public static JWindow[] JWA = new JWindow[5];”这一行的区别一开始?对整数数组或双精度数组执行相同操作非常有效。
  • 对于原语(整数、双精度数)它可以工作,但对于对象类型它不能。对象数组总是用空值初始化。行“new JWindow[5]”只是创建一个大小为 5 的空数组。你必须用值填充它:)
猜你喜欢
  • 2011-11-02
  • 1970-01-01
  • 2015-03-18
  • 1970-01-01
  • 2013-08-26
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多