Почему метод setBounds () не работает даже после установки setLayout () в ноль? - PullRequest
2 голосов
/ 20 декабря 2010

Обычно метод setBounds () позиционирует вызываемый объект в указанном месте и в указанном размере. Верно?Я создал класс JFrame и продемонстрировал его работу над кнопкой с настройкой setLayout (null).Затем я создал класс, расширяющий JPanel, и добавил в него некоторые компоненты.Границы для этих компонентов устанавливаются внутри метода.Объект этого класса включен в класс, который расширяет JFrame.Затем этот объект вызывает метод setBound ().Но результат не показывает компоненты в расширенном классе JPanel.фрагмент cde приведен ниже.

class Administrator extends JFrame implements ActionListener
{
  public Administrator()
  {
    setTitle("Administration"); 
    setSize(500,500);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLayout(null);    
    JButton newbutton=new JButton(" New.. ");
    newbutton.addActionListener(this);
    add(newbutton);
    newbutton.setBounds(100,100,100,25);
    setVisible(true);

    public static void main(String arg[])
    {
      new Administrator();
    } 

    public void actionPerformed(ActionEvent ae)
  {
    String act=(String)ae.getActionCommand();
    if(act.equals("New Registry..")||act.equals(" New.. "))
     {
        regPanel rgpnl=new regPanel();

        Dimension sz;
        sz=rgpnl.getPreferredSize(); 
        rgpnl.setBounds(800,800,sz.width,sz.height);       
        rgpnl.arrangeComponents();   
        add(rgpnl);


        repaint();
        setVisible(true);
     }
}
class regPanel extends JPanel 
{
  Label namelab;
  JTextField name;
  JButton do_register;
  public regPanel()
  {
    //Container   = get ();
    setLayout(null);

    namelab=new Label("Name :");
    name=new JTextField(20); 
    add(namelab); 
    add(name);
    add(do_register); 
   }
   public void arrangeComponents() 
  {
    Dimension size;

    size=namelab.getPreferredSize();
    namelab.setBounds(20,10,size.width,size.height);
    name.getPreferredSize();
    name.setBounds(150,10,size.width,size.height); 
    do_register.setBounds(10,10,size.width,size.height);

    repaint();

  }    
}     

Ответы [ 2 ]

6 голосов
/ 20 декабря 2010

Помимо некоторых сомнительных частей вашего кода, таких как отсутствующие фигурные скобки, нулевые указатели и подобные ошибки, ваш код создает компоненты с разрешением (800 800), а интерфейс имеет размер только 500x500 пикселей. Это выведет компоненты из поля зрения. Поместите компоненты с меньшим смещением от начала координат окна, и они будут показаны. (Я проверил это вместе с некоторыми изменениями в вашем коде, такими как порядок выполнения вызовов относительно setLayout(null). Этот вызов, по-видимому, должен происходить в нужное время, в противном случае компоненты не будут отображаться для меня.)

3 голосов
/ 21 декабря 2010

Это может быть не тот ответ, который вы хотите услышать, но вам гораздо лучше избегать использования нулевой разметки и абсолютного позиционирования, так как это может быть неудобно для поддержки, и может сделать ваш GUI уродливым или непригодным, если он работает на ОС, отличная от той, на которой она была разработана. Большинство GUI, даже довольно сложных GUI, могут быть созданы с вложением JPanels, каждый из которых использует простой менеджер компоновки или запрещает GridBagLayout или MIgLayout (не является частью стандартной Java, но бесплатен, когда я последний раз использовал его, и довольно прост в использовании). Кроме того, если вы покажете нам изображение макета, который вы пытаетесь достичь, или достаточно подробно его опишите, мы поможем вам выбрать лучшие комбинации менеджера макетов, чтобы попробовать в первую очередь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...