计算器:按钮仅在鼠标hover在Test JFrame类中时显示

我很急,所以关于副本的idc。 我还在尝试学习Java和术语,直到本学期结束,就是这样。 我用了一个模板。 我正在使用背景图像(“面板”),这使一切变得复杂。

基本上,当我将鼠标hover在按钮上时,按钮才会显示。 它显然与JPanels有关。

我排除了你可能会要求的代码,所以希望这次有人帮助我,因为我的按钮不像我在查看其他推荐post时看到的那些。

另外,我可以将JFrame设置为固定大小(Test类代码中的大小)吗?

代码可能是多余的,但我只是想让一切正常。 请记住,我是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); } } 

主要:

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

无需创建图像面板类。 您可以使用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); 

如果我不得不疯狂猜测,我会说问题是你在使用frame.pack()之前将所有组件添加到框架中。

创建框架的基本代码应该是:

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

默认情况下,框架使用BorderLayout。 向框架添加组件时,默认情况下它们会添加到CENTER中,问题是一次只能将一个组件添加到CENTER中。 看起来你正在尝试拥有背景图像。 如果是这种情况,那么正如我之前建议的那样,您可以使用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,则概念仍然相同,您将计算器添加到图像面板,将图像面板添加到框架。

这是你的问题你已经在面板和面板前显示的面板之前创建并显示了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 

然而,计算结果显示在面板上,面板进入框架。 你让他们逆转了。 首先创建框架。 然后创建面板并将面板放在框架内。 然后制作计算并将其放入面板内。 然后显示框架。 展示小组。 显示计算。 你的订单错了。 我做过很多次了。