Как добавить JButtons и JLabels без конфликтов?

Когда я пытаюсь добавить JButton и JLabel в JFrame, они оба конфликтуют друг с другом, в результате чего все JButtons исчезнут, и будет виден только JLabel. JLabel по какой-то причине перемещался в самую левую сторону JFrame вместо желаемого места, которое я установил. Я новичок в материалах, связанных с графическим интерфейсом, и я хочу учиться на этих ошибках.

Вот мой код:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class Windowb extends JFrame{
    static String title = "This is a JFrame";
    static int width = 500;
    static int height = 400;

    private static final int BUTTON_LOCATION_X = 46;
    private static final int BUTTON_LOCATION_Y = 80;

    public static void main(String[]args){
        Windowb simple = new Windowb(title, width, height);
        JPanel p = new JPanel(); 
        p.setLayout(null);
        JLabel c1 = new JLabel("Name: ");
        JButton b1 = new JButton("Name:");
        JButton b2 = new JButton("Grade:");
        JButton b3 = new JButton("GPA");
        b1.setBounds(BUTTON_LOCATION_X, BUTTON_LOCATION_Y, 90, 20);
        b2.setBounds(50, 170, 90, 20);
        b3.setBounds(50, 240, 90, 20);
        c1.setLocation(100, 250);

        b1.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                JOptionPane.showMessageDialog(null, "ActionListener is working!");
            }

        });


        b2.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
            JOptionPane.showMessageDialog(null, "The second one works too!");
            }
        });

        b3.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                JOptionPane.showMessageDialog(null, "Surprise!");
            }
        });
        p.add(b1); 
        p.add(b2); 
        p.add(b3);
        simple.add(p);
        simple.add(c1);
    }

    public Windowb(String t, int w, int h){
        setVisible(true);
        setResizable(true);
        setSize(w, h);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocation(500, 100);
        setTitle(t);
    }
}

person Dino Calandra    schedule 21.03.2015    source источник
comment
потому что каждая кнопка имеет одинаковое расположение в методе setBounds. проверьте свои b1,b2,b3 настройки. Также не пытайтесь использовать нулевой макет, вместо этого практикуйтесь с другим менеджером макетов, предоставляемым java. docs.oracle.com/javase/tutorial/uiswing/layout/using. html   -  person Vighanesh Gursale    schedule 21.03.2015
comment
все они имеют одинаковые местоположения x. но в разных местах. Единственное, что отображается, это Name: это JLabel. Jbuttons не отображаются.   -  person Dino Calandra    schedule 21.03.2015
comment
Прежде всего, что такое Windowb. Вы пытаетесь добавить компонент к этому объекту simple, который принадлежит Windowb. Пожалуйста, следуйте простому правилу добавления компонентов. Прочтите эти статьи docs.oracle.com/javase/tutorial/uiswing/ start/index.html   -  person Vighanesh Gursale    schedule 21.03.2015
comment
Проблема № 1. Вы используете нулевой макет, будьте готовы к бесконечному количеству проблем и проблем, из которых мы не поможем вам решить, потому что вы должны использовать соответствующие макеты, здесь нет причин не делать этого; Проблема № 2. Вы делаете окно отвратительным до того, как закончили создание основного пользовательского интерфейса. Обычно мы предлагаем использовать повторную проверку, чтобы исправить это, но это связано с API-интерфейсом макета, поэтому здесь это не сработает.   -  person MadProgrammer    schedule 21.03.2015
comment
хорошо, я установил макет в setLayout(new BorderLayout()), теперь появляются JButtons, но он по-прежнему не позволяет мне расположить JLabel в том месте, где я хочу.   -  person Dino Calandra    schedule 21.03.2015


Ответы (1)


Вероятно, вам следует использовать LayoutManager. См. учебник по диспетчеру компоновки: http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

setBounds() используется менеджером компоновки для позиционирования компонентов. Вы можете установить для LayoutManager значение null и расположить компоненты самостоятельно, но такие вещи, как изменение размера окна, не обрабатываются для вас таким образом (т.е. компоненты и пространство не масштабируются соответствующим образом). Если вы хотите сохранить здравомыслие, не используйте сборку в макете GridBag! Это сведет вас с ума! Для более сложных макетов используйте http://www.miglayout.com/ или http://www.jgoodies.com/freeware/libraries/forms/ . Для простых макетов используйте менеджеры макетов, такие как BorderLayout.

Если вы действительно не хотите использовать layoutmanager, используйте JPanel. JFrame может содержать только один компонент, так что это ваша проблема. Поместите JPanel внутрь JFrame и поместите свои компоненты в JPanel.

person Jasper Siepkes    schedule 21.03.2015