2012-02-25 19 views
1

打开它后,所以我有一个JPanel一个JFrame在里面,并有上有一些按钮。 当按下一个按钮,它开辟了另一个JFrame的另一个的JPanel的,但是,这个JFrame的内容是全黑的。 应该有4个按钮,并且当我单独打开第二个Jframe时,它会显示并按其应有的方式工作。 难道这AVE什么关系,我用在第二个中的thread.wait一段时间(frame.visible)里面的事实呢? 任何帮助将不胜感激。的JPanel内容变黑从另一个JFrame的

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

代码,请 - 我休息上周五我的精神力量。编辑为 – Paul 2012-02-25 00:05:14

+0

,这是2个主要类。我也有另外一个类主要方法,但所有这些都是在有“新乌诺()” – 2012-02-25 00:12:09

回答

3

所有对Swing组件的调用都必须位于事件派发线程上。 Swing组件不是线程安全的。

您的应用程序应该只有一个JFrame。你可以有任意多的JPanels,只需一个JFrame

+0

问题是,我在这一个学生,我们还没有学会使用线程尚未...但由于工作对于小费,我会重做我的想法 – 2012-02-25 02:50:20