簡體   English   中英

一個JFrame中有多個對象

[英]More than 1 object in a single JFrame

我希望有人可以以此將我推向正確的方向。 我有3個單獨的類, CalculatorCalculator2Calculator3 原則上,它們是相同的,只是對一些按鈕做了一些更改,因此,我將只粘貼Calculator的代碼。 我想知道如何才能使它們全部出現在單個JFrame並在主機中彼此相鄰? 我也附上了最近一次的主打嘗試。

這是Calculator

public class Calculator implements ActionListener {
private JFrame frame;
private JTextField xfield, yfield;
private JLabel result;
private JButton subtractButton;
private JButton divideButton;
private JButton addButton;
private JButton timesButton;
private JPanel xpanel;

public Calculator() {      
    frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new BorderLayout());

    xpanel = new JPanel();
    xpanel.setLayout(new GridLayout(3,2));

    xpanel.add(new JLabel("x:", SwingConstants.RIGHT));
    xfield = new JTextField("0", 5);
    xpanel.add(xfield);

    xpanel.add(new JLabel("y:", SwingConstants.RIGHT));
    yfield = new JTextField("0", 5);
    xpanel.add(yfield);

    xpanel.add(new JLabel("Result:"));
    result = new JLabel("0");
    xpanel.add(result);
    frame.add(xpanel, BorderLayout.NORTH);

    /***********************************************************************
     *********************************************************************** 
     **********************************************************************/

    JPanel southPanel = new JPanel();                      //New panel for the artimatic buttons
    southPanel.setBorder(BorderFactory.createEtchedBorder());

    timesButton = new JButton("Multiplication");
    southPanel.add(timesButton);
    timesButton.addActionListener(this);

    subtractButton = new JButton("Subtract");
    southPanel.add(subtractButton);
    subtractButton.addActionListener(this);

    divideButton = new JButton("Division");
    southPanel.add(divideButton);
    divideButton.addActionListener(this);

    addButton = new JButton("Addition");
    southPanel.add(addButton);
    addButton.addActionListener(this);

    frame.add(southPanel , BorderLayout.SOUTH);

    Font thisFont = result.getFont();                                       //Get current font
    result.setFont(thisFont.deriveFont(thisFont.getStyle() ^ Font.BOLD));   //Make the result bold
    result.setForeground(Color.red);                                        //Male the result answer red in color
    result.setBackground(Color.yellow);                                     //Make result background yellow
    result.setOpaque(true);

    frame.pack();
    frame.setVisible(true);
}
/**
 * clear()
 * Resets the x and y field to 0 after invalid integers were input
 */
public void clear() {
    xfield.setText("0");
    yfield.setText("0");
}

@Override
public void actionPerformed(ActionEvent event) { 
    String xText = xfield.getText();                        //Get the JLabel fiels and set them to strings
    String yText = yfield.getText();

    int xVal;
    int yVal;

    try {
        xVal = Integer.parseInt(xText);                     //Set global var xVal to incoming string
        yVal = Integer.parseInt(yText);                     //Set global var yVal to incoming string
    }
    catch (NumberFormatException e) {                       //xVal or yVal werent valid integers, print message and don't continue
        result.setText("ERROR");
        clear();
        return ;
    } 

    if(event.getSource().equals(timesButton)) {             //Button pressed was multiply
        result.setText(Integer.toString(xVal*yVal)); 
    }
    else if(event.getSource().equals(divideButton)) {       //Button pressed was division
        if(yVal == 0) {                                   //Is the yVal (bottom number) 0?
            result.setForeground(Color.red);              //Yes it is, print message
            result.setText("CAN'T DIVIDE BY ZERO!");
            clear();
        }
        else          
            result.setText(Integer.toString(xVal/yVal));  //No it's not, do the math
    }
    else if(event.getSource().equals(subtractButton)) {    //Button pressed was subtraction                                          
        result.setText(Integer.toString(xVal-yVal)); 
    }
    else if(event.getSource().equals(addButton)) {        //Button pressed was addition
        result.setText(Integer.toString(xVal+yVal)); 
    }
  }
}

這是我當前的主要內容:

public class DemoCalculator {
public static void main(String[] args) {
    JFrame mainFrame = new JFrame("Calculators");
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Calculator calc = new Calculator();
    Calculator2 calc2 = new Calculator2();
    JPanel calcPanel = new JPanel(new BorderLayout());
    JPanel calcPanel2 = new JPanel(new BorderLayout());

    JPanel mainPanel = new JPanel();
    mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));

    //calcPanel.add(calc, BorderLayout.CENTER);
    //calcPanel2.add(calc2, BorderLayout.CENTER);
    mainPanel.add(calcPanel);
    mainPanel.add(calcPanel2);
    calcPanel.add(mainPanel);

    mainFrame.getContentPane().add(calcPanel);
    mainFrame.getContentPane().add(calcPanel2);
    mainFrame.pack();
    mainFrame.setVisible(true); 
    }
}

您應該只創建一個JFrame並將每個計算器類放入一個JPanel中。不要為每個類創建新的JFrame。

public class Calculator{ 

JPanel panel;
public Calculator(){

  panel = new JPanel();

  /*
  *  Add labels and buttons etc.
  */
   panel.add(buttons);
   panel.add(labels);
}

  //Method to return the JPanel
  public JPanel getPanel(){
  return panel;
 }
}

然后使用最適合您需要的布局將面板添加到測試人員類的JFrame中。

public class DemoCalculator {

public static void main(String[] args) {

    JPanel cal1,cal2;
    JFrame frame = new JFrame("Calculators");

    frame.add(cal1 = new Calculator().getPanel(),new BorderLayout().EAST);
    frame.add(cal2 = new Calculator2().getPanel(),new BorderLayout().WEST);

    frame.setSize(1000,600);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setResizable(false);
    frame.setVisible(true);
  } 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM