2013-04-17 16 views
7

Ich versuche, einen einfachen Rechner zu machen, um Grafiken zu üben (ich bin ein komplettes GUI noob). Ich habe einige Probleme mit unnötigen Leerzeichen nach dem Polyashenkos Calulator und dem Textbereich und dem Abstand zwischen dem Textbereich und den Schaltflächen. Wie behalte ich dieses Layout, aber eliminiere den Platz und mache auch die unteren 3 Tasten kleiner. Irgendwelche Tipps darüber, was ich mache oder wie ich es besser machen könnte, wären sehr willkommen. Vielen Dank.Wie man mehrere Panels in JFrame anordnet

enter image description here

import javax.swing.*; 
import java.awt.*; 

public class calculator { 

    public static void main(String[] args) { 
     // creates the JFrame(a window with decorations) 
     JFrame frame = new JFrame("Calculator"); 
     // stops the program when window is closed 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(377, 350); 

     // the main panel of the JFrame, 
     // remembet you cant add content directly to JFrame 
     JPanel content = new JPanel(new GridLayout(4, 0)); 
     // panel for the text field 
     JPanel textarea = new JPanel(new GridLayout(4, 0)); 
     // panel for the buttons, 
     // GridLayout(int rows, int cols, int horiz_gap, int vert_gap) 
     JPanel buttonarea = new JPanel(new GridLayout(4, 5, 2, 2)); 

     // the panel for the bigger bottom buttons 
     JPanel secondbuttonarea = new JPanel(new GridLayout(1, 1, 2, 2)); 
     // the panel for the text on top 
     JPanel label = new JPanel(); 
     content.add(label); 
     content.add(textarea); 
     content.add(buttonarea); 
     content.add(secondbuttonarea); 

     JLabel words = new JLabel("Polyashenko's Calculator", JLabel.CENTER); 
     label.add(words); 

     JTextField enterhere = new JTextField("0.", JTextField.CENTER); 
     // will set the curser of the text bar on right side 
     enterhere.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); 
     textarea.add(enterhere); 

     // makes a button called b1 with text in it 
     JButton b1 = new JButton("BkSP"); 
     // adds the backspace button to the buttonarea panel 
     buttonarea.add(b1); 
     JButton b2 = new JButton("CE"); 
     buttonarea.add(b2); 
     JButton b3 = new JButton("C"); 
     buttonarea.add(b3); 
     JButton b4 = new JButton("/"); 
     buttonarea.add(b4); 
     JButton b5 = new JButton("sqrt"); 
     buttonarea.add(b5); 
     JButton b6 = new JButton("7"); 
     buttonarea.add(b6); 
     JButton b7 = new JButton("8"); 
     buttonarea.add(b7); 
     JButton b8 = new JButton("9"); 
     buttonarea.add(b8); 
     JButton b9 = new JButton("*"); 
     buttonarea.add(b9); 
     JButton b10 = new JButton("%"); 
     buttonarea.add(b10); 
     JButton b11 = new JButton("4"); 
     buttonarea.add(b11); 
     JButton b12 = new JButton("5"); 
     buttonarea.add(b12); 
     JButton b13 = new JButton("6"); 
     buttonarea.add(b13); 
     JButton b14 = new JButton("-"); 
     buttonarea.add(b14); 
     JButton b15 = new JButton("1/x"); 
     buttonarea.add(b15); 
     JButton b16 = new JButton("1"); 
     buttonarea.add(b16); 
     JButton b17 = new JButton("2"); 
     buttonarea.add(b17); 
     JButton b18 = new JButton("3"); 
     buttonarea.add(b18); 
     JButton b19 = new JButton("+"); 
     buttonarea.add(b19); 
     JButton b20 = new JButton("+/-"); 
     buttonarea.add(b20); 

     JButton b21 = new JButton("0"); 
     secondbuttonarea.add(b21); 
     JButton b22 = new JButton("."); 
     secondbuttonarea.add(b22); 
     JButton b23 = new JButton("="); 
     secondbuttonarea.add(b23); 

     // adds the buttonarea panel to the main panel 
     frame.getContentPane().add(content); 
     // makes the window visible, put at end of program 
     frame.setVisible(true); 
    } 
} 
+1

Für die Zukunft: Netbeans und MyEclipse beide haben eine handliche Swing-GUI WYSIWYG Editor, der das einfach macht. Sie müssen wirklich anfangen, da es kein vorhandenes Programm und Hilfe braucht. –

+2

@ user2146529 Bitte ignorieren Sie oben Schuss in den dunklen, falschen Vorschlag, Ihre Möglichkeiten sind gut, Sie sind nicht Strafgefangen von GUI_Builders – mKorbel

+0

@ user2146529 Suche hier [Java + Swing + Rechner] (http://stackoverflow.com/search?lang=de) Tab = neuestes & q = Java% 20% 2b% 20Schwung% 20% 2b% 20Kalkulator) – mKorbel

Antwort

5

eine der Lektionen von Hovercraft Full Of Eels (-: forums.sun.com :-)

enter image description here

enter image description here

import java.awt.BorderLayout; 
import java.awt.Font; 
import java.awt.GridLayout; 
import java.awt.Window; 
import java.awt.event.*; 
import javax.swing.*; 

public class SciCalc { 

    private static void createAndShowUI() { 
     SciCalcGui gui = new SciCalcGui(); 
     SciCalcMenu menu = new SciCalcMenu(gui); 
     JFrame frame = new JFrame("Calculator"); 
     frame.getContentPane().add(gui.getMainPanel()); 
     frame.setJMenuBar(menu.getJMenuBar()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       createAndShowUI(); 
      } 
     }); 
    } 

    private SciCalc() { 
    } 
} 

class SciCalcGui { 

    private static final String[][] STANDARD_BTN_TEXTS = { 
     {"7", "8", "9", "/"}, {"4", "5", "6", "*"}, 
     {"1", "2", "3", "-"}, {"0", ".", "=", "+"}}; 
    private static final String[][] SCIENTIFIC_BTN_TEXTS = { 
     {"sqrt", "1/x", "sin"}, {"%", "Exp", "cos"}, 
     {"x^y", "ln", "tan"}, {"x^2", "n!", "sec"}}; 
    private static final int GAP = 5; 
    private static final Font BTN_FONT = new Font(Font.DIALOG, Font.BOLD, 20); 
    private JPanel mainPanel = new JPanel(); 
    private JPanel sciPanel; 
    private JTextField display = new JTextField(); 

    SciCalcGui() { 
     display.setFont(BTN_FONT); 
     JPanel standardPanel = createBtnPanel(STANDARD_BTN_TEXTS, "Standard"); 
     sciPanel = createBtnPanel(SCIENTIFIC_BTN_TEXTS, "Scientific"); 
     mainPanel.setLayout(new BorderLayout()); 
     mainPanel.setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP)); 
     mainPanel.add(standardPanel, BorderLayout.CENTER); 
     mainPanel.add(sciPanel, BorderLayout.WEST); 
     mainPanel.add(display, BorderLayout.NORTH); 
     sciPanel.setVisible(false); 
    } 

    public void sciPanelSetVisible(boolean visible) { 
     sciPanel.setVisible(visible); 
     Window win = SwingUtilities.getWindowAncestor(mainPanel); 
     win.pack(); 
    } 

    public JPanel getMainPanel() { 
     return mainPanel; 
    } 

    private JPanel createBtnPanel(String[][] texts, String title) { 
     JPanel btnPanel = new JPanel(); 
     int rows = texts.length; 
     int cols = texts[0].length; 
     btnPanel.setLayout(new GridLayout(rows, cols, GAP, GAP)); 
     for (int row = 0; row < texts.length; row++) { 
      for (int col = 0; col < texts[row].length; col++) { 
       JButton btn = new JButton(texts[row][col]); 
       btn.setFont(BTN_FONT); 
       btnPanel.add(btn); 
      } 
     } 
     btnPanel.setBorder(BorderFactory.createTitledBorder(title)); 
     return btnPanel; 
    } 
} 

class SciCalcMenu { 

    private static final String STANDARD = "Standard"; 
    private static final String SCIENTIFIC = "Scientific"; 
    private SciCalcGui gui; 
    private JMenuBar menuBar = new JMenuBar(); 
    private JMenuItem standardView; 
    private JMenuItem scientificView; 

    SciCalcMenu(SciCalcGui gui) { 
     this.gui = gui; 
     standardView = new JMenuItem(STANDARD, KeyEvent.VK_T); 
     scientificView = new JMenuItem(SCIENTIFIC, KeyEvent.VK_S); 
     ViewAction viewAction = new ViewAction(); 
     standardView.addActionListener(viewAction); 
     scientificView.addActionListener(viewAction); 
     standardView.setEnabled(false); 
     JMenu viewMenu = new JMenu("View"); 
     viewMenu.setMnemonic(KeyEvent.VK_V); 
     viewMenu.add(standardView); 
     viewMenu.add(scientificView); 
     menuBar.add(new JMenu("Edit")); 
     menuBar.add(viewMenu); 
     menuBar.add(new JMenu("Help")); 
    } 

    public JMenuBar getJMenuBar() { 
     return menuBar; 
    } 

    private class ViewAction implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      String command = e.getActionCommand(); 
      if (command.equals(STANDARD)) { 
       gui.sciPanelSetVisible(false); 
       standardView.setEnabled(false); 
       scientificView.setEnabled(true); 
      } else if (command.equals(SCIENTIFIC)) { 
       gui.sciPanelSetVisible(true); 
       standardView.setEnabled(true); 
       scientificView.setEnabled(false); 
      } 
     } 
    } 
} 
1

A GridLayout wird in Fällen wie diesem nicht immer sehr gut aussehen.

Der Inhalt wird erweitert, um die Box im Raster zu füllen. Sie haben nur eine minimale Kontrolle über den Abstand zwischen Zeilen und Spalten.

Möglicherweise müssen Sie das Layout ändern, damit es so aussieht, wie Sie es möchten. GridBagLayout hat all diese Kontrolle, ist aber viel schwieriger zu konfigurieren.

Manchmal können Sie Panels mit BorderLayout und GridLayout verschachteln, damit es vernünftig aussieht. Aber es ist Swing und das bedeutet, dass es verwendbar ist, aber es wird sehr schwierig, es glatt aussehen zu lassen.

Ich verwende immer gerne eine FlowLayout für OK/Cancel-Tasten. Sie sehen auf diese Weise am besten zu mir aus und du kannst sie alle nach links, rechts oder zentriert schieben. Ihre Taschenrechner-Tasten sollten gut mit einer GridLayout funktionieren, aber Sie können nicht leicht eine große "Enter" -Taste oder eine breite "0" -Taste haben.

Verwenden Sie zum Beispiel eine vertikale BoxLayout anstelle eines Gitters, das 4 hoch mal 1 breit ist.