刚编写几行代码有个问题,就是在运行的时候,后面的messagePanel面板会向下移动,以至于影响下面按钮的显示.麻烦大家看一下,帮帮我指出那个错误吧.
   以下是那个有问题的代码,可在Eclipse下运行一下.
package chapter11;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;public class ButtonDemo extends JFrame implements ActionListener{

//Declare a panle for displaying message
private MessagePanel messagePanel; //Declare two buttons to move the message left and right
private JButton jbtLeft,jbtRight;

public static void main(String[] args){
try{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(Exception e){
e.printStackTrace();
}
ButtonDemo frame=new ButtonDemo();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800,200);
frame.setVisible(true);
frame.setResizable(false);
}

/**
 * Default constructor
 */
public ButtonDemo(){
setTitle("Button Demo");

//Create a MessagePanel instance and set colors
messagePanel=new MessagePanel("Welcome to Java");
messagePanel.setBackground(Color.yellow);

JPanel jpButtons=new JPanel();
jpButtons.setLayout(new FlowLayout());
jpButtons.add(jbtLeft=new JButton("<="));
jpButtons.add(jbtRight=new JButton("=>"));

jbtLeft.setMnemonic('L');
jbtRight.setMnemonic('R');

//jbtLeft.setIcon(new ImageIcon("left.gif"));

jbtLeft.setToolTipText("Move message to letf");
jbtRight.setToolTipText("Move message to right");

getContentPane().setLayout(new BorderLayout());

getContentPane().add(jpButtons,BorderLayout.SOUTH);
getContentPane().add(messagePanel,BorderLayout.CENTER);

jbtLeft.addActionListener(this);
jbtRight.addActionListener(this);

}
public void actionPerformed(ActionEvent e) {
if(e.getSource()==jbtLeft){
left();
}
else if(e.getSource()==jbtRight){
right();
}
}

private void left(){
int x=messagePanel.getX();
if(x>10){
messagePanel.setX(x-10);
messagePanel.repaint();////////////////////////////////////////////
}
}
private void right(){
int x=messagePanel.getX();
if(x<300){
messagePanel.setX(x+10);
messagePanel.repaint();
}
}
}class MessagePanel extends JPanel{
private boolean centered;
private String message;
private int x=20;
private int y=20;

public MessagePanel(String message){
this.message=message;
}
public int getX(){
return x;
}
public void setX(int x){
this.x=x;
}
public int getY(){
return y;
}
public void setY(int y){
this.y=y;
}
/**
 * Paint the message
 */
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setFont(new Font("",Font.BOLD,20));
g.drawString(message, x, y);
}
public Dimension getPreferredSize(){
return new Dimension(200,50);
}
public Dimension getMinimumSize(){
return new Dimension(200,50);
}
}

解决方案 »

  1.   

    这不是java的问题,是XP风格的问题
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());//这样得到的是xp风格,在这之前设置一个properties属性是最方便的,System.setProperty("", "no xp");类似于这样的,该属性忘了名称,以前做过,有空我再帮你查查吧。
      

  2.   

    LZ是怎么去掉风格的?按照以下设定了?
    public static void main(String[] args){
        System.setProperty("swing.noxp", "noxp"); //这里一定要放在最前
        ...}
    或者
    public class ButtonDemo extends JFrame implements ActionListener{
        static {System.setProperty("swing.noxp", "noxp");}
        ...
    }这应该是风格的问题,里面的控件的位置设定跟风格有关,不同的风格实际被画到screen时,尺寸是会发生相应的变化的,所以控件的位置只能自己根据风格去手工调整修改。