Java JPanel内容在从另一个Jframe打开后变为黑色

Java JPanel内容在从另一个Jframe打开后变为黑色,java,swing,concurrency,jframe,jpanel,Java,Swing,Concurrency,Jframe,Jpanel,我有一个Jframe,里面有一个JPanel,上面有一些按钮。 当按下一个按钮时,它会打开另一个Jframe,其中包含另一个Jpanel,但是这个Jframe的内容都是黑色的。 应该有4个按钮,当我单独打开第二个Jframe时,它的显示和工作方式与预期的一样。 这可能与我使用了一个线程有关吗?在一段时间内等待第二个线程(frame.visible)? 任何帮助都将不胜感激 import javax.swing.*; import java.awt.*; import java.awt.event

我有一个Jframe,里面有一个JPanel,上面有一些按钮。 当按下一个按钮时,它会打开另一个Jframe,其中包含另一个Jpanel,但是这个Jframe的内容都是黑色的。 应该有4个按钮,当我单独打开第二个Jframe时,它的显示和工作方式与预期的一样。 这可能与我使用了一个线程有关吗?在一段时间内等待第二个线程(frame.visible)? 任何帮助都将不胜感激

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

/**
 * Created by IntelliJ IDEA.
 * User: ThePetr
 * Date: 17/02/12
 * Time: 19:28
 * To change this template use File | Settings | File Templates.
 */
public class SelectKleurUI {
    private  JFrame frm = new JFrame("Kies kleur");
    private int gekozenKleur;

    public SelectKleurUI() {
        frm = new JFrame();
        Toolkit kit = frm.getToolkit();
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice[] gs = ge.getScreenDevices();
        Insets in = kit.getScreenInsets(gs[0].getDefaultConfiguration());
        Dimension d = kit.getScreenSize();
        int max_width = (d.width - in.left - in.right);
        int max_height = (d.height - in.top - in.bottom);
        frm.setSize(Math.min(max_width, 400), Math.min(max_height, 64));//whatever size you want but smaller the insets
        frm.setLocation((max_width - frm.getWidth()) / 2, (max_height - frm.getHeight() ) / 2);
        //frm.setUndecorated(true);
        frm.setResizable(false);
        frm.setVisible(true);

        frm.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        maakKnoppen();
    }

    public  int selectKleur(){

        while(frm.isVisible()){
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
        }
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frm.dispose();
        return gekozenKleur;
    }

    public void setKleur(int kleur){
        gekozenKleur=kleur;
        frm.dispose();
    }
    private  void maakKnoppen(){
        JPanel knoppenFrame = new JPanel(new GridLayout(1,0));
        JButton geel = new JButton("Geel");
        geel.setBackground(Color.yellow);
        geel.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                setKleur(0);
                //To change body of implemented methods use File | Settings | File Templates.
            }
        });
        JButton groen = new JButton("Groen");
        groen.setBackground(Color.green);
        groen.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                setKleur(1);
                //To change body of implemented methods use File | Settings | File Templates.
            }
        });
        JButton blauw = new JButton("Blauw");
        blauw.setBackground(Color.blue);
        blauw.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                setKleur(2);
                //To change body of implemented methods use File | Settings | File Templates.
            }
        });
        JButton rood = new JButton("Rood");
        rood.setBackground(Color.red);
        rood.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                setKleur(3);
                //To change body of implemented methods use File | Settings | File Templates.
            }
        });
        knoppenFrame.add(geel);
        knoppenFrame.add(groen);
        knoppenFrame.add(blauw);
        knoppenFrame.add(rood);
        frm.add(knoppenFrame,BorderLayout.NORTH);

    }
}

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

/**
 * Created by IntelliJ IDEA.
 * User: ThePetr
 * Date: 17/02/12
 * Time: 14:55
 * To change this template use File | Settings | File Templates.
 */
public class Uno {
    private JFrame Hoofdvenster;
    private JPanel pnlOnder=new JPanel(new GridLayout(1,0));
    private JButton[] kaarten=new JButton[50];
    Uno(){
        Hoofdvenster = new JFrame();
        Hoofdvenster.setName("Uno");
        Toolkit kit = Hoofdvenster.getToolkit();
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice[] gs = ge.getScreenDevices();
        Insets in = kit.getScreenInsets(gs[0].getDefaultConfiguration());
        Dimension d = kit.getScreenSize();
        int max_width = (d.width - in.left - in.right);
        int max_height = (d.height - in.top - in.bottom);
        Hoofdvenster.setSize(Math.min(max_width, 800), Math.min(max_height, 600));//whatever size you want but smaller the insets
        Hoofdvenster.setLocation((max_width - Hoofdvenster.getWidth()) / 2, (max_height - Hoofdvenster.getHeight() ) / 2);
        maakComponenten();
        Hoofdvenster.setVisible(true);
        Hoofdvenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    private void maakComponenten(){
        for(int i=0;i<7;i++){
            //kaarten[i]=new JButton("Kaart "+i);
            ImageIcon btnIcon = createImageIcon("Images/Naamloos.gif");//new ImageIcon("./Images/Naamloos.gif");

            kaarten[i]=new JButton("Kaart "+(i+1),btnIcon);
            kaarten[i].addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    //JOptionPane.showMessageDialog(null, "Ok");
                    Hoofdvenster.setVisible(false);
                    SelectKleurUI selectKleurUI = new SelectKleurUI();
                    JOptionPane.showMessageDialog(null, ""+ selectKleurUI.selectKleur());
                    Hoofdvenster.setVisible(true);

                }
            });
            pnlOnder.add(kaarten[i]);


        }
        Hoofdvenster.add(pnlOnder,BorderLayout.SOUTH);
    }
    private static ImageIcon createImageIcon(String path) {
    java.net.URL imgURL = Uno.class.getResource(path);

    return new ImageIcon(imgURL);
}
}
import javax.swing.*;
导入java.awt.*;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
/**
*由IntelliJ IDEA创建。
*用户:ThePetr
*日期:2012年2月17日
*时间:19:28
*要更改此模板,请使用文件|设置|文件模板。
*/
公共类SelectKleurUI{
私人JFrame frm=新JFrame(“Kies kleur”);
格科森克勒私人酒店;
公共选择Kleurui(){
frm=新的JFrame();
Toolkit kit=frm.getToolkit();
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[]gs=ge.getScreenDevices();
Insets in=kit.getScreenInsets(gs[0].getDefaultConfiguration());
维度d=kit.getScreenSize();
int max_width=(d.width-in.left-in.right);
int max_height=(d.height-in.top-in.bottom);
frm.setSize(Math.min(max_-width,400),Math.min(max_-height,64));//您想要的任何大小,但插图要小一些
设置位置((max_width-frm.getWidth())/2,(max_height-frm.getHeight())/2);
//frm.设置未装饰(真实);
frm.可设置大小(假);
frm.setVisible(真);
frm.setDefaultCloseOperation(JFrame.DO\u NOTHING\u ON\u CLOSE);
maakKnoppen();
}
public int selectKleur(){
while(frm.isVisible()){
试一试{
睡眠(100);
}捕捉(中断异常e){
e、 printStackTrace();//要更改catch语句的主体,请使用文件|设置|文件模板。
}
}
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.dispose();
返回gekozenKleur;
}
公共空间塞克勒尔(内克勒尔){
gekozenKleur=kleur;
frm.dispose();
}
私有无效maakKnoppen(){
JPanel knoppenFrame=新JPanel(新网格布局(1,0));
JButton geel=新JButton(“geel”);
背景色(黄色);
geel.addActionListener(新的ActionListener(){
已执行的公共无效操作(操作事件e){
setKleur(0);
//要更改已实现方法的主体,请使用文件|设置|文件模板。
}
});
JButton groen=新JButton(“groen”);
退步地(颜色:绿色);
groen.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
setKleur(1);
//要更改已实现方法的主体,请使用文件|设置|文件模板。
}
});
JButton blauw=新JButton(“blauw”);
挫折背景(颜色:蓝色);
addActionListener(新的ActionListener(){
已执行的公共无效操作(操作事件e){
setKleur(2);
//要更改已实现方法的主体,请使用文件|设置|文件模板。
}
});
JButton rood=新JButton(“rood”);
退步地(颜色:红色);
rood.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
塞克勒尔(3);
//要更改已实现方法的主体,请使用文件|设置|文件模板。
}
});
knoppenFrame.add(geel);
knoppenFrame.添加(groen);
knoppenFrame.add(blauw);
knoppenFrame.add(rood);
frm.add(knoppenFrame,BorderLayout.NORTH);
}
}
导入javax.swing.*;
导入java.awt.*;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
/**
*由IntelliJ IDEA创建。
*用户:ThePetr
*日期:2012年2月17日
*时间:14:55
*要更改此模板,请使用文件|设置|文件模板。
*/
公开课{
私人JFrame Hoofdvenster;
private JPanel pnlOnder=新JPanel(新网格布局(1,0));
私有JButton[]kaarten=新JButton[50];
Uno(){
Hoofdvenster=新JFrame();
Hoofdvenster.setName(“Uno”);
Toolkit kit=hoofdventer.getToolkit();
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[]gs=ge.getScreenDevices();
Insets in=kit.getScreenInsets(gs[0].getDefaultConfiguration());
维度d=kit.getScreenSize();
int max_width=(d.width-in.left-in.right);
int max_height=(d.height-in.top-in.bottom);
hoofdventer.setSize(Math.min(max_-width,800),Math.min(max_-height,600));//您可以选择任何尺寸,但插入的尺寸要小一些
hoofdventer.setLocation((max_width-hoofdventer.getWidth())/2,(max_height-hoofdventer.getHeight())/2);
maakComponenten();
Hoofdvenster.setVisible(真);
Hoofdvenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
私有无效maakComponenten(){

对于(int i=0;i所有对Swing组件的调用都必须在事件调度线程上。Swing组件不是线程安全的


你的应用程序应该只有一个
JFrame
。你可以在一个且唯一的
JFrame

代码中拥有你想要的任意多个
jpanel
。-我在周五休息我的精神力量。编辑后,这是两个主要类。我还有另一个带有主要方法的类,但里面只有“new Uno()问题是我是这方面的一名学生,我们还没有学会如何使用线程……但是谢谢你的提示,我会修改我的想法