按钮的对齐在右侧不正确,右侧组件的尺寸太大

时间:2012-03-28 19:04:30

标签: java swing combobox jpanel jcheckbox

我写了一个程序,它创建了一个框架,它将显示一个控制面板和可视面板。控制面板中的按钮占用了太多空间。所以任何身体都知道如何解决它?给出的是代码。

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();
    }
}

1 个答案:

答案 0 :(得分:2)

  1. 不要将AWT ComponentsSwing JComponents混合,因为可能,但仍会导致一些问题

  2. 不要为mainPanel.setSize(100,100);申报,让这是正确的工作LayoutManager

  3. JPanel depthField = new JPanel(new FlowLayout());FlowLayout接受来自JComponentsPreferredSize

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

  5. 默认情况下,JPanel实施了FlowLayout(没有LayoutManager的任何定义)

  6. 您必须覆盖Painting in the standard Java GUI

    的正确方法
    • 用于AWT组件使用方法paint()

    • 对于Swing JComponents使用方法paintComponent()

  7. 修改

    1. 此代码将帮助您解决JComboBox
    2. 的问题

      enter image description here enter 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();
                  }
              });
          } 
      }