Code Bye

JButton 只有当鼠标划过的时候才能显示

 

小弟初接触Swing,遇到一个奇怪的问题,求大牛解答,下面是写的一点代码:
public mainFrame() {
setTitle(“MyPlayer”);
setSize(WIDETH,HEIGHT);
doLay();
mainPanel controlPanel=new mainPanel();
setLayout(new BorderLayout());
    add(controlPanel,BorderLayout.CENTER);//就是这add 的一个panle,panle里面有3个Button
setVisible(true);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

   //下面是我自己定义的一个Panel
   mainPanel()
{
nextone = new Button(
“E:\yangwei””s home\java\Application\Application\player\img\fastForward.png”);
nextone.setBounds(new  Rectangle(165,55,40,30));
playerButton=new Button(“E:\yangwei””s home\java\Application\Application\player\img\play.png”);
playerButton.setBounds(210,55,40,30);
previousone = new Button(“E:\yangwei””s home\java\Application\Application\player\img\rewind.png”);
previousone.setBounds(255,55,40,30);
setLayout(null);
add(previousone,null);
add(playerButton,null);
add(nextone,null);
JSlider VolumeControl=new JSlider();
VolumeControl.setBounds(275, 55, 40, 30);
VolumeControl.setPaintLabels(true);
add(VolumeControl);
        setVisible(true);
}

我运行程序,可以看到界面和我自己设置的背景画布,但是add的panel看不到,只有当把鼠标移动到button的位置,Button才会显示出来。

我怀疑是我布局管理器的原因,但是调试半天没发现问题,请各位指教。

你贴的代码没什么问题,问题在你没贴的代码中。
引用 1 楼  的回复:

你贴的代码没什么问题,问题在你没贴的代码中。

下面贴上全部的代码:

 

package ui.mainUi;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import ui.mainUi.mainPanel;
import javax.swing.*;

import com.sun.awt.AWTUtilities;

public class mainFrame extends JFrame {
public static int WIDETH = 500;
public static int  HEIGHT= 800;
private static final Image image = Toolkit.getDefaultToolkit().getImage(
“E:\yangwei””s home\java\Application\Application\player\img\skin6.gif”);

//播放器主体结构
public mainFrame() {
setTitle(“MyPlayer”);
setSize(WIDETH,HEIGHT);
doLay();
mainPanel controlPanel=new mainPanel();
setLayout(new BorderLayout());
    add(controlPanel,BorderLayout.CENTER);
setVisible(true);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

//加载播放器的背景
private static final JComponent canvas = new JComponent() {
protected void paintComponent(Graphics g) {         
super.paintComponent(g);
Graphics gBackground = g.create();
gBackground.drawImage(image, 0, 0, getWidth(), getHeight(), this);
gBackground.dispose();
}
};
    //加载背景
private void doLay() {
Container container = getContentPane();
container.add(canvas);
// pack();
setVisible(true);
}

}

 

package ui.mainUi;

import javax.swing.JButton;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class mainPanel extends JPanel
{

private JMenuBar mainMenu;
private mainPanel lyricsPanel;
private JButton pauseButton;
private JButton playerButton;
private JButton nextone;
private JButton previousone;

mainPanel()
{
nextone = new Button(
“E:\yangwei””s home\java\Application\Application\player\img\fastForward.png”);
nextone.setBounds(new  Rectangle(165,55,40,30));
playerButton=new Button(“E:\yangwei””s home\java\Application\Application\player\img\play.png”);
playerButton.setBounds(210,55,40,30);
previousone = new Button(“E:\yangwei””s home\java\Application\Application\player\img\rewind.png”);
previousone.setBounds(255,55,40,30);
setLayout(null);
add(previousone,null);
add(playerButton,null);
add(nextone,null);
JSlider VolumeControl=new JSlider();
VolumeControl.setBounds(275, 55, 40, 30);
VolumeControl.setPaintLabels(true);
add(VolumeControl);
        setVisible(true);
}

}

麻烦帮忙看下

你那个setBounds()里的参数设置不合理,导致button互相挡住了

而且,
private JButton previousone;
previousone = new Button(“E:\yangwei””s home\java\Application\Application\player\img\rewind.png”);

这个不知道是怎么编译过去的


20分
引用 2 楼  的回复:

麻烦帮忙看下

你自己做的component挡住你的按钮了。将背景图片相关的代码从mainFrame中删掉,改在MainPanel中做就行了,如下:

class MainPanel extends JPanel {

	private JMenuBar mainMenu;
	private MainPanel lyricsPanel;
	private JButton pauseButton;
	private JButton playerButton;
	private JButton nextone;
	private JButton previousone;

	private static final Image image = Toolkit.getDefaultToolkit().getImage(
			"images/Cat.gif");

	// 加载播放器的背景
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics gBackground = g.create();
		gBackground.drawImage(image, 0, 0, getWidth(), getHeight(), this);
		gBackground.dispose();
	}

	MainPanel() {
		nextone = new JButton(
				"E:\yangwei""s home\java\Application\Application\player\img\fastForward.png");
		nextone.setBounds(new Rectangle(165, 55, 40, 30));
		playerButton = new JButton(
				"E:\yangwei""s home\java\Application\Application\player\img\play.png");
		playerButton.setBounds(210, 55, 40, 30);
		previousone = new JButton(
				"E:\yangwei""s home\java\Application\Application\player\img\rewind.png");
		previousone.setBounds(255, 55, 40, 30);
		setLayout(null);
		add(previousone, null);
		add(playerButton, null);
		add(nextone, null);
		// JSlider VolumeControl = new JSlider();
		// VolumeControl.setBounds(275, 55, 40, 30);
		// VolumeControl.setPaintLabels(true);
		// add(VolumeControl);
		setVisible(true);
	}

}
引用 4 楼  的回复:

引用 2 楼  的回复:

麻烦帮忙看下

你自己做的component挡住你的按钮了。将背景图片相关的代码从mainFrame中删掉,改在MainPanel中做就行了,如下:
Java code

class MainPanel extends JPanel {

    private JMenuBar mainMenu;
    private MainPanel lyrics……

首先谢谢,用了你的方法之后问题确实是解决了,
但是能否请你详细解释一下呢?我原来的哪种方法错在哪里?是那个component 挡住了那些个button?

引用 5 楼  的回复:

是那个component 挡住了那些个button?

是的,就是MainFrame中的那个canvas,你用的是JComponent匿名子类方式定义的。这个Component自己绘自己,绘的时候就把几个按钮盖住了。
但如果改在MainPanel中,让Panel自己绘背景,则绘完后Panel自动重绘它自己的组件(你的按钮),因而问题就解决了。

引用 6 楼  的回复:

引用 5 楼  的回复:

是那个component 挡住了那些个button?

是的,就是MainFrame中的那个canvas,你用的是JComponent匿名子类方式定义的。这个Component自己绘自己,绘的时候就把几个按钮盖住了。
但如果改在MainPanel中,让Panel自己绘背景,则绘完后Panel自动重绘它自己的组件(你的按钮),因而问题就解决了。

这样是可以了,但是出现了一个新的问题 我在button上加的那些图片不能显示了。


20分
引用 7 楼  的回复:

这样是可以了,但是出现了一个新的问题 我在button上加的那些图片不能显示了。

JButton上加图片,用setIcon方法。

   遇到了相同的问题
我调了好几个小时,最后一下子来了灵感,解决的方法就是把所有的按钮添加完了只后在来个刷新函数就ok了。     SwingUtilities.updateComponentTreeUI(this);    

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明JButton 只有当鼠标划过的时候才能显示