【发布时间】:2013-12-25 08:14:51
【问题描述】:
我很着急,所以 idc 关于副本。我仍在努力学习 Java 和术语,直到本学期结束。我用了一个模板。我正在使用背景图片(“面板”),这会使一切变得复杂。
基本上,这些按钮只有在我将鼠标悬停在它们上方时才会显示。很明显,它与 JPanel 有一些关系。
我排除了您可能会要求的代码,希望这次有人能帮助我,因为我的按钮与我在查看其他推荐帖子时看到的不同。
另外,我可以将 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) { }
}
【问题讨论】:
-
如果您只向我们展示您的一半代码,任何人都很难重现您的问题并找出发生了什么。有没有机会全部粘贴进去?
-
您需要发布相关的内容...您发布了 25 行
private static final int声明...而这些变量甚至都没有在此代码的任何地方使用。该部分可能可以安全地省略...您的问题是按钮可见性...因此找到与该部分相关的所有代码位,发布它们,并省略其他所有内容。 -
@nhgrif 我不同意你的看法。如果我们要帮助这个人找到她的问题,我们应该有她的整个计划。在我看来,每次有人发布一个问题,包括一半的代码,并说“错误在哪里?”,错误结果是他们没有发布的一半。让回答问题的人来判断什么是相关的,什么是不相关的。
-
我发布了按钮,但有人说它太多了。大卫明白。好的,所以,除非我将鼠标悬停在按钮上,否则按钮不会显示。然后,我将再次发布按钮。它编译,所以我测试了它。它只是按钮,恰好是代码中最长的部分。
-
@nhgrif 如果每个在 Stack Overflow 上提出问题的人都已经缩小了错误范围并构建了 SSCCE,那就太好了。但是这个人已经说过她是 Java 新手。也许她只是还没有你的分析和解决问题的能力。所以我们可以为她制造困难,或者我们可以尝试帮助她。我试图帮助她,但是当我在复制/粘贴代码并试图让它编译时(它没有),一个比我聪明的人想出了正确的答案。
标签: java jpanel jbutton calculator