我试图将24个JButtons
添加到我的JPanel
buttonPanel
的GridLayout
,但当我运行它时,我发现没有添加任何按钮。(至少,它们不可见!)。我试着给按钮面板
一个背景色,它是可见的。有人知道我做错了什么吗?
这是我的代码(还有一个类):
package com.Egg;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class NormalCalc implements ActionListener {
static JPanel normalCalcPanel = new JPanel();
JPanel buttonPanel = new JPanel(new GridLayout(6,4,10,10));
Font font = new Font("Monospaced Bold", Font.BOLD, 18);
JButton powB = new JButton("^");
JButton sqrtB = new JButton("sqrt(");
JButton hOpenB = new JButton("(");
JButton hCloseB = new JButton(")");
JButton delB = new JButton("DEL");
JButton acB = new JButton("AC");
JButton mulB = new JButton("*");
JButton divB = new JButton("/");
JButton addB = new JButton("+");
JButton minB = new JButton("-");
JButton decB = new JButton(".");
JButton equB = new JButton("=");
JButton negB = new JButton("(-)");
JButton[] numberButtons = new JButton[10];
JButton[] functionButtons = new JButton[13];
public NormalCalc() {
functionButtons[0] = powB;
functionButtons[1] = delB;
functionButtons[2] = acB;
functionButtons[3] = sqrtB;
functionButtons[4] = mulB;
functionButtons[5] = divB;
functionButtons[6] = hOpenB;
functionButtons[7] = addB;
functionButtons[8] = minB;
functionButtons[9] = hCloseB;
functionButtons[10] = decB;
functionButtons[11] = negB;
functionButtons[12] = equB;
for (int i=0; i<10; i++) {
numberButtons[i] = new JButton(String.valueOf(i));
numberButtons[i].setFocusable(false);
numberButtons[i].setFont(font);
numberButtons[i].addActionListener(this);
}
for (int i=0; i <13; i++) {
functionButtons[i].setFocusable(false);
functionButtons[i].setFont(font);
functionButtons[i].addActionListener(this);
}
normalCalcPanel.setBounds(0, 0, 500, 700);
buttonPanel.setBounds(50, 200, 400, 400);
// Adding the buttons;
buttonPanel.add(functionButtons[0]);
buttonPanel.add(numberButtons[7]);
buttonPanel.add(numberButtons[8]);
buttonPanel.add(numberButtons[9]);
buttonPanel.add(functionButtons[1]);
buttonPanel.add(functionButtons[2]);
buttonPanel.add(functionButtons[3]);
buttonPanel.add(numberButtons[4]);
buttonPanel.add(numberButtons[5]);
buttonPanel.add(numberButtons[6]);
buttonPanel.add(functionButtons[4]);
buttonPanel.add(functionButtons[5]);
buttonPanel.add(functionButtons[6]);
buttonPanel.add(numberButtons[1]);
buttonPanel.add(numberButtons[2]);
buttonPanel.add(numberButtons[3]);
buttonPanel.add(functionButtons[7]);
buttonPanel.add(functionButtons[8]);
buttonPanel.add(functionButtons[9]);
buttonPanel.add(numberButtons[0]);
buttonPanel.add(functionButtons[10]);
buttonPanel.add(functionButtons[11]);
buttonPanel.add(functionButtons[12]);
buttonPanel.repaint();
normalCalcPanel.add(buttonPanel);
normalCalcPanel.add(MainMath.exitButton);
MainMath.frame.add(normalCalcPanel);
MainMath.frame.repaint();
}
@Override
public void actionPerformed(ActionEvent e) {
}
}
其他(主要)类别:
package com.Egg;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class MainMath implements ActionListener {
static JFrame frame = new JFrame("Math Tools");
static JButton exitButton = new JButton("Exit");
JPanel mainPanel = new JPanel();
JLabel mainLabel = new JLabel("Select your tool.", SwingConstants.CENTER);
JButton nB = new JButton("Normal Calc.");
JButton tB = new JButton("Right Triangle Calc.");
JButton eB = new JButton("Equations Calc.");
public MainMath() {
frame.setBounds(300, 300, 500, 700);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(null);
frame.setResizable(false);
mainPanel.setLayout(null);
mainPanel.setBounds(0, 0, 500, 700);
mainLabel.setBounds(100, 25, 300, 50);
mainLabel.setFont(new Font("Monospaced Bold", Font.BOLD, 18));
nB.setBounds(100, 100, 300, 40);
tB.setBounds(100, 150, 300, 40);
eB.setBounds(100, 200, 300, 40);
nB.setFocusable(false);
tB.setFocusable(false);
eB.setFocusable(false);
nB.addActionListener(this);
tB.addActionListener(this);
eB.addActionListener(this);
mainPanel.add(mainLabel);
mainPanel.add(nB);
mainPanel.add(tB);
mainPanel.add(eB);
frame.add(mainPanel);
frame.setVisible(true);
exitButton.setBounds(16, 10, 80, 35);
exitButton.setFocusable(false);
exitButton.addActionListener(this);
}
public static void main(String[] args) {
new MainMath();
System.out.println("");
}
public void setMainScreen() {
frame.remove(exitButton);
frame.remove(NormalCalc.normalCalcPanel);
frame.add(mainPanel);
frame.repaint();
}
public static JFrame getFrame() {
return frame;
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == exitButton)
setMainScreen();
if (e.getSource() == nB) {
frame.remove(mainPanel);
new NormalCalc();
}
if (e.getSource() == tB)
new TriangleCalc();
if (e.getSource() == eB)
new EquationCalc();
}
}
我在您的代码中看到了多个问题:
>
乍一看,你的按钮排列很奇怪。
normalCalcPanel
是静态的,为什么?不应该这样
setBounds(…)
使用布局管理器时,这些语句会被忽略,因此不需要它们
repaint()
除非您在显示GUI后添加/删除了任何元素,否则这些调用都是不必要的,而且还应该附带revalidate()
。
Main Math.exitButton
另一个静态
组件,STOP
MainMath。框架add(normalCalcPanel)
意味着被称为frame
的JFrame
也是静态的,这同样不应该是静态的
(我在这里猜)很可能你正在
MainMath
中创建第二个实例,但是因为我们没有该类的代码,所以我们不知道发生了什么
我运行了你的代码,看起来还可以,所以我相信你的
MainMath
正在创建另一个JFrame
这里有一个计算器配置的例子,它应该可以帮助您类似地构建代码,不是图形用户界面,而是组件和类
好吧,我现在明白了,我不应该使用静态的东西,但是我怎么能把一个面板添加到我在另一个类中创建的框架中呢?我用了静态,因为它看起来很有效
让我们对这个案例做一个类比,假设你的
JFrame
是一本书,而你的JPanel
是那本书的工作表,当你在这些工作表上写作时,你不会将这本书添加/粘贴到工作表中,你把床单加到书上。
所以,在这种情况下是一样的,你的主类应该创建
JPanels
并将它们添加到你的JFrame
中,你的JPanels
类不应该知道你的JFrame
就这本书而言,你的书页不需要知道这本书属于哪本书,你知道这一点,而这本书知道哪些书页属于它,而不是viceversa。
我举了一个例子来告诉你我的意思,我没有重新创建你的GUI,而是尽可能简单地让你明白:
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class AnotherCalculator {
private JFrame frame;
private CalculatorPanel calculatorPanel;
public static void main(String[] args) {
SwingUtilities.invokeLater(new AnotherCalculator()::createAndShowGUI);
}
private void createAndShowGUI() {
frame = new JFrame(getClass().getSimpleName());
calculatorPanel = new CalculatorPanel();
frame.add(calculatorPanel);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class CalculatorPanel extends JPanel {
private String[] operations = {"+", "-", "*", "/", "DEL", "AC", "(", ")", "-", "^", "SQRT", ".", "+/-", "="};
private static final int NUMBER_OF_DIGITS = 10;
private JButton[] buttons;
public CalculatorPanel() {
this.setLayout(new GridLayout(0, 4, 5, 5));
buttons = new JButton[operations.length + NUMBER_OF_DIGITS];
for (int i = 0; i < buttons.length; i++) {
if (i < NUMBER_OF_DIGITS) {
buttons[i] = new JButton(String.valueOf(i));
} else {
buttons[i] = new JButton(operations[i - NUMBER_OF_DIGITS]);
}
this.add(buttons[i]);
}
}
}
嗨,我的问题是我不能添加按钮到动作听者,我会做一个菜单,我不知道为什么我成为一个错误在这里代码包lvl; }哦,我变成了一个错误,错误说不能在静态上下文中使用它,它是由credits.addActionListener(this)创建的;请帮助我
问题内容: 我对git和詹金斯都很陌生。 我将密钥添加到bitbucket和本地计算机中时: 我可以克隆。 但是,当我将相同的url()添加到Jenkins存储库url时,出现以下错误: 问题答案: 您还需要为Jenkins用户设置ssh密钥。 通常的想法是,您登录到Jenkins框,并成为“ jenkins”用户。您可以为您的Jenkins用户打电话,所以请确保使用正确的名称。一旦成为Jenki
问题内容: 我正在使用jQuery SVG。我无法向对象添加或删除类。有人知道我的错误吗? SVG: 不会添加该类的jQuery: 我知道SVG和jQuery可以很好地协作,因为我 可以 定位对象并在单击对象时发出警报: 问题答案: 阅读以下两个答案。 jQuery 3修复了潜在的问题 Vanilla JS:可在现代浏览器中使用 jQuery(小于3)无法将类添加到SVG。 与SVG一起使用,因此
这是GitHub上的python项目,我正在为Magic 8 Ball模拟制作GUI。我似乎无法使用.pack()函数,或者我的窗口只是永远加载而没有实例化。 创建时 当我点击按钮时,文本会出现
一个解决方案是(如果我读对了的话)添加一个任意的JPanel,在这个例子中是一个标签。我的问题是在消息窗口中需要一个JComboBox对象,并且(与解决coffee_table的问题相同)使用JComboBox似乎删除了取消按钮。如果我将YES_NO_CANCEL_OPTION替换为OK_CANCEL_OPTION或question_message并不重要。 对于JOptionPane家族,我仍然
问题内容: 如果html文件是本地文件(在我的C驱动器上),则可以使用,但是如果html文件在服务器上并且图像文件是本地文件,则无法使用。这是为什么? 任何可能的解决方法? 问题答案: 如果客户端可以请求本地文件系统文件,然后使用JavaScript找出其中的内容,则将是一个安全漏洞。 解决此问题的唯一方法是在浏览器中构建扩展。Firefox扩展和IE扩展可以访问本地资源。Chrome的限制更为严