JAVA 一个关于JPanel的问题

我在编写一个小程序的时候,遇到了一个问题.为了减少代码量.给出下面一段代码.在TetrisFrame类中有3句代码:代码一,代码二,代码三.如果启用代码二和代码三,面板上... 我在编写一个小程序的时候,遇到了一个问题.为了减少代码量.给出下面一段代码.
在TetrisFrame类中有3句代码:代码一,代码二,代码三. 如果启用代码二和代码三,面板上的字体就会模糊不清;但如果启用代码一,面板就显示正常.
这是为什么呢?我想知道原因.

import java.awt.*;
import javax.swing.*;

public class KeyListener
{
public static void main(String[] agrs)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
TetrisFrame frame = new TetrisFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}

class TetrisFrame extends JFrame
{
public TetrisFrame()
{
setSize(300, 200);
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.updateComponentTreeUI(this);
}
catch (Exception e)
{
e.printStackTrace();
}
//add(new MessagePanel(), BorderLayout.EAST);//代码一
//add(messagePanel, BorderLayout.EAST);//代码二
}
//private MessagePanel messagePanel = new MessagePanel();//代码三
}

class MessagePanel extends JPanel
{
public MessagePanel()
{
JPanel infoPanel = new JPanel(new GridLayout(4, 1));
infoPanel.add(new JLabel("得分"));
infoPanel.add(new JTextField(" 0"));
infoPanel.add(new JLabel("消行"));
infoPanel.add(new JTextField(" 0"));

JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(2, 1));
buttonPanel.add(new JButton("没有的按钮"));
buttonPanel.add(new JButton("没有的按钮"));

setLayout(new GridLayout(2, 1, 0, 4));
add(infoPanel);
add(buttonPanel);
}
}

我使用的是JAVA SE 6u16 Eclipse3.5
展开
 我来答
iceliushuai
2009-08-28 · TA获得超过151个赞
知道小有建树答主
回答量:92
采纳率:0%
帮助的人:0
展开全部
应该是程序的UI风格不统一造成的吧.
使用代码一的情况下,
先用
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.updateComponentTreeUI(this);
设置了系统的UI表现风格,而后才用
add(new MessagePanel(), BorderLayout.EAST); // MessagePanel 使用设置的风格
创建一个MessagePanel并把它加到主面板上.

在使用代码二+代码三的情况下,在设置UI表现风格时,MessagePanel已经利用默认的UI风格建立完毕了.然后把它再加到主面板上.

private MessagePanel messagePanel = new MessagePanel();//这时,使用默认的风格,因为还没有执行设置UI风格的语句
由于风格不统一,所以感觉怪怪的.

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.updateComponentTreeUI(this);
这两句应该在所有的组件建立前执行.
Leoea
2009-08-28 · 超过30用户采纳过TA的回答
知道答主
回答量:96
采纳率:0%
帮助的人:73.9万
展开全部
的确很费解,我也研究下

不过好像是全局变量的问题 把messagePanel定义放进复合语句就没问题了。
楼主有发现也分享下,相互学习!

iceliushuai 正解
可能是类的对象在定义时没有来的及 定义UI风格
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
daay1986
2009-08-28 · TA获得超过6018个赞
知道大有可为答主
回答量:2208
采纳率:0%
帮助的人:1474万
展开全部
netBeans里一切正常!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式