刚编写几行代码有个问题,就是在运行的时候,后面的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);
}
}
以下是那个有问题的代码,可在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);
}
}
解决方案 »
- 强烈建议,JDK的帮助文件里应该写用法的例子.....大家讨论下
- vc如何掉用java程序(急)
- 十分基础的问题,100分求知
- java名词大汇总
- 个简单的applet问题,我用javac 编译后,我用IE看不到结果
- 谁能给我j2eesdk的下载地址,在线等
- 檬檬,你把你答应我的那个类给我发过来啊。
- 为什么我的Class.forName("oracle.jdbc.driver.OracleDriver")总是抛出ClassNotFoundException啊?
- 怎样设置RGB值
- 编写的脚本放到哪个盘里最好呢?
- 布局管理器组件的布置问题
- 在国外的中国同胞向大家求助!关于getText()方法! Linux 和 Windows区别!
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());//这样得到的是xp风格,在这之前设置一个properties属性是最方便的,System.setProperty("", "no xp");类似于这样的,该属性忘了名称,以前做过,有空我再帮你查查吧。
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时,尺寸是会发生相应的变化的,所以控件的位置只能自己根据风格去手工调整修改。