简体   繁体   English

计算器:按钮仅在测试 JFrame 类中鼠标悬停在按钮上时显示

[英]Calculator: Buttons ONLY show up when mouse hovers over them in Test JFrame class

I'm rushing, so idc about the duplicate.我很着急,所以 idc 关于重复。 I'm still trying to learn Java and the terms, until the end of this semester, that is.我仍在努力学习 Java 和术语,直到本学期结束。 I used a template.我用了一个模板。 I'm using a background image ("panel"), which complicates everything.我正在使用背景图像(“面板”),这使一切变得复杂。

Basically, the buttons only show up when I hover over them.基本上,按钮仅在我将鼠标悬停在它们上方时才会显示。 It has something to do w/ the JPanels, clearly.显然,它与 JPanels 有关系。

I excluded code that you'd probably ask for so that hopefully, someone helps me this time because my buttons are not like the ones I've seen when looking on other recommended posts.我排除了您可能会要求的代码,希望这次有人可以帮助我,因为我的按钮与我在查看其他推荐帖子时看到的不同。

Also, can I make the JFrame a fixed size (the size in the Test class code)?另外,我可以将 JFrame 设为固定大小(Test 类代码中的大小)吗?

Code may be redundant, but I'm just trying to make everything work.代码可能是多余的,但我只是想让一切正常。 Keep in mind, I'm NEW to Java.请记住,我是 Java 新手。

TEST CLASS:测试类:

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);
}
}

MAIN:主要的:

    public class SimpleArithmeticCalculator extends JPanel implements ActionListener {

         //BUTTONSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS !
         ...
         // jpanels, buttons, font, values, etc

        public SimpleArithmeticCalculator() {

          super();

      //I THINK this is the problem:  

      buttonPanel.setForeground(null);
      textPanel.setForeground(null);
      calcPanel.setForeground(null);

      textPanel.setLayout(new GridLayout(0,1,0,0));
      buttonPanel.setLayout(new GridLayout(0 , 5 , 5 , 5));

      displayText = new JTextField("" , 20);
      displayText.setHorizontalAlignment(JTextField.RIGHT);
      displayText.setFont(font);
      displayText.setEditable(false);

      textPanel.add(displayText);
      buttons = new JButton[NUM_BUTTONS];

      for (int i = 0 ; i < NUM_BUTTONS ; ++i) {

          buttons[i] = new JButton("" + buttonTexts[i]);
          buttons[i].setMnemonic(buttonKeys[i]);
          buttons[i].setFont(font);
          buttons[i].setMinimumSize(new Dimension(50,50));
          buttons[i].setActionCommand("" + buttonTexts[i]);
          buttons[i].addActionListener(this);
          buttonPanel.add(buttons[i]);
      }

      buttons[BTN_POWER].setText("^");
      buttons[BTN_PERCENT].setText("%");

      buttonPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
      textPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
      calcPanel.setLayout(new BorderLayout());
      calcPanel.add(textPanel , BorderLayout.NORTH);
      calcPanel.add(buttonPanel , BorderLayout.CENTER);
      add(calcPanel);

      setMinimumSize(new Dimension(358,379));

      setPreferredSize(new Dimension(359,381));

       for (int i = 0 ; i < NUM_BUTTONS ; ++i) {
           buttons[i].setMaximumSize(buttons[i].getSize());
       }

   }

     public void SetColors(Color bg , Color textbg , Color textcolor) {

       calcPanel.setBackground(bg);
       calcPanel.setVisible(true);
       calcPanel.setOpaque(false);
       buttonPanel.setBackground(bg);
       buttonPanel.setVisible(true);
       buttonPanel.setOpaque(false);
       textPanel.setBackground(bg);
       textPanel.setOpaque(true);
       textPanel.setVisible(true);
       displayText.setBackground(textbg);
       displayText.setForeground(textcolor);

       for (int i = 0 ; i < NUM_BUTTONS ; ++i) { 
            buttons[i].setForeground(textcolor);
       }

     }

     //ACTION PERFORMED STUFF & OPERATIONS, BLAH

     public boolean isOpCharacter(char c) {

          return ((c == buttonTexts[BTN_MULT]) ||
                  (c == buttonTexts[BTN_DIV]) ||
                  (c == buttonTexts[BTN_PLUS]) ||
                  (c == buttonTexts[BTN_MINUS]) ||
                  (c == buttonTexts[BTN_POWER]) ||
                  (c == buttonTexts[BTN_PERCENT]));
     }

     public boolean isNumericCharacter(char c) {

      return ((c == buttonTexts[BTN_ZERO]) ||
        (c == buttonTexts[BTN_ONE]) ||
        (c == buttonTexts[BTN_TWO]) ||
        (c == buttonTexts[BTN_THREE]) ||
        (c == buttonTexts[BTN_FOUR]) ||
        (c == buttonTexts[BTN_FIVE]) ||
        (c == buttonTexts[BTN_SIX]) ||
        (c == buttonTexts[BTN_SEVEN]) ||
        (c == buttonTexts[BTN_EIGHT]) ||
        (c == buttonTexts[BTN_NINE]) ||
        (c == buttonTexts[BTN_DECIMAL]));

     }

     public boolean isNonZeroNumber(char c) {

      return (c == buttonTexts[BTN_ONE] ||
        c == buttonTexts[BTN_TWO] ||
        c == buttonTexts[BTN_THREE] ||
        c == buttonTexts[BTN_FOUR] ||
        c == buttonTexts[BTN_FIVE] ||
        c == buttonTexts[BTN_SIX] ||
        c == buttonTexts[BTN_SEVEN] ||
        c == buttonTexts[BTN_EIGHT] ||
        c == buttonTexts[BTN_NINE]);

     }

        public static void main(String[] args) { }
 }

There is no need to create an image panel class.无需创建图像面板类。 You can use a JLabel to display an ImageIcon.您可以使用 JLabel 来显示 ImageIcon。

    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);

If I had to make a wild guess I would say the problem is that you are using frame.pack() BEFORE you add all the components to the frame.如果我不得不做一个疯狂的猜测,我会说问题在于您在将所有组件添加到框架之前使用了 frame.pack() 。

The basic code for creating a frame should be:创建框架的基本代码应该是:

//  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);

Update:更新:

Another problem could be with the following code:另一个问题可能与以下代码有关:

frame.add(panel);
frame.add(calc);

By default a frame uses a BorderLayout.默认情况下,框架使用 BorderLayout。 When you add components to the frame they are added to the CENTER by default and the problem is only a single component can be added to the CENTER at one time.当您将组件添加到框架时,它们默认添加到 CENTER,问题是一次只能将单个组件添加到 CENTER。 It looks like you are trying to have a background image.看起来您正在尝试使用背景图像。 If this is the case then as I suggested earlier you can use a JLabel for the background.如果是这种情况,那么正如我之前建议的那样,您可以使用 JLabel 作为背景。 Your code should be something like:你的代码应该是这样的:

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 );

Now the calculator will be displayed on top of the background.现在计算器将显示在背景的顶部。 Or if you still want to use your ImagePanel then the concept is still the same, you add the calculator to the image panel and the image panel to the frame.或者,如果您仍然想使用 ImagePanel,那么概念仍然相同,您将计算器添加到图像面板,将图像面板添加到框架。

Here is your problem You have calc created and shown before the panel and the panel shown before the frame.这是您的问题您在面板之前创建并显示了 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

Yet the calc goes on the panel and the panel goes on the frame.然而,计算在面板上,面板在框架上。 You have them reversed.你把它们颠倒了。 Create the frame first.首先创建框架。 Then create the panel and put the panel inside the frame.然后创建面板并将面板放在框架内。 then make the calc and put it inside the panel.然后制作calc并将其放入面板内。 Then show frame.然后显示框架。 show panel.显示面板。 show calc.显示计算。 You just have the order wrong.你只是顺序错了。 I've done this many times.我已经做过很多次了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM