2016-03-19 12 views
1

comboBox yaptığım bir program hazırlıyorum ve ona bir actionlistener eklediğimde ona tıklarsam bir çerçeve görünecektir.Bu kodu kısa yoldan yazmanın bir yolu var mı?

Kodu:

Ben eğer neredeyse 16 örnek bir sürü kullanarak olacağını if-else bu durumda ben kullanan olacağını
String menulist [] = {"", "Array", "BubbleSort" ," - Selection Sort"," - Insertion Sort"," - Merge Sort","Recursion"," - Factorial"," - Anagramming"," - Towers of Hanoi","Stacks","Trees"," - Types of Trees","Binary Tree","Shell Sort","Quick Sort","Hash Table","Graphs"}; 
    final JComboBox SelectMenu = new JComboBox(menulist); 
    SelectMenu.setFont(new Font("Tahoma", Font.PLAIN, 17)); 

    SelectMenu.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      int list = SelectMenu.getSelectedIndex(); 



      if(list == 1){ 

       //Array 
       JFrame frameArray = new JFrame(); 
       frameArray.setBounds(100, 100, 830, 601); 
       frameArray.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       frameArray.getContentPane().setLayout(null); 
       frameArray.setVisible(true); 

       JLabel lblArray = new JLabel("Array"); 
       lblArray.setFont(new Font("Lucida Bright", Font.BOLD | Font.ITALIC, 25)); 
       lblArray.setBounds(368, 63, 122, 41); 
       frameArray.getContentPane().add(lblArray); 

       JLabel AnArrayIs = new JLabel(); 
       AnArrayIs.setBackground(Color.WHITE); 
       AnArrayIs.setText("An array is a systematic arrangement of similar objects, usually in rows and columns."); 
       AnArrayIs.setBounds(46, 103, 357, 432); 
       frameArray.getContentPane().add(AnArrayIs); 

. Çerçeve için daha kısa bir kod yazmanın bir yolu var mı? Öyleyse eğer 16 dizinine kadar devam edecektim?

Teşekkürler! (:

+2

[CardLayout Nasıl Kullanılır] (http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html) – MadProgrammer

cevap

1

Sen değişirken tek şey etikettir ve metin daha sonra bir yöntem şöyle yaparsanız: o zaman

 public Jframe getJframe(String label, String text){  
      JFrame frameArray = new JFrame(); 
      frameArray.setBounds(100, 100, 830, 601); 
      frameArray.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
      frameArray.getContentPane().setLayout(null); 
      frameArray.setVisible(true); 

      JLabel lblArray = new JLabel(label); 
      lblArray.setFont(new Font("Lucida Bright", Font.BOLD | Font.ITALIC, 25)); 
      lblArray.setBounds(368, 63, 122, 41); 
      frameArray.getContentPane().add(lblArray); 

      JLabel AnArrayIs = new JLabel(); 
      AnArrayIs.setBackground(Color.WHITE); 
      AnArrayIs.setText(text); 
      AnArrayIs.setBounds(46, 103, 357, 432); 
      frameArray.getContentPane().add(AnArrayIs); 
      return frameArray; 
      } 

senin ifadeleri veya switch deyimi sadece benzemeye varsa:

Jframe myJframe = null; 
if(list==1){ 
    myJframe = getJframe(menuList[1],"An array is.....") 
} else if(list ==2){ 
    myJframe = getJframe(menuList[2],"BubbleSort is ...") 
}.... 

sen gibi kolayca değiştirebilirsiniz yüzden muhtemelen tanımları için sabitler oluşturmak ediyorum:

public static final String ARRAY_DEFINITION = "An array is a ...."; 
1

Kodu daha az karmaşık hale getirmenin bir yolu, dizinlerin her birini işlemek için farklı JFrame alt sınıf oluşturmaktır. çerçeve, senin eğer açıklamada

public class ArrayFrame extends JFrame { 
    public ArrayFrame() { 
     setBounds(100, 100, 830, 601); 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     getContentPane().setLayout(null); 

     JLabel lbl = new JLabel("Array"); 
     lbl.setFont(new Font("Lucida Bright", Font.BOLD | Font.ITALIC, 25)); 
     lbl.setBounds(368, 63, 122, 41); 
     getContentPane().add(lbl); 

     JLabel detailLbl = new JLabel(); 
     detailLbl.setBackground(Color.WHITE); 
     detailLbl.setText("An array is..."); 
     detailLbl.setBounds(46, 103, 357, 432); 
     getContentPane().add(detailLbl); 
    } 
} 

ArrayFrame bir örneğini oluşturur ve açar:

if (list == 1) { 
    ArrayFrame frame = new ArrayFrame(); 
    frame.setVisible(true); 
} 

daha sürdürülebilir olduğunu

ilk endeks "Dizi" böylece yeni bir JFrame alt sınıfı oluşturmak olduğunu ve daha fazla detay anlamına gelen çok fazla ayrıntıyı gizler. Herkes OOP'ta soyutlamayı sever!

"Eh, yine de 16 sınıf oluşturmalıyım" diyorsunuz. Aslında sadece bir sınıf oluşturabilirsin!

public class MyFrame extends JFrame { 
    public MyFrame (String title, String details) { 
     setBounds(100, 100, 830, 601); 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     getContentPane().setLayout(null); 

     JLabel lbl = new JLabel(title); 
     lbl.setFont(new Font("Lucida Bright", Font.BOLD | Font.ITALIC, 25)); 
     lbl.setBounds(368, 63, 122, 41); 
     getContentPane().add(lbl); 

     JLabel detailLbl = new JLabel(); 
     detailLbl.setBackground(Color.WHITE); 
     detailLbl.setText(details); 
     detailLbl.setBounds(46, 103, 357, 432); 
     getContentPane().add(detailLbl); 
    } 
} 

Ve sadece böyle kurucuyu çağırarak bu çerçeve oluşturabilirsiniz:

if (list == 1) { 
    MyFrame frame = new MyFrame ("Array", "An array is..."); 
    frame.setVisible(true); 
} 

Ayrıca, anahtarını kullanarak düşünün yerine ifadeleri.

0

Bu durumda, -me'yi kullanıyorum, örneğin hemen hemen 16'sında çok kullanıyorum. Çerçeve için daha kısa bir kod yazmanın bir yolu var mı? Öyleyse eğer 16 dizinine kadar devam edecektim?

Bence en iyi seçeneğiniz, 16 if/else ifadesi yerine switch bildirimini kullanmaktır. Çok daha kolay olacak.

bu örneğe bakın Oracle Documentation

public class SwitchDemo { 
    public static void main(String[] args) { 

     int month = 8; 
     String monthString; 
     switch (month) { 
      case 1: monthString = "January"; 
        break; 
      case 2: monthString = "February"; 
        break; 
      case 3: monthString = "March"; 
        break; 
      case 4: monthString = "April"; 
        break; 
      case 5: monthString = "May"; 
        break; 
      case 6: monthString = "June"; 
        break; 
      case 7: monthString = "July"; 
        break; 
      case 8: monthString = "August"; 
        break; 
      case 9: monthString = "September"; 
        break; 
      case 10: monthString = "October"; 
        break; 
      case 11: monthString = "November"; 
        break; 
      case 12: monthString = "December"; 
        break; 
      default: monthString = "Invalid month"; 
        break; 
     } 
     System.out.println(monthString); 
    } 
}