java - 从另一个 Jframe 打开后 JPanel 内容变黑

标签 java swing concurrency jframe jpanel

所以我有一个带有 JPanel 的 Jframe,上面有一些按钮。 当按下一个按钮时,它会打开另一个 Jframe,其中包含另一个 Jpanel,但是这个 Jframe 的内容都是黑色的。 应该有 4 个按钮,当我单独打开第二个 Jframe 时,它​​会按预期显示和工作。 这与我在一段时间内在第二个线程上使用 thread.wait (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);
}
}

最佳答案

所有对 Swing 组件的调用都必须在事件分派(dispatch)线程上进行。 Swing 组件不是线程安全的。

您的应用程序应该只有一个 JFrame。您可以在一个且唯一的 JFrame 中拥有任意多个 JPanel

关于java - 从另一个 Jframe 打开后 JPanel 内容变黑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9439800/

相关文章:

java - 播放音乐时 JFrame 不显示?

c# - 使用 IEnumerable 接口(interface)是否可以减少并发问题

java - java中未压缩文件的大小

java - 将文档上传到 Dropbox

java - 将 JComponent 重置为默认值

Java:如何将 JMenu 添加到 JPanel 或创建下拉按钮?

scala - 尽管失败,如何进行执行Future序列?

java - cygwin 中 Java 的不同版本

java - 为连接到服务器应用程序的每个客户端打开一个新的数据库连接?

Java:鼠标在图形界面中拖动和移动