Содержимое JPanel становится черным после открытия его из другого Jframe - PullRequest
1 голос
/ 25 февраля 2012

Итак, у меня есть Jframe с JPanel в нем, и там есть несколько кнопок.при нажатии кнопки открывается другой 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);
}
}

1 Ответ

3 голосов
/ 25 февраля 2012

Все вызовы компонентов Swing должны выполняться в потоке диспетчеризации событий.Компоненты Swing не являются поточно-ориентированными.

Ваше приложение должно иметь только один JFrame.Вы можете иметь столько JPanels, сколько хотите в одном и только JFrame.

...