Yes ,I can ! 2019-11-30 18:26 采纳率: 0%
浏览 134

我想要的结果是在GUI界面的第一行第二列的JLable添加字符串,控制台输出正常,但是就是添加不到JLable里!!怎么回事啊?

package 发牌;

import java.awt.Color;
import java.awt.GridLayout;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Program extends Thread{
private JFrame jf;
public JLabel jl[] = new JLabel[10];
public String num[] = new String[53];
public Program(){
for(int i=1; i<=52; i++){
num[i] = i + "";
}
jf = new JFrame("发牌器");
jf.setSize(500, 400);
jf.setLocation(100, 100);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setLayout(new GridLayout(3, 3));
for(int i=1; i<=9; i++){
if(i%2!=0){
jl[i] = new JLabel();
jl[i].setBackground(new Color(106, 106, 106));
jl[i].setOpaque(true);
jf.add(jl[i]);
}
else {

            jl[i] = new JLabel(); 
            jl[i].setBackground(new Color(140, 140, 115));
            jl[i].setOpaque(true);
            jf.add(jl[i]);
        }
    }
    jf.setVisible(true);
}

public static void main(String[] args) {
    Program pr = new Program();
    CardBuffer cd = new CardBuffer();
    PutCard pt = new PutCard(pr, cd);
    GetCard gc = new GetCard(pr, cd);
    pt.start();
    gc.start();

}

}
class CardBuffer{
private String card;
public synchronized void put(String card){
this.card = card;
}

public synchronized String get(){
    return card;
}

}
class PutCard extends Thread {
private Program pr = new Program();
private CardBuffer cd = new CardBuffer();
public static boolean empty = true;
Random cardNum = new Random();
public PutCard(Program pr, CardBuffer cd){
this.pr = pr;
this.cd = cd;
}
public void run(){

    synchronized (cd) {
        for(int i=0; i<52; i++){
        while(!empty){
            try{
                cd.wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
        try{
            sleep(3000);
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        int index = (int)(Math.random()*pr.num.length);
        String str = pr.num[index];
        cd.put(str);
        System.out.print(str+"  ");
        empty = false;
        cd.notify();
     }
    }
}

}
class GetCard extends Thread{
private String str = "";
private int n = 2;
Program pr = new Program();
CardBuffer cd = new CardBuffer();
public GetCard(Program pr, CardBuffer cd){
this.pr = pr;
this.cd = cd;
}
public void run(){

    synchronized (cd) {
        for(int i=0; i<52; i++){

        while(PutCard.empty){
            try{
                cd.wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
        try{
            sleep(3000);
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        str += cd.get();
        System.out.print(str+"  ");
        pr.jl[n].setText(str);
        PutCard.empty = true;
        cd.notify();

     }
    }
}

}

  • 写回答

1条回答 默认 最新

  • 黄以礼 2024-06-15 16:09
    关注

    你的代码中存在一些问题,导致无法在第一行第二列的JLabel中添加字符串。

    首先,你在Program类的构造函数中创建了jl数组和num数组,但是在设置jl[i]的值时,你使用了i%2 != 0的条件判断,这意味着你只在奇数索引的位置上设置值,而偶数索引的位置上的JLabel对象并没有被赋值。因此,当你尝试在偶数索引的位置上设置文本时,实际上那个位置的JLabel对象是null,所以你会得到NullPointerException

    为了解决这个问题,你可以将if (i%2 != 0)的条件判断改为if (i < 10),这样你就能确保在前10个位置上都有JLabel对象,并且可以在这些位置上设置文本。

    另外,你在GetCard类的run方法中使用pr.jl[n].setText(str)来设置文本,但是你在这里使用了n变量,而n变量的值在类的定义中并未给出。你可能需要在类的定义中添加一个合适的值来替代n变量,或者直接使用具体的索引位置来设置文本。

    此外,你在代码中使用了线程和同步块,但是并没有使用到线程安全的特性,也没有在同步块中访问共享资源。你可以考虑移除这些不必要的线程和同步块,因为它们在当前的代码中并没有起到实际的作用。

    综上所述,你需要对代码进行一些修改和调整,以确保能够在第一行第二列的JLabel中添加字符串。同时,还需要注意处理可能出现的空指针异常和数组越界等问题。

    评论

报告相同问题?

悬赏问题

  • ¥15 网络科学导论,网络控制
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)