2012-02-25 18 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