2012-03-28 75 views
0

我編寫了一個程序,它創建了一個框架,它將顯示一個控制面板和可視面板。但是控制面板中的按鈕佔用太多空間。所以任何機構有任何想法如何解決它?鑑於是代碼。按鈕對齊不正確,右側組件太大

import java.awt.*; 
import java.awt.event.KeyEvent; 

import javax.swing.*; 

/** 
* This class generates and displays a visualization of a Sierpinski 
* 
*/ 
public class tOpost 
{ 
    private JFrame window; 
    private JTextField depthTextField; 
    private Canvas visual; 


    // declare and initialize default values 
    private int canvasSize = 512; 


    /** 
    * Creates a new window and displays a visualization of a Mandelbrot set 
    */ 
    public tOpost() 
    { 
     // create new window 

     window = new JFrame("Sierpinski Visulaizer"); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     window.setLayout(new FlowLayout(FlowLayout.LEFT)); 

     // create main panel 
     JPanel mainPanel = new JPanel(new GridLayout(0,1)); 

     // create textfields with labels 
     JPanel depthField = new JPanel(new FlowLayout()); 
     depthField.add(new JLabel("Recursive Depth: ")); 
     depthTextField = new JTextField(""); 
     depthTextField.setPreferredSize(new Dimension(80,25)); 
     depthField.add(depthTextField); 


     // create comboBoxes 
     JPanel panel2 = new JPanel(); 
     String[] colorText= {"Blue", "Green"}; 
     panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXIS)); 
     JPanel[] jPanels = new JPanel[5]; 
     for (int i = 0; i<5; i++) { 
      JPanel depthColorPanel = new JPanel(); 
      depthColorPanel.add(new JLabel("Color " + (i + 1) + ": ")); 
      JComboBox comboBox = new JComboBox(colorText); 
      comboBox.setSelectedItem("Blue"); 
      depthColorPanel.add(comboBox); 
      jPanels[i] = depthColorPanel; 
     } 

     JPanel randomColorPanel = new JPanel(); 
     JCheckBox randomColorButton = new JCheckBox("Randomize color at each level"); 
      randomColorButton.setMnemonic(KeyEvent.VK_G); 
     randomColorButton.setSelected(false); 
     randomColorPanel.add(randomColorButton); 

     // create panel for controls 
     panel2.add(depthField); 
     for (JPanel panel : jPanels) { 
      panel2.add(panel); 
     } 
     panel2.add(randomColorPanel); 

     // create button 
     JPanel germinatePanel = new JPanel(new FlowLayout()); 
     JButton germinateButton = new JButton("Draw"); 
     germinatePanel.add(germinateButton); 

     mainPanel.add(panel2); 
     mainPanel.add(germinatePanel); 


     // create canvas for visualization 
     visual = new Canvas(); 
     visual.setBackground(Color.BLACK); 
     visual.setPreferredSize(new Dimension(canvasSize, canvasSize)); 
     mainPanel.setMinimumSize(new Dimension(100, 100)); 
     mainPanel.setPreferredSize(new Dimension(250,canvasSize)); 

     mainPanel.setLocation(750, 250); 
     // pack widgets and display window 
     window.add(visual); 
     window.add(mainPanel); 
     window.pack(); 
     window.setVisible(true); 
     System.out.println(mainPanel.getSize().getHeight()+","+ mainPanel.getSize().getWidth()); 
    } 


    /** 
    * Draws Triangle. 
    * 
    * @param x 
    * @param y 
    * @param s 
    * @param color 
    */ 


    /** 
    * Starts the program by creating a new instance of the Triangle class. 
    */ 
    public static void main(String[] args) 
    { 

     new tOpost(); 
    } 
} 
+0

THISIS問題,以便更快地編輯您的問題n與[SSCCE](http://sscce.org/),減少了另一個錯誤來自CustomisedColor, – mKorbel 2012-03-28 19:30:42

+0

抱歉忘了添加這些類現在添加所需的類。 – 2012-03-28 19:39:09

+0

爲了獲得更好的幫助,只需使用您的UI代碼發佈SSCCE而無需使用任何邏輯代碼,因此我們只需要經過幾行代碼iso,通過幾百 – Robin 2012-03-28 19:45:52

回答

2
  1. 不混合AWT ComponentsSwing JComponents,因爲是可能的,但仍然有一些問題引起

  2. 不申報爲mainPanel.setSize(100,100);,讓這對正確LayoutManager

  3. 工作
  4. JPanel depthField = new JPanel(new FlowLayout());, FlowLayout接受PreferredSize來自JComponents

  5. panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXIS));BoxLayout接受PreferredSize返回JComponents

  6. 的JPanel已實施默認FlowLayout(無LayoutManager任何定義)

  7. 你必須重寫適當的方法Painting in the standard Java GUI

    • 爲AWT Components使用方法paint()

    • 爲Swing JComponents使用方法paintComponent()

編輯

關於佈局管理
  • 這個代碼將會幫助你解決方法的JComboBox
  • enter image description hereenter image description here

    enter image description here

    代碼

    import java.awt.BorderLayout; 
    import java.awt.Color; 
    import java.awt.Component; 
    import java.awt.Dimension; 
    import java.awt.EventQueue; 
    import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 
    
    import javax.swing.ComboBoxEditor; 
    import javax.swing.DefaultListCellRenderer; 
    import javax.swing.JButton; 
    import javax.swing.JColorChooser; 
    import javax.swing.JComboBox; 
    import javax.swing.JFrame; 
    import javax.swing.JLabel; 
    import javax.swing.JList; 
    import javax.swing.ListCellRenderer; 
    import javax.swing.border.LineBorder; 
    import javax.swing.event.EventListenerList; 
    
    class ColorComboBoxEditor implements ComboBoxEditor { 
    
        final protected JButton editor; 
        private EventListenerList listenerList = new EventListenerList(); 
    
        ColorComboBoxEditor(Color initialColor) { 
         editor = new JButton(""); 
         editor.setBackground(initialColor); 
         ActionListener actionListener = new ActionListener() { 
    
          @Override 
          public void actionPerformed(ActionEvent e) { 
           Color currentBackground = editor.getBackground(); 
           Color color = JColorChooser.showDialog(editor, "Color Chooser", currentBackground); 
           if ((color != null) && (currentBackground != color)) { 
            editor.setBackground(color); 
            fireActionEvent(color); 
           } 
          } 
         }; 
         editor.addActionListener(actionListener); 
        } 
    
        @Override 
        public void addActionListener(ActionListener l) { 
         listenerList.add(ActionListener.class, l); 
        } 
    
        @Override 
        public Component getEditorComponent() { 
         return editor; 
        } 
    
        @Override 
        public Object getItem() { 
         return editor.getBackground(); 
        } 
    
        @Override 
        public void removeActionListener(ActionListener l) { 
         listenerList.remove(ActionListener.class, l); 
        } 
    
        @Override 
        public void selectAll() { 
        } 
    
        @Override 
        public void setItem(Object newValue) { 
         if (newValue instanceof Color) { 
          Color color = (Color) newValue; 
          editor.setBackground(color); 
         } else { 
          try { 
           Color color = Color.decode(newValue.toString()); 
           editor.setBackground(color); 
          } catch (NumberFormatException e) { 
          } 
         } 
        } 
    
        protected void fireActionEvent(Color color) { 
         Object listeners[] = listenerList.getListenerList(); 
         for (int i = listeners.length - 2; i >= 0; i -= 2) { 
          if (listeners[i] == ActionListener.class) { 
           ActionEvent actionEvent = new ActionEvent(editor, ActionEvent.ACTION_PERFORMED, color.toString()); 
           ((ActionListener) listeners[i + 1]).actionPerformed(actionEvent); 
          } 
         } 
        } 
    } 
    
    class ColorCellRenderer implements ListCellRenderer { 
    
        private DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer(); 
        private final static Dimension preferredSize = new Dimension(0, 20); 
    
        @Override 
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
         JLabel renderer = (JLabel) defaultRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
         if (value instanceof Color) { 
          renderer.setBackground((Color) value); 
         } 
         if (cellHasFocus || isSelected) { 
          renderer.setBorder(new LineBorder(Color.DARK_GRAY)); 
         } else { 
          renderer.setBorder(null); 
         } 
         renderer.setPreferredSize(preferredSize); 
         return renderer; 
        } 
    } 
    
    class ColorComboBoxEditorRendererDemo { 
    
        public ColorComboBoxEditorRendererDemo() { 
         Color colors[] = {Color.BLACK, Color.BLUE, Color.GREEN, Color.RED, Color.WHITE, Color.YELLOW}; 
         JFrame frame = new JFrame("Color JComboBox"); 
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
         final JComboBox comboBox = new JComboBox(colors); 
         comboBox.setEditable(true); 
         comboBox.setRenderer(new ColorCellRenderer()); 
         Color color = (Color) comboBox.getSelectedItem(); 
         ComboBoxEditor editor = new ColorComboBoxEditor(color); 
         comboBox.setEditor(editor); 
         frame.add(comboBox, BorderLayout.NORTH); 
         final JLabel label = new JLabel(); 
         label.setOpaque(true); 
         label.setBackground((Color) comboBox.getSelectedItem()); 
         frame.add(label, BorderLayout.CENTER); 
         ActionListener actionListener = new ActionListener() { 
    
          @Override 
          public void actionPerformed(ActionEvent actionEvent) { 
           Color selectedColor = (Color) comboBox.getSelectedItem(); 
           label.setBackground(selectedColor); 
          } 
         }; 
         comboBox.addActionListener(actionListener); 
         frame.setSize(300, 200); 
         frame.setVisible(true); 
        } 
    
        public static void main(String args[]) { 
         EventQueue.invokeLater(new Runnable() { 
    
          @Override 
          public void run() { 
           ColorComboBoxEditorRendererDemo colorComboBoxEditorRendererDemo = new ColorComboBoxEditorRendererDemo(); 
          } 
         }); 
        } 
    }