gpt4 book ai didi

java - 计算器:仅当鼠标悬停在测试 JFrame 类中的按钮上时才会显示按钮

转载 作者:行者123 更新时间:2023-12-01 17:18:26 25 4
gpt4 key购买 nike

我很着急,所以 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);
}
}

主要:

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

关于java - 计算器:仅当鼠标悬停在测试 JFrame 类中的按钮上时才会显示按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20449977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com