Java JPanel内容在从另一个Jframe打开后变为黑色
我有一个Jframe,里面有一个JPanel,上面有一些按钮。 当按下一个按钮时,它会打开另一个Jframe,其中包含另一个Jpanel,但是这个Jframe的内容都是黑色的。 应该有4个按钮,当我单独打开第二个Jframe时,它的显示和工作方式与预期的一样。 这可能与我使用了一个线程有关吗?在一段时间内等待第二个线程(frame.visible)? 任何帮助都将不胜感激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
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()问题是我是这方面的一名学生,我们还没有学会如何使用线程……但是谢谢你的提示,我会修改我的想法