首先,我在JFrame中调用了面板。一切正常。
现在,我想从另一个类中调用面板,以在选择其中一个面板之后切换到同一JFrame中的不同面板。我发生的问题如下:
JFrame不会以任何方式响应我对面板设置的更改。无论何时在Panel类内部调整大小,或者在JFrame类中调整大小。
面板总是像Flowlayout一样扩展到与JFrame相同的大小。但是,尝试更改布局既无济于事,也无济于事,因为Panel之前曾工作过(当在JFrame内而不是在单独的类中编码时)。
如何以这种方式修复代码,以便我可以调整面板并使JFrame识别这些更改?我目前正在使用Eclipse和NetBeans。在任何一个都不起作用。
主要:
package calculatorXtreme;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JMenu;
public class Main {
public static void main(String[] args) {
Interface interface1 =new Interface();
interface1.show();
}
}
面板:
package calculatorXtreme;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class PannelDez extends JPanel {
JLabel text = new JLabel();
JButton delete = new JButton();
JButton zero = new JButton();
JButton eins = new JButton();
JButton zwei = new JButton();
JButton drei = new JButton();
JButton vier = new JButton();
JButton fuenf = new JButton();
JButton sechs = new JButton();
JButton sieben = new JButton();
JButton acht = new JButton();
JButton neun = new JButton();
JButton addieren = new JButton();
JButton subtrahieren = new JButton();
JButton multiplizieren = new JButton();
JButton dividieren = new JButton();
JButton ergebnis = new JButton();
JTextField anzeige = new JTextField();
String erg = "";
int temp1;
RechnerInt interfaceRechner = new RechnerInt();
public PannelDez() {
//Panel
this.setSize(400, 500);
anzeige.setBounds(125,100, 200, 50);
anzeige.setSize(200, 50);
anzeige.setEditable(false);
anzeige.setText(erg);
this.add(anzeige);
//Buttons
delete.setText("C");
zero.setText("0");
eins.setText("1");
zwei.setText("2");
drei.setText("3");
vier.setText("4");
fuenf.setText("5");
sechs.setText("6");
sieben.setText("7");
acht.setText("8");
neun.setText("9");
addieren.setText("+");
subtrahieren.setText("-");
multiplizieren.setText("*");
dividieren.setText("/");
ergebnis.setText("=");
this.add(delete);
this.add(zero);
this.add(eins);
this.add(zwei);
this.add(drei);
this.add(vier);
this.add(fuenf);
this.add(sechs);
this.add(sieben);
this.add(acht);
this.add(neun);
this.add(addieren);
this.add(subtrahieren);
this.add(multiplizieren);
this.add(dividieren);
this.add(ergebnis);
delete.addActionListener(new ListenDelete());
zero.addActionListener(new ListenZero());
eins.addActionListener(new ListenEins());
zwei.addActionListener(new ListenZwei());
drei.addActionListener(new ListenDrei());
vier.addActionListener(new ListenVier());
fuenf.addActionListener(new ListenFuenf());
sechs.addActionListener(new ListenSechs());
sieben.addActionListener(new ListenSieben());
acht.addActionListener(new ListenAcht());
neun.addActionListener(new ListenNeun());
addieren.addActionListener(new ListenAddieren());
subtrahieren.addActionListener(new ListenSubtrahieren());
multiplizieren.addActionListener(new ListenMultiplizieren());
dividieren.addActionListener(new ListenDividieren());
ergebnis.addActionListener(new ListenErgebnis());
/* JPanel panel2 = new JPanel();
panel2.setLayout(new FlowLayout()); */
}
public void resizeButtons()
{
delete.setBounds(225, 350, 50, 50);
zero.setBounds(175, 350,50,50);
eins.setBounds(125, 300,50,50);
zwei.setBounds(175, 300,50,50);
drei.setBounds(225, 300,50,50);
vier.setBounds(125, 250,50,50);
fuenf.setBounds(175, 250,50,50);
sechs.setBounds(225, 250,50,50);
sieben.setBounds(125, 200,50,50);
acht.setBounds(175, 200,50,50);
neun.setBounds(225, 200,50,50);
addieren.setBounds(275, 300,50,50);
subtrahieren.setBounds(275, 250,50,50);
multiplizieren.setBounds(275, 200,50,50);
dividieren.setBounds(275, 150,50,50);
ergebnis.setBounds(275, 350,50,50);
}
class ListenDelete implements ActionListener {
public void actionPerformed (ActionEvent e) {
interfaceRechner.operators.clear();
interfaceRechner.numbers.clear();
interfaceRechner.numbersInt.clear();
anzeige.setText("");
}
}
class ListenZero implements ActionListener {
public void actionPerformed (ActionEvent e) {
erg = anzeige.getText();
anzeige.setText(erg + "0");
erg = anzeige.getText();
}
}
class ListenEins implements ActionListener {
public void actionPerformed (ActionEvent e) {
erg = anzeige.getText();
anzeige.setText(erg + "1");
erg = anzeige.getText();
return;
}
}
class ListenZwei implements ActionListener {
public void actionPerformed (ActionEvent e) {
erg = anzeige.getText();
anzeige.setText(erg + "2");
erg = anzeige.getText();
}
}
class ListenDrei implements ActionListener {
public void actionPerformed (ActionEvent e) {
erg = anzeige.getText();
anzeige.setText(erg + "3");
erg = anzeige.getText();
}
}
class ListenVier implements ActionListener {
public void actionPerformed (ActionEvent e) {
erg = anzeige.getText();
anzeige.setText(erg + "4");
erg = anzeige.getText();
}
}
class ListenFuenf implements ActionListener {
public void actionPerformed (ActionEvent e) {
erg = anzeige.getText();
anzeige.setText(erg + "5");
erg = anzeige.getText();
}
}
class ListenSechs implements ActionListener {
public void actionPerformed (ActionEvent e) {
erg = anzeige.getText();
anzeige.setText(erg + "6");
erg = anzeige.getText();
}
}
class ListenSieben implements ActionListener {
public void actionPerformed (ActionEvent e) {
erg = anzeige.getText();
anzeige.setText(erg + "7");
erg = anzeige.getText();
}
}
class ListenAcht implements ActionListener {
public void actionPerformed (ActionEvent e) {
erg = anzeige.getText();
anzeige.setText(erg + "8");
erg = anzeige.getText();
}
}
class ListenNeun implements ActionListener {
public void actionPerformed (ActionEvent e) {
erg = anzeige.getText();
anzeige.setText(erg + "9");
erg = anzeige.getText();
}
}
class ListenAddieren implements ActionListener {
public void actionPerformed (ActionEvent e) {
erg = anzeige.getText();
interfaceRechner.addNumber(Integer.valueOf(erg));
interfaceRechner.addOperators("+");
anzeige.setText("");
erg = null;
}
}
class ListenSubtrahieren implements ActionListener {
public void actionPerformed (ActionEvent e) {
erg = anzeige.getText();
interfaceRechner.addNumber(Integer.valueOf(erg));
interfaceRechner.addOperators("-");
anzeige.setText("");
erg = null;
}
}
class ListenMultiplizieren implements ActionListener {
public void actionPerformed (ActionEvent e) {
erg = anzeige.getText();
interfaceRechner.addNumber(Integer.valueOf(erg));
interfaceRechner.addOperators("*");
anzeige.setText("");
erg = null;
}
}
class ListenDividieren implements ActionListener {
public void actionPerformed (ActionEvent e) {
erg = anzeige.getText();
interfaceRechner.addNumber(Integer.valueOf(erg));
interfaceRechner.addOperators("/");
anzeige.setText("");
erg = null;
}
}
class ListenErgebnis implements ActionListener {
public void actionPerformed (ActionEvent e) {
erg = anzeige.getText();
interfaceRechner.addNumber(Integer.valueOf(erg));
interfaceRechner.addOperators("=");
anzeige.setText(""+interfaceRechner.berechneInt());
}
}
}
JFrame:
package calculatorXtreme;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.plaf.ColorUIResource;
import javax.swing.JButton;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Dimension;
public class Interface extends JFrame {
public Interface(){
// PanelAdden
PannelDez panel2 = new PannelDez();
//panel2.setSize(400, 500);
this.setSize(700, 800);
panel2.setSize(300, 200);
this.setVisible(true);
this.setResizable(false);
panel2.setSize(400, 500);
panel2.setBounds(0, 0, 400, 500);
panel2.resizeButtons();
this.add(panel2);
// Menüleiste
JMenuBar jmb = new JMenuBar();
this.setJMenuBar(jmb);
JMenu file = new JMenu("Option");
jmb.add(file);
JMenuItem dez = new JMenuItem("Dezimal-Rechner");
file.add(dez);
JMenuItem hex = new JMenuItem("Hex-Rechner");
file.add(hex);
this.setVisible(true);
}
}
RechnerInt:
package calculatorXtreme;
import java.util.ArrayList;
import java.util.List;
public class RechnerInt {
List<String> numbers = new ArrayList<>();
List<String> operators = new ArrayList<>();
List<Double> numbersDouble = new ArrayList<>();
List<Integer> numbersInt = new ArrayList<>();
double zahl1, zahl2, ergebnis;
String op;
boolean abbruch = true;
public double rechnen(String op, double zahl1, double zahl2)
{
switch (op) {
case "+":
ergebnis = zahl1 + zahl2;
return ergebnis;
case "-":
ergebnis = zahl1 - zahl2;
return ergebnis;
case "/":
ergebnis = zahl1 / zahl2;
return ergebnis;
case "*":
ergebnis = zahl1 * zahl2;
return ergebnis;
}
return ergebnis;
}
public double meineNemesis() {
zahl1 = numbersDouble.get(0);
for (int i = 1; i <= numbersDouble.size(); i++)
{
op = operators.get(i - 1);
if (op.equals("=")) {
return zahl1;
}
zahl2 = numbersDouble.get(i);
zahl1 = rechnen(op, zahl1, zahl2);
}
return -80085;
}
public int berechneInt()
{
zahl1 = numbersInt.get(0);
for (int i = 1; i <= numbersInt.size(); i++)
{
op = operators.get(i - 1);
if (op.equals("=")) {
return (int)zahl1;
}
zahl2 = numbersInt.get(i);
zahl1 = rechnen(op, zahl1, zahl2);
}
return -80085 ;
}
public void addNumber(int i)
{
numbersInt.add(i);
}
public void addOperators(String op)
{
operators.add(op);
}
}
非常感谢您
答案 0 :(得分:1)
您的问题来自未将JFrame和JPanel的布局都设置为1. Set rs1 = CurrentDb.OpenRecordset("tblOPCEPLTB")
2. Set rs = CurrentDb.OpenRecordset("SELECT * FROM tblOPCEPLTB")
,这样null
才会生效。在不以这种方式显式设置布局的情况下,JPanel将盲目使用其默认的FlowLayout,而JFrame(实际上是contentPane)将盲目使用其默认的BorderLayout
因此需要进行以下更改:
setBounds(...)
class PannelDez extends JPanel {
// .....
public PannelDez() {
// Panel
setLayout(null);
// ....
}
// ....
}
但是,我重申了我之前所说的话:
尽管null布局和setBounds()似乎是Swing新手创建复杂GUI的最简单和最佳方法,但您创建的Swing GUI越多,使用它们时将遇到的困难就越严重。当GUI调整大小时,它们不会重新调整组件的大小;它们是需要增强或维护的皇家女巫;放置在滚动窗格中时,它们会完全失败;在所有平台或与原始分辨率不同的屏幕分辨率下查看时,它们看起来都是令人毛骨悚然的
同样,解决此问题的更好方法是学习和使用布局管理器。例如,您正在创建一个计算器,这很适合使用两个JPanel,一个用于保存使用GridLayout的按钮以创建按钮网格,另一个用于使用BorderLayout来保存上述JPanel在其中心位置,并将JTextField保持在最高位置class Interface extends JFrame {
public Interface() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(null);
// PanelAdden
// .....
}
// ..........
}
。还要注意,最好尽力避免代码重复,就像我们在所有ActionListener中看到的那样。您只需要两个 ActionListeners-每个数字按钮一个,每个操作一个。
下面的代码创建一个如上所述的Swing GUI,一个带有嵌套的JPanels,一个外部使用BorderLayout,内部使用GridLayout(0,4),代表可变的行数(0)和4列。 GUI的图像:
和代码:
import java.awt.BorderLayout; 导入java.awt.Font; 导入java.awt.GridLayout; 导入java.awt.event.ActionEvent; 导入java.awt.event.ActionListener; 导入javax.swing。*;
BorderLayout.PAGE_START
@SuppressWarnings("serial")
public class FooGui02 extends JPanel {
private static final Font BUTTON_FONT = new Font(Font.SANS_SERIF, Font.BOLD, 36);
private static final Font ANZEIGE_FONT = new Font(Font.SANS_SERIF, Font.PLAIN, 24);
private JTextField anzeige = new JTextField(10);
RechnerInt interfaceRechner = new RechnerInt();
public FooGui02() {
anzeige.setFont(ANZEIGE_FONT);
// anzeige.setEnabled(false);
anzeige.setBackground(null);
anzeige.setFocusable(false); // user can't interact with this
// create a grid of 4 columns and variable rows:
JPanel btnPanel = new JPanel(new GridLayout(0, 4));
// create first row
// add 3 blank JLabels
for (int i = 0; i < 3; i++) {
btnPanel.add(new JLabel());
}
btnPanel.add(createOperationButton(Operation.DIVISION));
// second row
btnPanel.add(createNumberButton(7));
btnPanel.add(createNumberButton(8));
btnPanel.add(createNumberButton(9));
btnPanel.add(createOperationButton(Operation.MULTIPLICATION));
// third row
btnPanel.add(createNumberButton(4));
btnPanel.add(createNumberButton(5));
btnPanel.add(createNumberButton(6));
btnPanel.add(createOperationButton(Operation.SUBTRACTION));
// forth row
btnPanel.add(createNumberButton(1));
btnPanel.add(createNumberButton(2));
btnPanel.add(createNumberButton(3));
btnPanel.add(createOperationButton(Operation.ADDITION));
// fifth row
btnPanel.add(new JLabel());
btnPanel.add(createNumberButton(0));
btnPanel.add(createOperationButton(Operation.CLEAR));
btnPanel.add(createOperationButton(Operation.EQUALS));
setLayout(new BorderLayout());
add(anzeige, BorderLayout.PAGE_START);
add(btnPanel);
}
private JButton createOperationButton(Operation operation) {
JButton button = new JButton(operation.getText());
button.addActionListener(new OperationListener(operation));
button.setFont(BUTTON_FONT);
return button;
}
private JButton createNumberButton(int number) {
JButton button = new JButton("" + number);
button.addActionListener(new NumberListener(number));
button.setFont(BUTTON_FONT);
return button;
}
private class OperationListener implements ActionListener {
private Operation operation;
public OperationListener(Operation operation) {
this.operation = operation;
}
@Override
public void actionPerformed(ActionEvent e) {
String text = anzeige.getText();
switch (operation) {
case CLEAR:
interfaceRechner.operators.clear();
interfaceRechner.numbers.clear();
interfaceRechner.numbersInt.clear();
anzeige.setText("");
break;
case ADDITION:
interfaceRechner.addNumber(Integer.valueOf(text));
interfaceRechner.addOperators("+");
anzeige.setText("");
break;
case SUBTRACTION:
interfaceRechner.addNumber(Integer.valueOf(text));
interfaceRechner.addOperators("-");
anzeige.setText("");
break;
case MULTIPLICATION:
interfaceRechner.addNumber(Integer.valueOf(text));
interfaceRechner.addOperators("*");
anzeige.setText("");
break;
case DIVISION:
interfaceRechner.addNumber(Integer.valueOf(text));
interfaceRechner.addOperators("/");
anzeige.setText("");
break;
case EQUALS:
interfaceRechner.addNumber(Integer.valueOf(text));
interfaceRechner.addOperators("=");
anzeige.setText("" + interfaceRechner.berechneInt());
interfaceRechner.operators.clear();
interfaceRechner.numbers.clear();
interfaceRechner.numbersInt.clear();
break;
default:
break;
}
}
}
private class NumberListener implements ActionListener {
private int number;
public NumberListener(int number) {
this.number = number;
}
@Override
public void actionPerformed(ActionEvent e) {
String text = anzeige.getText();
text += number;
anzeige.setText(text);
}
}
private static void createAndShowGui() {
FooGui02 mainPanel = new FooGui02();
JFrame frame = new JFrame("Calculator");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}