2015-03-21 8 views
0

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

Вот мой код:

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); 
    } 
} 
+0

потому что каждая кнопка имеет такое же расположение в методе 'setBounds'. проверьте свои настройки b1, b2, b3'. Также не пытайтесь использовать нулевой макет, вместо этого продолжайте практику с другим менеджером макетов, предоставляемым java. https://docs.oracle.com/javase/tutorial/uiswing/layout/using.html –

+0

все они имеют одинаковые местоположения x. но разные местоположения. Единственное, что отображается, это «Имя:», которое является JLabel. Нет Jbuttons. –

+0

Первое, что такое 'Windowb'. Вы пытаетесь добавить компонент в этот 'простой' объект, который принадлежит' Windowb'. Следуйте простому правилу добавления компонентов. Пожалуйста, прочитайте эти статьи https://docs.oracle.com/javase/tutorial/uiswing/start/index.html –

ответ

2

Вы, вероятно, следует использовать 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/. Для простых макетов используйте layoutmanagers, например BorderLayout.

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

Смежные вопросы