Java 计算器:在TestJFrame类中,只有当鼠标悬停在按钮上方时,按钮才会显示

Java 计算器:在TestJFrame类中,只有当鼠标悬停在按钮上方时,按钮才会显示,java,jpanel,jbutton,calculator,Java,Jpanel,Jbutton,Calculator,我在赶时间,所以idc担心复制品。我仍在努力学习Java及其术语,直到本学期结束。我使用了一个模板。我使用的是背景图像(“面板”),这使一切变得复杂 基本上,按钮只有在我将鼠标悬停在上面时才会显示。显然,这与JPanel有关。 我排除了您可能会要求的代码,希望这次有人能帮助我,因为我的按钮与我在其他推荐帖子中看到的按钮不同 另外,我是否可以将JFrame设置为固定大小(测试类代码中的大小)? 代码可能是多余的,但我只是想让一切正常。请记住,我是Java新手 测试等级: public class

我在赶时间,所以idc担心复制品。我仍在努力学习Java及其术语,直到本学期结束。我使用了一个模板。我使用的是背景图像(“面板”),这使一切变得复杂

基本上,按钮只有在我将鼠标悬停在上面时才会显示。显然,这与JPanel有关。

我排除了您可能会要求的代码,希望这次有人能帮助我,因为我的按钮与我在其他推荐帖子中看到的按钮不同

另外,我是否可以将JFrame设置为固定大小(测试类代码中的大小)?

代码可能是多余的,但我只是想让一切正常。请记住,我是Java新手

测试等级:

public class TestCalculator {    
    public static void main(String[] args) {
        JFrame frame = new JFrame(TestCalculator.class.getSimpleName());
        ImagePanel panel = new ImagePanel(new ImageIcon("01_Crane_AGweb.jpg").getImage());
        SimpleArithmeticCalculator calc = new SimpleArithmeticCalculator();        
        calc.SetColors(null , Color.white , new Color(72,61,139));
        calc.setVisible(true);
        calc.setOpaque(false);
        panel.setVisible(true);
        panel.setOpaque(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        calc.add(panel);
        frame.add(panel);
        frame.add(calc);       
        frame.getContentPane().add(calc);   
        frame.setPreferredSize(new Dimension(358,379));
        frame.setMinimumSize(new Dimension(358,379));
        frame.setVisible(true);
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    }
}
class ImagePanel extends JPanel {
    private Image img;
    public ImagePanel(String img) {
    this(new ImageIcon(img).getImage());
}
public ImagePanel(Image img) {
    this.img = img;
    Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
    this.setPreferredSize(new Dimension(size));
    this.setMinimumSize(new Dimension(size));
    this.setMaximumSize(new Dimension(size));
    this.setSize(new Dimension(size));
    this.setLayout(null);
}
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(img, 0, 0, this.getWidth(),this.getHeight(),this);
}
}
主要内容:

公共类SimpleArtimeticCalculator扩展JPanel实现ActionListener{
//按钮SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS!
...
//jpanel、按钮、字体、值等
公共SimpleMaterialCalculator(){
超级();
//我认为这就是问题所在:
buttonPanel.setForeground(空);
textPanel.setForeground(空);
设置前景(null);
setLayout(新的GridLayout(0,1,0,0));
buttonPanel.setLayout(新的GridLayout(0,5,5,5));
displayText=新的JTextField(“,20);
displayText.setHorizontalAlignment(JTextField.RIGHT);
displayText.setFont(字体);
displayText.setEditable(false);
textPanel.add(显示文本);
按钮=新的JButton[NUM_按钮];
对于(int i=0;i
这是你的问题 您已经在面板之前创建并显示了calc,并且在框架之前显示了面板

    calc.setVisible(true); <------------Visible first
    calc.setOpaque(false);
    panel.setVisible(true); <----Second
    panel.setOpaque(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    calc.add(panel);
    frame.add(panel);
    frame.add(calc);       
    frame.getContentPane().add(calc);   
    frame.setPreferredSize(new Dimension(358,379));
    frame.setMinimumSize(new Dimension(358,379));
    frame.setVisible(true); <---Third
calc.setVisible(true) 这是你的问题
您已经在面板之前创建并显示了calc,并且在框架之前显示了面板

    calc.setVisible(true); <------------Visible first
    calc.setOpaque(false);
    panel.setVisible(true); <----Second
    panel.setOpaque(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    calc.add(panel);
    frame.add(panel);
    frame.add(calc);       
    frame.getContentPane().add(calc);   
    frame.setPreferredSize(new Dimension(358,379));
    frame.setMinimumSize(new Dimension(358,379));
    frame.setVisible(true); <---Third

calc.setVisible(true) 不需要创建图像面板类。您可以使用JLabel显示图像图标

    frame.pack(); // this is the problem, invoke after all the components have been added
    calc.add(panel);
    frame.add(panel);
    frame.add(calc);       
    frame.getContentPane().add(calc);   
    frame.setPreferredSize(new Dimension(358,379)); 
    frame.setMinimumSize(new Dimension(358,379));
    frame.setVisible(true);
如果我不得不胡乱猜测的话,我会说问题是在将所有组件添加到框架之前,您使用的是frame.pack()

    calc.setVisible(true); <------------Visible first
    calc.setOpaque(false);
    panel.setVisible(true); <----Second
    panel.setOpaque(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    calc.add(panel);
    frame.add(panel);
    frame.add(calc);       
    frame.getContentPane().add(calc);   
    frame.setPreferredSize(new Dimension(358,379));
    frame.setMinimumSize(new Dimension(358,379));
    frame.setVisible(true); <---Third
创建框架的基本代码应为:

//  Create all the panel and add all the components to the panels

JPanel panel = new JPanel();
panel.add(..);

//  Create the frame and add all the panels to the frame.

JFrame frame = new JFrame(...);
frame.add( panel ;
frame.pack();
frame.setVisible(true);
更新:

另一个问题可能与以下代码有关:

frame.add(panel);
frame.add(calc);
默认情况下,框架使用边框布局。将构件添加到框架时,默认情况下,构件将添加到中心,问题是一次只能将单个构件添加到中心。看起来您正在尝试创建背景图像。如果是这种情况,那么正如我前面所建议的,您可以使用JLabel作为背景。您的代码应该类似于:

JLabel background = new JLabel( new ImageIcon(...) );
background.setLayout( new BorderLayout() );

SimpleArithmeticCalculator calc = new SimpleArithmeticCalculator();  
background.add( calc );

JFrame frame = new JFrame(...);
frame.add( background );
frame.pack();
frame.setVisible( true );

现在,计算器将显示在背景的顶部。或者,如果仍要使用ImagePanel,则概念仍然相同,可以将计算器添加到图像面板,将图像面板添加到框架。

无需创建图像面板类。您可以使用JLabel
    calc.setVisible(true); <------------Visible first
    calc.setOpaque(false);
    panel.setVisible(true); <----Second
    panel.setOpaque(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    calc.add(panel);
    frame.add(panel);
    frame.add(calc);       
    frame.getContentPane().add(calc);   
    frame.setPreferredSize(new Dimension(358,379));
    frame.setMinimumSize(new Dimension(358,379));
    frame.setVisible(true); <---Third